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

Artifact 0b01cf5fb40589d9198f33c9ced1991ac628a2f8:


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 34 34 34  select.c,v 1.444
0200: 20 32 30 30 38 2f 30 37 2f 30 31 20 31 37 3a 33   2008/07/01 17:3
0210: 39 3a 32 37 20 64 61 6e 69 65 6c 6b 31 39 37 37  9:27 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 2f 2a 0a 2a 2a  ffset);.}../*.**
0410: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65   Initialize a Se
0420: 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
0430: 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
0440: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
0450: 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44  t(SelectDest *pD
0460: 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20  est, int eDest, 
0470: 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44  int iParm){.  pD
0480: 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 65 44 65  est->eDest = eDe
0490: 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 50 61  st;.  pDest->iPa
04a0: 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44  rm = iParm;.  pD
04b0: 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  est->affinity = 
04c0: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d  0;.  pDest->iMem
04d0: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e   = 0;.  pDest->n
04e0: 4d 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  Mem = 0;.}.../*.
04f0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
0500: 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  w Select structu
0510: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  re and return a 
0520: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a  pointer to that.
0530: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
0540: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
0550: 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72  SelectNew(.  Par
0560: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0570: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0580: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
0590: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
05a0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
05b0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
05c0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
05d0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
05e0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
05f0: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0600: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0610: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0620: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0630: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0640: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0650: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0660: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0670: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
0680: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
0690: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
06a0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
06b0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
06c0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
06d0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
06e0: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
06f0: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0700: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0710: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 45  s present */.  E
0720: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0730: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0740: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0750: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0760: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0770: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
0780: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0790: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
07a0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
07b0: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
07c0: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  in;.  sqlite3 *d
07d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
07e0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
07f0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
0800: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
0810: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4f 66  ;.  assert( !pOf
0820: 66 73 65 74 20 7c 7c 20 70 4c 69 6d 69 74 20 29  fset || pLimit )
0830: 3b 20 20 20 2f 2a 20 43 61 6e 27 74 20 68 61 76  ;   /* Can't hav
0840: 65 20 4f 46 46 53 45 54 20 77 69 74 68 6f 75 74  e OFFSET without
0850: 20 4c 49 4d 49 54 2e 20 2a 2f 0a 20 20 69 66 28   LIMIT. */.  if(
0860: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
0870: 70 4e 65 77 20 3d 20 26 73 74 61 6e 64 69 6e 3b  pNew = &standin;
0880: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77  .    memset(pNew
0890: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  , 0, sizeof(*pNe
08a0: 77 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  w));.  }.  if( p
08b0: 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  EList==0 ){.    
08c0: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
08d0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
08e0: 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65  Parse, 0, sqlite
08f0: 33 45 78 70 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c  3Expr(db,TK_ALL,
0900: 30 2c 30 2c 30 29 2c 20 30 29 3b 0a 20 20 7d 0a  0,0,0), 0);.  }.
0910: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
0920: 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d   pEList;.  pNew-
0930: 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
0940: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
0950: 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70  Where;.  pNew->p
0960: 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
0970: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  By;.  pNew->pHav
0980: 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20  ing = pHaving;. 
0990: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
09a0: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e  = pOrderBy;.  pN
09b0: 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d  ew->isDistinct =
09c0: 20 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70   isDistinct;.  p
09d0: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
09e0: 45 43 54 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ECT;.  assert( p
09f0: 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69  Offset==0 || pLi
0a00: 6d 69 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77  mit!=0 );.  pNew
0a10: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
0a20: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  t;.  pNew->pOffs
0a30: 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
0a40: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0a50: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
0a60: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a70: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
0a80: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
0a90: 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 4e  ] = -1;.  if( pN
0aa0: 65 77 3d 3d 26 73 74 61 6e 64 69 6e 29 20 7b 0a  ew==&standin) {.
0ab0: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
0ac0: 70 4e 65 77 29 3b 0a 20 20 20 20 70 4e 65 77 20  pNew);.    pNew 
0ad0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
0ae0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
0af0: 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76 65   Delete the give
0b00: 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  n Select structu
0b10: 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  re and all of it
0b20: 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73 2e  s substructures.
0b30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0b40: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 53 65 6c  SelectDelete(Sel
0b50: 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
0b60: 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c   ){.    clearSel
0b70: 65 63 74 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  ect(p);.    sqli
0b80: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
0b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
0ba0: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
0bb0: 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74 68  rs preceeding th
0bc0: 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20  e JOIN keyword, 
0bd0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a  determine the.**
0be0: 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20   type of join.  
0bf0: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
0c00: 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  r constant that 
0c10: 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74  expresses that t
0c20: 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20  ype.** in terms 
0c30: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0c40: 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a   bit values:.**.
0c50: 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a  **     JT_INNER.
0c60: 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a  **     JT_CROSS.
0c70: 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a  **     JT_OUTER.
0c80: 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41  **     JT_NATURA
0c90: 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54  L.**     JT_LEFT
0ca0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54  .**     JT_RIGHT
0cb0: 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75  .**.** A full ou
0cc0: 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20  ter join is the 
0cd0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a  combination of J
0ce0: 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49  T_LEFT and JT_RI
0cf0: 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  GHT..**.** If an
0d00: 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75   illegal or unsu
0d10: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
0d20: 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20  e is seen, then 
0d30: 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20  still return.** 
0d40: 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74  a join type, but
0d50: 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e   put an error in
0d60: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
0d70: 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
0d80: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61  lite3JoinType(Pa
0d90: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
0da0: 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70  en *pA, Token *p
0db0: 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20  B, Token *pC){. 
0dc0: 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
0dd0: 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c  0;.  Token *apAl
0de0: 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  l[3];.  Token *p
0df0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0e00: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
0e10: 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 77 6f 72  nst char zKeywor
0e20: 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20 6e 43 68  d[8];.    u8 nCh
0e30: 61 72 3b 0a 20 20 20 20 75 38 20 63 6f 64 65 3b  ar;.    u8 code;
0e40: 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20  .  } keywords[] 
0e50: 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61 74 75 72  = {.    { "natur
0e60: 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52  al", 7, JT_NATUR
0e70: 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66  AL },.    { "lef
0e80: 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46  t",    4, JT_LEF
0e90: 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  T|JT_OUTER },.  
0ea0: 20 20 7b 20 22 72 69 67 68 74 22 2c 20 20 20 35    { "right",   5
0eb0: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
0ec0: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75  TER },.    { "fu
0ed0: 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45  ll",    4, JT_LE
0ee0: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
0ef0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f  UTER },.    { "o
0f00: 75 74 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f  uter",   5, JT_O
0f10: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69  UTER },.    { "i
0f20: 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49  nner",   5, JT_I
0f30: 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63  NNER },.    { "c
0f40: 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49  ross",   5, JT_I
0f50: 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 7d 2c  NNER|JT_CROSS },
0f60: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
0f70: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
0f80: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
0f90: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
0fa0: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
0fb0: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
0fc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
0fd0: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
0fe0: 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b  (j=0; j<sizeof(k
0ff0: 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28  eywords)/sizeof(
1000: 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b  keywords[0]); j+
1010: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1020: 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >n==keywords[j].
1030: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1040: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
1050: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
1060: 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65   keywords[j].zKe
1070: 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20  yword, p->n)==0 
1080: 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74  ){.        joint
1090: 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73 5b  ype |= keywords[
10a0: 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20  j].code;.       
10b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
10c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
10d0: 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  =sizeof(keywords
10e0: 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  )/sizeof(keyword
10f0: 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 6a  s[0]) ){.      j
1100: 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52  ointype |= JT_ER
1110: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
1120: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1130: 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  (.     (jointype
1140: 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   & (JT_INNER|JT_
1150: 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e  OUTER))==(JT_INN
1160: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a  ER|JT_OUTER) ||.
1170: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1180: 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20   JT_ERROR)!=0.  
1190: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
11a0: 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 3b 0a 20  r *zSp1 = " ";. 
11b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11c0: 53 70 32 20 3d 20 22 20 22 3b 0a 20 20 20 20 69  Sp2 = " ";.    i
11d0: 66 28 20 70 42 3d 3d 30 20 29 7b 20 7a 53 70 31  f( pB==0 ){ zSp1
11e0: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 43  ++; }.    if( pC
11f0: 3d 3d 30 20 29 7b 20 7a 53 70 32 2b 2b 3b 20 7d  ==0 ){ zSp2++; }
1200: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1210: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
1220: 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f  known or unsuppo
1230: 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20  rted join type: 
1240: 22 0a 20 20 20 20 20 20 20 22 25 54 25 73 25 54  ".       "%T%s%T
1250: 25 73 25 54 22 2c 20 70 41 2c 20 7a 53 70 31 2c  %s%T", pA, zSp1,
1260: 20 70 42 2c 20 7a 53 70 32 2c 20 70 43 29 3b 0a   pB, zSp2, pC);.
1270: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1280: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
1290: 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20   if( jointype & 
12a0: 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20  JT_RIGHT ){.    
12b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12c0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
12d0: 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f  RIGHT and FULL O
12e0: 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e  UTER JOINs are n
12f0: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70  ot currently sup
1300: 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f  ported");.    jo
1310: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
1320: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
1330: 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  jointype;.}../*.
1340: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
1350: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
1360: 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74  in a table.  Ret
1370: 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f  urn -1 if the co
1380: 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  lumn.** is not c
1390: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
13a0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
13b0: 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   int columnIndex
13c0: 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f  (Table *pTab, co
13d0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b  nst char *zCol){
13e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
13f0: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
1400: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
1410: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1420: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
1430: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20  ame, zCol)==0 ) 
1440: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
1450: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
1460: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
1470: 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f 20  e of a token to 
1480: 61 20 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e 61  a '\000'-termina
1490: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  ted string..*/.s
14a0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 54 6f  tatic void setTo
14b0: 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f  ken(Token *p, co
14c0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
14d0: 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a 20  p->z = (u8*)z;. 
14e0: 20 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73 74 72 6c   p->n = z ? strl
14f0: 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 70 2d 3e  en(z) : 0;.  p->
1500: 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  dyn = 0;.}../*.*
1510: 2a 20 53 65 74 20 74 68 65 20 74 6f 6b 65 6e 20  * Set the token 
1520: 74 6f 20 74 68 65 20 64 6f 75 62 6c 65 2d 71 75  to the double-qu
1530: 6f 74 65 64 20 61 6e 64 20 65 73 63 61 70 65 64  oted and escaped
1540: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
1550: 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 0a 2a  string pointed.*
1560: 2a 20 74 6f 20 62 79 20 7a 2e 20 46 6f 72 20 65  * to by z. For e
1570: 78 61 6d 70 6c 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  xample;.**.**   
1580: 20 7b 61 22 62 63 7d 20 20 2d 3e 20 20 7b 22 61   {a"bc}  ->  {"a
1590: 22 22 62 63 22 7d 0a 2a 2f 0a 73 74 61 74 69 63  ""bc"}.*/.static
15a0: 20 76 6f 69 64 20 73 65 74 51 75 6f 74 65 64 54   void setQuotedT
15b0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
15c0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f  se, Token *p, co
15d0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 0a 20  nst char *z){.. 
15e0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
15f0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73   string contains
1600: 20 61 6e 79 20 22 20 63 68 61 72 61 63 74 65 72   any " character
1610: 73 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74  s. If it does, t
1620: 68 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 75  hen.  ** this fu
1630: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6d 61 6c 6c  nction will mall
1640: 6f 63 20 73 70 61 63 65 20 74 6f 20 63 72 65 61  oc space to crea
1650: 74 65 20 61 20 71 75 6f 74 65 64 20 76 65 72 73  te a quoted vers
1660: 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ion of.  ** the 
1670: 73 74 72 69 6e 67 20 69 6e 2e 20 4f 74 68 65 72  string in. Other
1680: 77 69 73 65 2c 20 73 61 76 65 20 61 20 63 61 6c  wise, save a cal
1690: 6c 20 74 6f 20 73 71 6c 69 74 65 33 4d 50 72 69  l to sqlite3MPri
16a0: 6e 74 66 28 29 20 62 79 0a 20 20 2a 2a 20 6a 75  ntf() by.  ** ju
16b0: 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70  st copying the p
16c0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74  ointer to the st
16d0: 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e  ring..  */.  con
16e0: 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b  st char *z2 = z;
16f0: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b  .  while( *z2 ){
1700: 0a 20 20 20 20 69 66 28 20 2a 7a 32 3d 3d 27 22  .    if( *z2=='"
1710: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a  ' ) break;.    z
1720: 32 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  2++;.  }..  if( 
1730: 2a 7a 32 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74  *z2 ){.    /* St
1740: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 22 20  ring contains " 
1750: 63 68 61 72 61 63 74 65 72 73 20 2d 20 63 6f 70  characters - cop
1760: 79 20 61 6e 64 20 71 75 6f 74 65 20 74 68 65 20  y and quote the 
1770: 73 74 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 70  string. */.    p
1780: 2d 3e 7a 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  ->z = (u8 *)sqli
1790: 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
17a0: 65 2d 3e 64 62 2c 20 22 5c 22 25 77 5c 22 22 2c  e->db, "\"%w\"",
17b0: 20 7a 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   z);.    if( p->
17c0: 7a 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 20  z ){.      p->n 
17d0: 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a  = strlen((char *
17e0: 29 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 2d  )p->z);.      p-
17f0: 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  >dyn = 1;.    }.
1800: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1810: 53 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20  String contains 
1820: 6e 6f 20 22 20 63 68 61 72 61 63 74 65 72 73 20  no " characters 
1830: 2d 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74  - copy the point
1840: 65 72 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 7a 20  er. */.    p->z 
1850: 3d 20 28 75 38 2a 29 7a 3b 0a 20 20 20 20 70 2d  = (u8*)z;.    p-
1860: 3e 6e 20 3d 20 28 7a 32 20 2d 20 7a 29 3b 0a 20  >n = (z2 - z);. 
1870: 20 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 20     p->dyn = 0;. 
1880: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
1890: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
18a0: 20 6e 6f 64 65 20 66 6f 72 20 61 6e 20 69 64 65   node for an ide
18b0: 6e 74 69 66 69 65 72 20 77 69 74 68 20 74 68 65  ntifier with the
18c0: 20 6e 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a   name of zName.*
18d0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 43  /.Expr *sqlite3C
18e0: 72 65 61 74 65 49 64 45 78 70 72 28 50 61 72 73  reateIdExpr(Pars
18f0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1900: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
1910: 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20   Token dummy;.  
1920: 73 65 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c  setToken(&dummy,
1930: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
1940: 6e 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  n sqlite3PExpr(p
1950: 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c  Parse, TK_ID, 0,
1960: 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a   0, &dummy);.}..
1970: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d  /*.** Add a term
1980: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 65 78   to the WHERE ex
1990: 70 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45  pression in *ppE
19a0: 78 70 72 20 74 68 61 74 20 72 65 71 75 69 72 65  xpr that require
19b0: 73 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f  s the.** zCol co
19c0: 6c 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c  lumn to be equal
19d0: 20 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c   in the two tabl
19e0: 65 73 20 70 54 61 62 31 20 61 6e 64 20 70 54 61  es pTab1 and pTa
19f0: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
1a00: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
1a10: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1a20: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
1a30: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1a40: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1a50: 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  zCol,        /* 
1a60: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
1a70: 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61  mn */.  const Ta
1a80: 62 6c 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20  ble *pTab1,     
1a90: 20 2f 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20   /* First table 
1aa0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1ab0: 2a 7a 41 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a  *zAlias1,     /*
1ac0: 20 41 6c 69 61 73 20 66 6f 72 20 66 69 72 73 74   Alias for first
1ad0: 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20   table.  May be 
1ae0: 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  NULL */.  const 
1af0: 54 61 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20  Table *pTab2,   
1b00: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62     /* Second tab
1b10: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
1b20: 61 72 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20  ar *zAlias2,    
1b30: 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 73 65   /* Alias for se
1b40: 63 6f 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61 79  cond table.  May
1b50: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
1b60: 74 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  t iRightJoinTabl
1b70: 65 2c 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63  e,     /* VDBE c
1b80: 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 72 69  ursor for the ri
1b90: 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  ght table */.  E
1ba0: 78 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20  xpr **ppExpr,   
1bb0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1bc0: 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  he equality term
1bd0: 20 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73   to this express
1be0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ion */.  int isO
1bf0: 75 74 65 72 4a 6f 69 6e 20 20 20 20 20 20 20 20  uterJoin        
1c00: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 64 65 61    /* True if dea
1c10: 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 4f 55 54  ling with an OUT
1c20: 45 52 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20  ER join */.){.  
1c30: 45 78 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31  Expr *pE1a, *pE1
1c40: 62 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72  b, *pE1c;.  Expr
1c50: 20 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a   *pE2a, *pE2b, *
1c60: 70 45 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45  pE2c;.  Expr *pE
1c70: 3b 0a 0a 20 20 70 45 31 61 20 3d 20 73 71 6c 69  ;..  pE1a = sqli
1c80: 74 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28  te3CreateIdExpr(
1c90: 70 50 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20  pParse, zCol);. 
1ca0: 20 70 45 32 61 20 3d 20 73 71 6c 69 74 65 33 43   pE2a = sqlite3C
1cb0: 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72  reateIdExpr(pPar
1cc0: 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 69 66 28  se, zCol);.  if(
1cd0: 20 7a 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20   zAlias1==0 ){. 
1ce0: 20 20 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61     zAlias1 = pTa
1cf0: 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  b1->zName;.  }. 
1d00: 20 70 45 31 62 20 3d 20 73 71 6c 69 74 65 33 43   pE1b = sqlite3C
1d10: 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72  reateIdExpr(pPar
1d20: 73 65 2c 20 7a 41 6c 69 61 73 31 29 3b 0a 20 20  se, zAlias1);.  
1d30: 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29  if( zAlias2==0 )
1d40: 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32 20 3d 20  {.    zAlias2 = 
1d50: 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTab2->zName;.  
1d60: 7d 0a 20 20 70 45 32 62 20 3d 20 73 71 6c 69 74  }.  pE2b = sqlit
1d70: 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70  e3CreateIdExpr(p
1d80: 50 61 72 73 65 2c 20 7a 41 6c 69 61 73 32 29 3b  Parse, zAlias2);
1d90: 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69 74 65  .  pE1c = sqlite
1da0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1db0: 4b 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31  K_DOT, pE1b, pE1
1dc0: 61 2c 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20  a, 0);.  pE2c = 
1dd0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
1de0: 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 32  rse, TK_DOT, pE2
1df0: 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70  b, pE2a, 0);.  p
1e00: 45 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  E = sqlite3PExpr
1e10: 28 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20  (pParse, TK_EQ, 
1e20: 70 45 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a  pE1c, pE2c, 0);.
1e30: 20 20 69 66 28 20 70 45 20 26 26 20 69 73 4f 75    if( pE && isOu
1e40: 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45  terJoin ){.    E
1e50: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1e60: 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  E, EP_FromJoin);
1e70: 0a 20 20 20 20 70 45 2d 3e 69 52 69 67 68 74 4a  .    pE->iRightJ
1e80: 6f 69 6e 54 61 62 6c 65 20 3d 20 69 52 69 67 68  oinTable = iRigh
1e90: 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a  tJoinTable;.  }.
1ea0: 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69    *ppExpr = sqli
1eb0: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
1ec0: 65 2d 3e 64 62 2c 2a 70 70 45 78 70 72 2c 20 70  e->db,*ppExpr, p
1ed0: 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  E);.}../*.** Set
1ee0: 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   the EP_FromJoin
1ef0: 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c   property on all
1f00: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69   terms of the gi
1f10: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ven expression..
1f20: 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45  ** And set the E
1f30: 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
1f40: 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f  ble to iTable fo
1f50: 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  r every term in 
1f60: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
1f70: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f  n..**.** The EP_
1f80: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
1f90: 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72  y is used on ter
1fa0: 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  ms of an express
1fb0: 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74  ion to tell.** t
1fc0: 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  he LEFT OUTER JO
1fd0: 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  IN processing lo
1fe0: 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65  gic that this te
1ff0: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  rm is part of th
2000: 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69  e.** join restri
2010: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
2020: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2030: 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  NG clause and no
2040: 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  t a part.** of t
2050: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
2060: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54  WHERE clause.  T
2070: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d  hese terms are m
2080: 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65  oved over to the
2090: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
20a0: 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f   during join pro
20b0: 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e  cessing but we n
20c0: 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
20d0: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69  that they.** ori
20e0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
20f0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2100: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70  e..**.** The Exp
2110: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
2120: 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52  e tells the WHER
2130: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
2140: 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ing that the.** 
2150: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e  expression depen
2160: 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67  ds on table iRig
2170: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e  htJoinTable even
2180: 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69   if that table i
2190: 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69  s not.** explici
21a0: 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  tly mentioned in
21b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
21c0: 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69    That informati
21d0: 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20  on is needed.** 
21e0: 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74  for cases like t
21f0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
2200: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
2210: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
2220: 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e  1.a=t2.b AND t1.
2230: 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68  x=5.**.** The wh
2240: 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73  ere clause needs
2250: 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61   to defer the ha
2260: 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31  ndling of the t1
2270: 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74  .x=5.** term unt
2280: 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20  il after the t2 
2290: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e  loop of the join
22a0: 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  .  In that way, 
22b0: 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77  a.** NULL t2 row
22c0: 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
22d0: 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21  d whenever t1.x!
22e0: 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f  =5.  If we do no
22f0: 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68  t.** defer the h
2300: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d  andling of t1.x=
2310: 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72  5, it will be pr
2320: 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74  ocessed immediat
2330: 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65  ely.** after the
2340: 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77   t1 loop and row
2350: 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77  s with t1.x!=5 w
2360: 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72  ill never appear
2370: 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75   in.** the outpu
2380: 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f  t, which is inco
2390: 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
23a0: 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70   void setJoinExp
23b0: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  r(Expr *p, int i
23c0: 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28  Table){.  while(
23d0: 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65   p ){.    ExprSe
23e0: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
23f0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70  FromJoin);.    p
2400: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2410: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
2420: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70  setJoinExpr(p->p
2430: 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Left, iTable);. 
2440: 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74     p = p->pRight
2450: 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ;.  } .}../*.** 
2460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f  This routine pro
2470: 63 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20  cesses the join 
2480: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
2490: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
24a0: 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53  nt..** ON and US
24b0: 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20  ING clauses are 
24c0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65  converted into e
24d0: 78 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68  xtra terms of th
24e0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
24f0: 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73  ** NATURAL joins
2500: 20 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74   also create ext
2510: 72 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ra WHERE clause 
2520: 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  terms..**.** The
2530: 20 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d   terms of a FROM
2540: 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74   clause are cont
2550: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c  ained in the Sel
2560: 65 63 74 2e 70 53 72 63 20 73 74 72 75 63 74 75  ect.pSrc structu
2570: 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20  re..** The left 
2580: 6d 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74 68  most table is th
2590: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
25a0: 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54   Select.pSrc.  T
25b0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a  he right-most.**
25c0: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61   table is the la
25d0: 73 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a  st entry.  The j
25e0: 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20  oin operator is 
25f0: 68 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72  held in the entr
2600: 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74  y to.** the left
2610: 2e 20 20 54 68 75 73 20 65 6e 74 72 79 20 30 20  .  Thus entry 0 
2620: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69  contains the joi
2630: 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74  n operator for t
2640: 68 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a  he join between.
2650: 2a 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64  ** entries 0 and
2660: 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55   1.  Any ON or U
2670: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73  SING clauses ass
2680: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2690: 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73   join are.** als
26a0: 6f 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  o attached to th
26b0: 65 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a  e left entry..**
26c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
26d0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
26e0: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
26f0: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74  countered..*/.st
2700: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50  atic int sqliteP
2710: 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65  rocessJoin(Parse
2720: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
2730: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
2740: 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20  *pSrc;          
2750: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74          /* All t
2760: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2770: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  M clause */.  in
2780: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27a0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
27b0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
27c0: 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20  st_item *pLeft; 
27d0: 20 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c      /* Left tabl
27e0: 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a  e being joined *
27f0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
2800: 73 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b  st_item *pRight;
2810: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62      /* Right tab
2820: 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20  le being joined 
2830: 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e  */..  pSrc = p->
2840: 70 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20  pSrc;.  pLeft = 
2850: 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70  &pSrc->a[0];.  p
2860: 52 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31  Right = &pLeft[1
2870: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
2880: 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b  pSrc->nSrc-1; i+
2890: 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65  +, pRight++, pLe
28a0: 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  ft++){.    Table
28b0: 20 2a 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65   *pLeftTab = pLe
28c0: 66 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61  ft->pTab;.    Ta
28d0: 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d  ble *pRightTab =
28e0: 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20   pRight->pTab;. 
28f0: 20 20 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a     int isOuter;.
2900: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 54 61  .    if( pLeftTa
2910: 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61  b==0 || pRightTa
2920: 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
2930: 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28  .    isOuter = (
2940: 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65  pRight->jointype
2950: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b   & JT_OUTER)!=0;
2960: 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68  ..    /* When th
2970: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
2980: 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64  d is present, ad
2990: 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  d WHERE clause t
29a0: 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erms for.    ** 
29b0: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61  every column tha
29c0: 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  t the two tables
29d0: 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e   have in common.
29e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29f0: 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65  pRight->jointype
2a00: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b   & JT_NATURAL ){
2a10: 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68  .      if( pRigh
2a20: 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74  t->pOn || pRight
2a30: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
2a40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2a50: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e  Msg(pParse, "a N
2a60: 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20  ATURAL join may 
2a70: 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20 20  not have ".     
2a80: 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20        "an ON or 
2a90: 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30  USING clause", 0
2aa0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2ab0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
2ac0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
2ad0: 65 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  eftTab->nCol; j+
2ae0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
2af0: 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54   *zName = pLeftT
2b00: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
2b10: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  e;.        if( c
2b20: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68  olumnIndex(pRigh
2b30: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  tTab, zName)>=0 
2b40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
2b50: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
2b60: 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61  , zName, pLeftTa
2b70: 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73  b, pLeft->zAlias
2b80: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 70 52 69 67 68 74 54 61 62 2c 20 70 52 69 67   pRightTab, pRig
2bb0: 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20  ht->zAlias,.    
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
2be0: 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70  ->iCursor, &p->p
2bf0: 57 68 65 72 65 2c 20 69 73 4f 75 74 65 72 29 3b  Where, isOuter);
2c00: 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  .          .    
2c10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61    }..    /* Disa
2c30: 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64  llow both ON and
2c40: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69   USING clauses i
2c50: 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a  n the same join.
2c60: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2c70: 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52  Right->pOn && pR
2c80: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
2c90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2ca0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
2cb0: 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20  annot have both 
2cc0: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20  ON and USING ". 
2cd0: 20 20 20 20 20 20 20 22 63 6c 61 75 73 65 73 20         "clauses 
2ce0: 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e  in the same join
2cf0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
2d00: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
2d10: 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61  * Add the ON cla
2d20: 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  use to the end o
2d30: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2d40: 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  se, connected by
2d50: 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f  .    ** an AND o
2d60: 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a  perator..    */.
2d70: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
2d80: 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  pOn ){.      if(
2d90: 20 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f   isOuter ) setJo
2da0: 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70  inExpr(pRight->p
2db0: 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72  On, pRight->iCur
2dc0: 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  sor);.      p->p
2dd0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
2de0: 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
2df0: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52  b, p->pWhere, pR
2e00: 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  ight->pOn);.    
2e10: 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20    pRight->pOn = 
2e20: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
2e30: 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65   Create extra te
2e40: 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45  rms on the WHERE
2e50: 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68   clause for each
2e60: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20   column named.  
2e70: 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e    ** in the USIN
2e80: 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70  G clause.  Examp
2e90: 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74  le: If the two t
2ea0: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
2eb0: 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41  ed are .    ** A
2ec0: 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55   and B and the U
2ed0: 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65  SING clause name
2ee0: 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74  s X, Y, and Z, t
2ef0: 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20  hen add this.   
2f00: 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45   ** to the WHERE
2f10: 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d   clause:    A.X=
2f20: 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20  B.X AND A.Y=B.Y 
2f30: 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20  AND A.Z=B.Z.    
2f40: 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  ** Report an err
2f50: 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  or if any column
2f60: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
2f70: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69  e USING clause i
2f80: 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e  s.    ** not con
2f90: 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74  tained in both t
2fa0: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
2fb0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
2fc0: 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e  f( pRight->pUsin
2fd0: 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73  g ){.      IdLis
2fe0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68  t *pList = pRigh
2ff0: 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20  t->pUsing;.     
3000: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73   for(j=0; j<pLis
3010: 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20  t->nId; j++){.  
3020: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
3030: 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  e = pList->a[j].
3040: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
3050: 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  f( columnIndex(p
3060: 4c 65 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c  LeftTab, zName)<
3070: 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  0 || columnIndex
3080: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
3090: 65 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e)<0 ){.        
30a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
30b0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
30c0: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
30d0: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
30e0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
30f0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
3100: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
3110: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
3120: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
3130: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
3140: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a  reTerm(pParse, z
3150: 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20  Name, pLeftTab, 
3160: 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a  pLeft->zAlias, .
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
3190: 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a  htTab, pRight->z
31a0: 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20  Alias,.         
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c0: 20 20 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73     pRight->iCurs
31d0: 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 2c 20  or, &p->pWhere, 
31e0: 69 73 4f 75 74 65 72 29 3b 0a 20 20 20 20 20 20  isOuter);.      
31f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
3200: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
3210: 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74   Insert code int
3220: 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20  o "v" that will 
3230: 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20  push the record 
3240: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
3250: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20  e.** stack into 
3260: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73  the sorter..*/.s
3270: 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f  tatic void pushO
3280: 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61 72  ntoSorter(.  Par
3290: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
32a0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
32b0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
32c0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
32d0: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
32e0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65  Y clause */.  Se
32f0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
3300: 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
3310: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3320: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  nt */.  int regD
3330: 61 74 61 20 20 20 20 20 20 20 20 20 20 20 20 2f  ata            /
3340: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
3350: 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f  ng data to be so
3360: 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  rted */.){.  Vdb
3370: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
3380: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6e 45 78 70  Vdbe;.  int nExp
3390: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  r = pOrderBy->nE
33a0: 78 70 72 3b 0a 20 20 69 6e 74 20 72 65 67 42 61  xpr;.  int regBa
33b0: 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
33c0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
33d0: 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69 6e 74   nExpr+2);.  int
33e0: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
33f0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
3400: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
3410: 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
3420: 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
3430: 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b  By, regBase, 0);
3440: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3450: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
3460: 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  nce, pOrderBy->i
3470: 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65  ECursor, regBase
3480: 2b 6e 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74  +nExpr);.  sqlit
3490: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
34a0: 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20  Parse, regData, 
34b0: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 31 2c  regBase+nExpr+1,
34c0: 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   1);.  sqlite3Vd
34d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
34e0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
34f0: 73 65 2c 20 6e 45 78 70 72 20 2b 20 32 2c 20 72  se, nExpr + 2, r
3500: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
3510: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3520: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
3530: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
3540: 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  or, regRecord);.
3550: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
3560: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
3570: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
3580: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
3590: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
35a0: 67 42 61 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b  gBase, nExpr+2);
35b0: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
35c0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e  iLimit ){.    in
35d0: 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a  t addr1, addr2;.
35e0: 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a      int iLimit;.
35f0: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d      if( pSelect-
3600: 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >iOffset ){.    
3610: 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65    iLimit = pSele
3620: 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20  ct->iOffset+1;. 
3630: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3640: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
3650: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a  ->iLimit;.    }.
3660: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
3670: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
3680: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d   OP_IfZero, iLim
3690: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
36a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
36b0: 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c  _AddImm, iLimit,
36c0: 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20   -1);.    addr2 
36d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
36e0: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
36f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3700: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
3710: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
3720: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
3730: 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e  Last, pOrderBy->
3740: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  iECursor);.    s
3750: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
3760: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70  (v, OP_Delete, p
3770: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
3780: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
3790: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
37a0: 64 64 72 32 29 3b 0a 20 20 20 20 70 53 65 6c 65  ddr2);.    pSele
37b0: 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ct->iLimit = 0;.
37c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
37d0: 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65   code to impleme
37e0: 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f  nt the OFFSET.*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
3800: 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20  eOffset(.  Vdbe 
3810: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *v,          /* 
3820: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
3830: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
3840: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
3850: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
3860: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
3870: 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
3880: 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20  Continue     /* 
3890: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
38a0: 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  p the current re
38b0: 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  cord */.){.  if(
38c0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 26 26 20 69   p->iOffset && i
38d0: 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20  Continue!=0 ){. 
38e0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
38f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3900: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
3910: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 2d 31 29   p->iOffset, -1)
3920: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
3930: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3940: 2c 20 4f 50 5f 49 66 4e 65 67 2c 20 70 2d 3e 69  , OP_IfNeg, p->i
3950: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c  Offset);.    sql
3960: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3970: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43  , OP_Goto, 0, iC
3980: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64  ontinue);.    Vd
3990: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
39a0: 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72  kip OFFSET recor
39b0: 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ds"));.    sqlit
39c0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
39d0: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
39e0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
39f0: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
3a00: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
3a10: 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  N registers star
3a20: 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20  ting at iMem.** 
3a30: 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20  form a distinct 
3a40: 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20  entry.  iTab is 
3a50: 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
3a60: 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69  that holds previ
3a70: 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f  ously.** seen co
3a80: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68  mbinations of th
3a90: 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e  e N values.  A n
3aa0: 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  ew entry is made
3ab0: 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74   in iTab.** if t
3ac0: 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c  he current N val
3ad0: 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a  ues are new..**.
3ae0: 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64  ** A jump to add
3af0: 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20  rRepeat is made 
3b00: 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75  and the N+1 valu
3b10: 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72  es are popped fr
3b20: 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  om the.** stack 
3b30: 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  if the top N ele
3b40: 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69  ments are not di
3b50: 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  stinct..*/.stati
3b60: 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69  c void codeDisti
3b70: 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nct(.  Parse *pP
3b80: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
3b90: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
3ba0: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
3bb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
3bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
3bd0: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
3be0: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
3bf0: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
3c00: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
3c10: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
3c20: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
3c30: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
3c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3c50: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
3c60: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20  */.  int iMem   
3c70: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
3c80: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
3c90: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
3ca0: 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  r1;..  v = pPars
3cb0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d  e->pVdbe;.  r1 =
3cc0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
3cd0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
3ce0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
3cf0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3d00: 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a  , iMem, N, r1);.
3d10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3d20: 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Op3(v, OP_Found,
3d30: 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61   iTab, addrRepea
3d40: 74 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  t, r1);.  sqlite
3d50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3d60: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
3d70: 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  b, r1);.  sqlite
3d80: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
3d90: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
3da0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
3db0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
3dc0: 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73  when a SELECT is
3dd0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 73   used within a s
3de0: 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  ubexpression.** 
3df0: 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e  (example:  "a IN
3e00: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
3e10: 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74 20  table)") but it 
3e20: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20  has more than 1 
3e30: 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  result.** column
3e40: 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e  .  We do this in
3e50: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65   a subroutine be
3e60: 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72 20  cause the error 
3e70: 6f 63 63 75 72 73 20 69 6e 20 6d 75 6c 74 69 70  occurs in multip
3e80: 6c 65 0a 2a 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f  le.** places..*/
3e90: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
3ea0: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
3eb0: 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61  electError(.  Pa
3ec0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3ed0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
3ee0: 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ext. */.  Select
3ef0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f  Dest *pDest,   /
3f00: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66  * Destination of
3f10: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
3f20: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20  */.  int nExpr  
3f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3f40: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
3f50: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
3f60: 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  y SELECT */.){. 
3f70: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
3f80: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28  st->eDest;.  if(
3f90: 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65   nExpr>1 && (eDe
3fa0: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
3fb0: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29  Dest==SRT_Set) )
3fc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
3fd0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
3fe0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
3ff0: 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
4000: 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
4010: 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
4020: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
4030: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
4040: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
4050: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
4060: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4070: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
4080: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
4090: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
40a0: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
40b0: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ELECT..**.** If 
40c0: 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75  srcTab and nColu
40d0: 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f  mn are both zero
40e0: 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73  , then the pELis
40f0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
4100: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
4110: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
4120: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
4130: 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d   row.  If nColum
4140: 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61  n>0.** then data
4150: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
4160: 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73  srcTab and pELis
4170: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  t is used only t
4180: 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74  o get the.** dat
4190: 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68 20  atypes for each 
41a0: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
41b0: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e  c void selectInn
41c0: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
41d0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
41e0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
41f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
4200: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
4210: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
4220: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
4230: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
4240: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
4250: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
4260: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
4270: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
4280: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
4290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
42a0: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
42b0: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
42c0: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
42d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
42e0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
42f0: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
4300: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4310: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
4320: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f   If not NULL, so
4330: 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67  rt results using
4340: 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69   this key */.  i
4350: 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20  nt distinct,    
4360: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30         /* If >=0
4370: 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75  , make sure resu
4380: 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74  lts are distinct
4390: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
43a0: 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a   *pDest,      /*
43b0: 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
43c0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
43d0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
43e0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  e,          /* J
43f0: 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
4400: 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72  inue with next r
4410: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ow */.  int iBre
4420: 61 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ak,             
4430: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
4440: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
4450: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20   inner loop */. 
4460: 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
4470: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 66 66 69           /* affi
4480: 6e 69 74 79 20 73 74 72 69 6e 67 20 69 66 20 65  nity string if e
4490: 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f  Dest is SRT_Unio
44a0: 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  n */.){.  Vdbe *
44b0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
44c0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
44d0: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
44e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
44f0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
4500: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
4510: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73   */.  int regRes
4520: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ult;            
4530: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65    /* Start of me
4540: 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73  mory holding res
4550: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  ult set */.  int
4560: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
4570: 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20  eDest;   /* How 
4580: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65  to dispose of re
4590: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
45a0: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50  Parm = pDest->iP
45b0: 61 72 6d 3b 20 20 20 2f 2a 20 46 69 72 73 74 20  arm;   /* First 
45c0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70  argument to disp
45d0: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
45e0: 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b   int nResultCol;
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4600: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
4610: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 69   columns */..  i
4620: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
4630: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
4640: 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  st!=0 );..  /* I
4650: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 4c 49  f there was a LI
4660: 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  MIT clause on th
4670: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
4680: 6e 74 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  nt, then do the 
4690: 63 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65  check.  ** to se
46a0: 65 20 69 66 20 74 68 69 73 20 72 6f 77 20 73 68  e if this row sh
46b0: 6f 75 6c 64 20 62 65 20 6f 75 74 70 75 74 2e 0a  ould be output..
46c0: 20 20 2a 2f 0a 20 20 68 61 73 44 69 73 74 69 6e    */.  hasDistin
46d0: 63 74 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30  ct = distinct>=0
46e0: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
46f0: 72 3e 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  r>0;.  if( pOrde
4700: 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73 44 69  rBy==0 && !hasDi
4710: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f  stinct ){.    co
4720: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69  deOffset(v, p, i
4730: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a  Continue);.  }..
4740: 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65    /* Pull the re
4750: 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e  quested columns.
4760: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c  .  */.  if( nCol
4770: 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 6e 52 65  umn>0 ){.    nRe
4780: 73 75 6c 74 43 6f 6c 20 3d 20 6e 43 6f 6c 75 6d  sultCol = nColum
4790: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
47a0: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c  nResultCol = pEL
47b0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  ist->nExpr;.  }.
47c0: 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d 65    if( pDest->iMe
47d0: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 65 73  m==0 ){.    pDes
47e0: 74 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  t->iMem = pParse
47f0: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 44  ->nMem+1;.    pD
4800: 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 6e 52 65 73  est->nMem = nRes
4810: 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 70 50 61 72  ultCol;.    pPar
4820: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73  se->nMem += nRes
4830: 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20  ultCol;.  }else 
4840: 69 66 28 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 21  if( pDest->nMem!
4850: 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 7b 0a 20  =nResultCol ){. 
4860: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
4870: 6e 73 20 77 68 65 6e 20 74 77 6f 20 53 45 4c 45  ns when two SELE
4880: 43 54 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  CTs of a compoun
4890: 64 20 53 45 4c 45 43 54 20 68 61 76 65 20 64 69  d SELECT have di
48a0: 66 66 65 72 69 6e 67 0a 20 20 20 20 2a 2a 20 6e  ffering.    ** n
48b0: 75 6d 62 65 72 73 20 6f 66 20 72 65 73 75 6c 74  umbers of result
48c0: 20 63 6f 6c 75 6d 6e 73 2e 20 20 54 68 65 20 65   columns.  The e
48d0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c  rror message wil
48e0: 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 62  l be generated b
48f0: 79 0a 20 20 20 20 2a 2a 20 61 20 68 69 67 68 65  y.    ** a highe
4900: 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 2e  r-level routine.
4910: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
4920: 20 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20    }.  regResult 
4930: 3d 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20  = pDest->iMem;. 
4940: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
4950: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
4960: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
4970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4980: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
4990: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c  lumn, srcTab, i,
49a0: 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20   regResult+i);. 
49b0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
49c0: 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73   eDest!=SRT_Exis
49d0: 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ts ){.    /* If 
49e0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
49f0: 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e  is an EXISTS(...
4a00: 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  ) expression, th
4a10: 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20  e actual.    ** 
4a20: 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20  values returned 
4a30: 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  by the SELECT ar
4a40: 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  e not required..
4a50: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
4a60: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
4a70: 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  st(pParse, pELis
4a80: 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 65 44  t, regResult, eD
4a90: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
4aa0: 6b 29 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d  k);.  }.  nColum
4ab0: 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  n = nResultCol;.
4ac0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
4ad0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
4ae0: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
4af0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4b00: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
4b10: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
4b20: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
4b30: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
4b40: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
4b50: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
4b60: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
4b70: 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nct ){.    asser
4b80: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
4b90: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
4ba0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75  st->nExpr==nColu
4bb0: 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44 69  mn );.    codeDi
4bc0: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 64  stinct(pParse, d
4bd0: 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e  istinct, iContin
4be0: 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ue, nColumn, reg
4bf0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 69 66 28  Result);.    if(
4c00: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
4c10: 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74        codeOffset
4c20: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
4c30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
4c40: 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74  if( checkForMult
4c50: 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72  iColumnSelectErr
4c60: 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  or(pParse, pDest
4c70: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
4c80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
4c90: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
4ca0: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
4cb0: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
4cc0: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
4cd0: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
4ce0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
4cf0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
4d00: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
4d10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4d20: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
4d30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
4d40: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
4d50: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
4d60: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
4d70: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
4d80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4d90: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4da0: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
4db0: 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20  Column, r1);.   
4dc0: 20 20 20 69 66 28 20 61 66 66 20 29 7b 0a 20 20     if( aff ){.  
4dd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4de0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
4df0: 20 61 66 66 2c 20 50 34 5f 53 54 41 54 49 43 29   aff, P4_STATIC)
4e00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4e10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4e20: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
4e30: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
4e40: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
4e50: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
4e60: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
4e70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
4e80: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
4e90: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
4ea0: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
4eb0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
4ec0: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
4ed0: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
4ee0: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
4ef0: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
4f00: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
4f10: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
4f20: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4f30: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
4f40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4f50: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
4f60: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
4f70: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
4f80: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
4f90: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
4fa0: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
4fb0: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
4fc0: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
4fd0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
4fe0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
4ff0: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
5000: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
5010: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5020: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5030: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5040: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
5050: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
5060: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  sult, nColumn, r
5070: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  1);.      if( pO
5080: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
5090: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
50a0: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
50b0: 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  y, p, r1);.     
50c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
50d0: 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
50e0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
50f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
5100: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5110: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
5120: 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
5130: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5140: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
5150: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  , iParm, r1, r2)
5160: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5170: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
5180: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
5190: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
51a0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
51b0: 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
51c0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
51d0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
51e0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
51f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5200: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5210: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
5220: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
5230: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
5240: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
5250: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
5260: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
5270: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
5280: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
5290: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
52a0: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
52b0: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
52c0: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
52d0: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
52e0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
52f0: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
5300: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
5310: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e  ;.      p->affin
5320: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  ity = sqlite3Com
5330: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
5340: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
5350: 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
5360: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
5370: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
5380: 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61   /* At first gla
5390: 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68  nce you would th
53a0: 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74  ink we could opt
53b0: 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20  imize out the.  
53c0: 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
53d0: 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73  Y in this case s
53e0: 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f  ince the order o
53f0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
5400: 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   set.        ** 
5410: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e  does not matter.
5420: 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68    But there migh
5430: 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61  t be a LIMIT cla
5440: 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20  use, in which.  
5450: 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68        ** case th
5460: 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74  e order does mat
5470: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ter */.        p
5480: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
5490: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
54a0: 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  p, regResult);. 
54b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
54c0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
54d0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
54e0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
54f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5500: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
5510: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31  rd, regResult, 1
5520: 2c 20 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69  , r1, &p->affini
5530: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
5540: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
5550: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
5560: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
5570: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
5580: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5590: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
55a0: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
55b0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
55c0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
55d0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r1);.      }.
55e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
55f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
5600: 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
5610: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
5620: 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
5630: 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
5640: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
5650: 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
5660: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5670: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
5680: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
5690: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
56a0: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
56b0: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
56c0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
56d0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
56e0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
56f0: 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
5700: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
5710: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
5720: 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
5730: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
5740: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
5750: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
5760: 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
5770: 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
5780: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5790: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
57a0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
57b0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
57c0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
57d0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
57e0: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
57f0: 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75  erBy, p, regResu
5800: 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lt);.      }else
5810: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5820: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
5830: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
5840: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
5850: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
5860: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
5870: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
5880: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
5890: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
58a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
58b0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
58c0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
58d0: 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68  ..    /* Send th
58e0: 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61  e data to the ca
58f0: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
5900: 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  or to a subrouti
5910: 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20  ne.  In the.    
5920: 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75 62  ** case of a sub
5930: 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62  routine, the sub
5940: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69  routine itself i
5950: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
5960: 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67  r.    ** popping
5970: 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74   the data from t
5980: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f  he stack..    */
5990: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
59a0: 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73  routine:.    cas
59b0: 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 20  e SRT_Callback: 
59c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  {.      if( pOrd
59d0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
59e0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
59f0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
5a00: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
5a10: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5a20: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5a30: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
5a40: 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  mn, r1);.       
5a50: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
5a60: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
5a70: 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  , p, r1);.      
5a80: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
5a90: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5aa0: 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r1);.      }else
5ab0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
5ac0: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
5ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5ae0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
5af0: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ld, pDest->iParm
5b00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5b10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5b20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5b30: 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65  ResultRow, regRe
5b40: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  sult, nColumn);.
5b50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5b60: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
5b70: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
5b80: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5b90: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
5ba0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5bb0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
5bc0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
5bd0: 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64  ).    /* Discard
5be0: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
5bf0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
5c00: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
5c10: 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20  s inside.    ** 
5c20: 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52  the body of a TR
5c30: 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70  IGGER.  The purp
5c40: 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65  ose of such sele
5c50: 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20  cts is to call. 
5c60: 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e     ** user-defin
5c70: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ed functions tha
5c80: 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65  t have side effe
5c90: 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  cts.  We do not 
5ca0: 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75  care.    ** abou
5cb0: 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73  t the actual res
5cc0: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
5cd0: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ct..    */.    d
5ce0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5cf0: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
5d00: 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20  RT_Discard );.  
5d10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5d20: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
5d30: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
5d40: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
5d50: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
5d60: 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
5d70: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 70  ( p->iLimit && p
5d80: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
5d90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5da0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
5db0: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31 29  , p->iLimit, -1)
5dc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5dd0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
5de0: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
5df0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 7d 0a   iBreak);.  }.}.
5e00: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
5e10: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
5e20: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
5e30: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
5e40: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
5e50: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
5e60: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
5e70: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
5e80: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
5e90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
5ea0: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
5eb0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
5ec0: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
5ed0: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
5ee0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
5ef0: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
5f00: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
5f10: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
5f20: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
5f30: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
5f40: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
5f50: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
5f60: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
5f70: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
5f80: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
5f90: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
5fa0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
5fb0: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
5fc0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
5fd0: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
5fe0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
5ff0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
6000: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
6010: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54   from malloc.  T
6020: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
6030: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
6040: 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67  sible for seeing
6050: 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63   that this struc
6060: 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c  ture is eventual
6070: 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64  ly.** freed.  Ad
6080: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
6090: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 50  ructure to the P
60a0: 34 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70  4 field of an op
60b0: 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 34  code using.** P4
60c0: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
60d0: 20 69 73 20 74 68 65 20 75 73 75 61 6c 20 77 61   is the usual wa
60e0: 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74  y of dealing wit
60f0: 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  h this..*/.stati
6100: 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e  c KeyInfo *keyIn
6110: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50  foFromExprList(P
6120: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
6130: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
6140: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6150: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
6160: 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e  t nExpr;.  KeyIn
6170: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72  fo *pInfo;.  str
6180: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
6190: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
61a0: 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c  i;..  nExpr = pL
61b0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
61c0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
61d0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
61e0: 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e  zeof(*pInfo) + n
61f0: 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  Expr*(sizeof(Col
6200: 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69  lSeq*)+1) );.  i
6210: 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
6220: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
6230: 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66 6f 2d  r = (u8*)&pInfo-
6240: 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20  >aColl[nExpr];. 
6250: 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64     pInfo->nField
6260: 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20 70 49   = nExpr;.    pI
6270: 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64  nfo->enc = ENC(d
6280: 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  b);.    for(i=0,
6290: 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
62a0: 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70   i<nExpr; i++, p
62b0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43  Item++){.      C
62c0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
62d0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
62e0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
62f0: 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
6300: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
6310: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
6320: 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70     pColl = db->p
6330: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
6340: 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  }.      pInfo->a
6350: 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b  Coll[i] = pColl;
6360: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53  .      pInfo->aS
6370: 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49  ortOrder[i] = pI
6380: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
6390: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
63a0: 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a  rn pInfo;.}.../*
63b0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72  .** If the inner
63c0: 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61   loop was genera
63d0: 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d  ted using a non-
63e0: 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72  null pOrderBy ar
63f0: 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20  gument,.** then 
6400: 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65  the results were
6410: 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72   placed in a sor
6420: 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20  ter.  After the 
6430: 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74  loop is terminat
6440: 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f  ed.** we need to
6450: 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20   run the sorter 
6460: 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72  and output the r
6470: 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c  esults.  The fol
6480: 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e  lowing.** routin
6490: 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  e generates the 
64a0: 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64  code needed to d
64b0: 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69  o that..*/.stati
64c0: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53  c void generateS
64d0: 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65  ortTail(.  Parse
64e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
64f0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
6500: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
6510: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
6520: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
6530: 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  /.  Vdbe *v,    
6540: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
6550: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
6560: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
6570: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20  Column,      /* 
6580: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
6590: 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53  s of data */.  S
65a0: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
65b0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f   /* Write the so
65c0: 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72  rted results her
65d0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 72  e */.){.  int br
65e0: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
65f0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69  akeLabel(v);.  i
6600: 6e 74 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65  nt cont = sqlite
6610: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
6620: 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  );.  int addr;. 
6630: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74   int iTab;.  int
6640: 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a   pseudoTab = 0;.
6650: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
6660: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
6670: 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73 74  By;..  int eDest
6680: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
6690: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
66a0: 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20  Dest->iParm;..  
66b0: 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e  int regRow;.  in
66c0: 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69  t regRowid;..  i
66d0: 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Tab = pOrderBy->
66e0: 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  iECursor;.  if( 
66f0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
6700: 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ack || eDest==SR
6710: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
6720: 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70     pseudoTab = p
6730: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
6740: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6750: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75  dOp2(v, OP_SetNu
6760: 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 6e 43 6f  mColumns, 0, nCo
6770: 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  lumn);.    sqlit
6780: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6790: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70  OP_OpenPseudo, p
67a0: 73 65 75 64 6f 54 61 62 2c 20 65 44 65 73 74 3d  seudoTab, eDest=
67b0: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 29 3b 0a  =SRT_Callback);.
67c0: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b    }.  addr = 1 +
67d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
67e0: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
67f0: 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64  Tab, brk);.  cod
6800: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 63 6f  eOffset(v, p, co
6810: 6e 74 29 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20  nt);.  regRow = 
6820: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6830: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67  g(pParse);.  reg
6840: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
6850: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
6860: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6870: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
6880: 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65  umn, iTab, pOrde
6890: 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20  rBy->nExpr + 1, 
68a0: 72 65 67 52 6f 77 29 3b 0a 20 20 73 77 69 74 63  regRow);.  switc
68b0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
68c0: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
68d0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
68e0: 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73  emTab: {.      s
68f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6900: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
6910: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
6920: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6930: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6940: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
6950: 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64  regRow, regRowid
6960: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6970: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6980: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
6990: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
69a0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
69b0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
69c0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
69d0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
69e0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
69f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6a00: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
6a10: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  keRecord, regRow
6a20: 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 20 26  , 1, regRowid, &
6a30: 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  p->affinity, 1);
6a40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
6a50: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
6a60: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
6a70: 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20  gRow, 1);.      
6a80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6a90: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
6aa0: 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  t, iParm, regRow
6ab0: 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  id);.      break
6ac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6ad0: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
6ae0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
6af0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
6b00: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
6b10: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
6b20: 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  , iParm, 1);.   
6b30: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
6b40: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
6b50: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
6b60: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
6b70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
6b80: 69 66 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  if.    case SRT_
6b90: 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61  Callback:.    ca
6ba0: 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
6bb0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
6bc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6bd0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6be0: 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 52 6f  nteger, 1, regRo
6bf0: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
6c00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6c10: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 73 65 75   OP_Insert, pseu
6c20: 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20 72  doTab, regRow, r
6c30: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
6c40: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
6c50: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
6c60: 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f 77    assert( regRow
6c70: 21 3d 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 20  !=pDest->iMem+i 
6c80: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6c90: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6ca0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64  OP_Column, pseud
6cb0: 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e  oTab, i, pDest->
6cc0: 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 20 20 7d  iMem+i);.      }
6cd0: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
6ce0: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
6cf0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6d00: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6d10: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65  P_ResultRow, pDe
6d20: 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d  st->iMem, nColum
6d30: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
6d40: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
6d50: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
6d60: 65 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20  e, pDest->iMem, 
6d70: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
6d80: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d  }else if( eDest=
6d90: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
6da0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6db0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6dc0: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
6dd0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  iParm);.      }.
6de0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6df0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6e00: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
6e10: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
6e20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
6e30: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
6e40: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
6e50: 72 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74  regRow);.  sqlit
6e60: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
6e70: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69  (pParse, regRowi
6e80: 64 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  d);..  /* Jump t
6e90: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
6ea0: 20 6c 6f 6f 70 20 77 68 65 6e 20 74 68 65 20 4c   loop when the L
6eb0: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 0a  IMIT is reached.
6ec0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
6ed0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
6ee0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6ef0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69   OP_AddImm, p->i
6f00: 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
6f10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6f20: 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  2(v, OP_IfZero, 
6f30: 70 2d 3e 69 4c 69 6d 69 74 2c 20 62 72 6b 29 3b  p->iLimit, brk);
6f40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62  .  }..  /* The b
6f50: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
6f60: 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
6f70: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
6f80: 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c  (v, cont);.  sql
6f90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6fa0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
6fb0: 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65   addr);.  sqlite
6fc0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
6fd0: 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28  l(v, brk);.  if(
6fe0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
6ff0: 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53  back || eDest==S
7000: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
7010: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7020: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
7030: 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  e, pseudoTab, 0)
7040: 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ;.  }..}../*.** 
7050: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
7060: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
7070: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
7080: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
7090: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
70a0: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
70b0: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
70c0: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
70d0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
70e0: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
70f0: 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20  ion type is the 
7100: 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64  exact datatype d
7110: 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63  efinition extrac
7120: 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ted from the.** 
7130: 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20  original CREATE 
7140: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
7150: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
7160: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54  n is a column. T
7170: 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f  he.** declaratio
7180: 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57  n type for a ROW
7190: 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45  ID field is INTE
71a0: 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65  GER. Exactly whe
71b0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  n an expression.
71c0: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
71d0: 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65   a column can be
71e0: 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20   complex in the 
71f0: 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71  presence of subq
7200: 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72  ueries. The.** r
7210: 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73  esult-set expres
7220: 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74  sion in all of t
7230: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c  he following SEL
7240: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
7250: 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  s .** considered
7260: 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69   a column by thi
7270: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
7280: 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46  *   SELECT col F
7290: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
72a0: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
72b0: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
72c0: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
72d0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  ol FROM tbl);.**
72e0: 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52     SELECT abc FR
72f0: 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41  OM (SELECT col A
7300: 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b  S abc FROM tbl);
7310: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c  .** .** The decl
7320: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
7330: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
7340: 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c  other than a col
7350: 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  umn is NULL..*/.
7360: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7370: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20  r *columnType(. 
7380: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
7390: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
73a0: 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r,.  const char 
73b0: 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20  **pzOriginDb,.  
73c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
73d0: 72 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73  riginTab,.  cons
73e0: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69  t char **pzOrigi
73f0: 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63  nCol.){.  char c
7400: 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b  onst *zType = 0;
7410: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
7420: 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20  OriginDb = 0;.  
7430: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
7440: 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  ginTab = 0;.  ch
7450: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69  ar const *zOrigi
7460: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nCol = 0;.  int 
7470: 6a 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  j;.  if( pExpr==
7480: 30 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  0 || pNC->pSrcLi
7490: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
74a0: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
74b0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
74c0: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
74d0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
74e0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
74f0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
7500: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
7510: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
7520: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
7530: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
7540: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
7550: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
7560: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
7570: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
7580: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
7590: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
75a0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
75b0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
75d0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
75e0: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
75f0: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
7600: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7620: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
7630: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
7640: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
7650: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
7660: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
7670: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
7680: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  Tab */.      whi
7690: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
76a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
76b0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
76c0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
76d0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
76e0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
76f0: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
7700: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
7710: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
7720: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
7730: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
7740: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
7750: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
7760: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
7770: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
7780: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
7790: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
77a0: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
77b0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
77c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
77d0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
77e0: 20 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45         /* FIX ME
77f0: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  :.        ** Thi
7800: 73 20 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20  s can occurs if 
7810: 79 6f 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69  you have somethi
7820: 6e 67 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20  ng like "SELECT 
7830: 6e 65 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20  new.x;" inside. 
7840: 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67         ** a trig
7850: 67 65 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ger.  In other w
7860: 6f 72 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66  ords, if you ref
7870: 65 72 65 6e 63 65 20 74 68 65 20 73 70 65 63 69  erence the speci
7880: 61 6c 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20  al "new".       
7890: 20 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65   ** table in the
78a0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
78b0: 20 73 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20   select.  We do 
78c0: 6e 6f 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20  not have a good 
78d0: 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  way.        ** t
78e0: 6f 20 66 69 6e 64 20 74 68 65 20 61 63 74 75 61  o find the actua
78f0: 6c 20 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f  l table type, so
7900: 20 63 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e   call it "TEXT".
7910: 20 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79    This is really
7920: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65  .        ** some
7930: 74 68 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20  thing of a bug, 
7940: 62 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f  but I do not kno
7950: 77 20 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e  w how to fix it.
7960: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
7970: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
7980: 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63   does not produc
7990: 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
79a0: 73 77 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70  swer - it just p
79b0: 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20  revents.        
79c0: 2a 2a 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20  ** a segfault.  
79d0: 53 65 65 20 74 69 63 6b 65 74 20 23 31 32 32 39  See ticket #1229
79e0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
79f0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45       zType = "TE
7a00: 58 54 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65  XT";.        bre
7a10: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
7a20: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20     assert( pTab 
7a30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20  );.      if( pS 
7a40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
7a50: 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74  e "table" is act
7a60: 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65  ually a sub-sele
7a70: 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20  ct or a view in 
7a80: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
7a90: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
7aa0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
7ab0: 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  nt. Return the d
7ac0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
7ad0: 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20  and origin.     
7ae0: 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74     ** data for t
7af0: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  he result-set co
7b00: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d  lumn of the sub-
7b10: 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20  select..        
7b20: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
7b30: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
7b40: 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  S->pEList->nExpr
7b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
7b60: 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73   If iCol is less
7b70: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
7b80: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7b90: 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20  requests the.   
7ba0: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20         ** rowid 
7bb0: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
7bc0: 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20  t or view. This 
7bd0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65  expression is le
7be0: 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20  gal (see .      
7bf0: 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65      ** test case
7c00: 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74   misc2.2.2) - it
7c10: 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65   always evaluate
7c20: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  s to NULL..     
7c30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
7c40: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
7c50: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  C;.          Exp
7c60: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
7c70: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
7c80: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
7c90: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
7ca0: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Src;.          s
7cb0: 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  NC.pNext = 0;.  
7cc0: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72          sNC.pPar
7cd0: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
7ce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
7cf0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
7d00: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e  sNC, p, &zOrigin
7d10: 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c  Db, &zOriginTab,
7d20: 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a   &zOriginCol); .
7d30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7d40: 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e  }else if( pTab->
7d50: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
7d60: 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62     /* A real tab
7d70: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  le */.        as
7d80: 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20  sert( !pS );.   
7d90: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
7da0: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
7db0: 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73  PKey;.        as
7dc0: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
7dd0: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
7de0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
7df0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
7e00: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
7e10: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
7e20: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ER";.          z
7e30: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77  OriginCol = "row
7e40: 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  id";.        }el
7e50: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se{.          zT
7e60: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
7e70: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
7e80: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43          zOriginC
7e90: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
7ea0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
7eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
7ec0: 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62  OriginTab = pTab
7ed0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
7ee0: 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65   if( pNC->pParse
7ef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
7f00: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
7f10: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43  chemaToIndex(pNC
7f20: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  ->pParse->db, pT
7f30: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
7f40: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44          zOriginD
7f50: 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d  b = pNC->pParse-
7f60: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
7f70: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ame;.        }. 
7f80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7f90: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
7fa0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
7fb0: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
7fc0: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
7fd0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
7fe0: 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65  sion is a sub-se
7ff0: 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65  lect. Return the
8000: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
8010: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f  e and.      ** o
8020: 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74  rigin info for t
8030: 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  he single column
8040: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
8050: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
8060: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
8070: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
8080: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
8090: 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  sNC;.      Selec
80a0: 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70  t *pS = pExpr->p
80b0: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78  Select;.      Ex
80c0: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
80d0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
80e0: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
80f0: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
8100: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
8110: 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e   pNC;.      sNC.
8120: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
8130: 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70  arse;.      zTyp
8140: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
8150: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e  sNC, p, &zOrigin
8160: 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c  Db, &zOriginTab,
8170: 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a   &zOriginCol); .
8180: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8190: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
81a0: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e 44  .  if( pzOriginD
81b0: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
81c0: 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26 20   pzOriginTab && 
81d0: 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20  pzOriginCol );. 
81e0: 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d     *pzOriginDb =
81f0: 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20 20   zOriginDb;.    
8200: 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a  *pzOriginTab = z
8210: 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a  OriginTab;.    *
8220: 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f  pzOriginCol = zO
8230: 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20  riginCol;.  }.  
8240: 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
8250: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
8260: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
8270: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
8280: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
8290: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
82a0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
82b0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
82c0: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
82d0: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
82e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
82f0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
8300: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
8310: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
8320: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
8330: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
8340: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
8350: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
8360: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
8370: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8380: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
8390: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
83a0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
83b0: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
83c0: 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  sNC;.  sNC.pSrcL
83d0: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
83e0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
83f0: 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30  Parse;.  for(i=0
8400: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
8410: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
8420: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
8430: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
8440: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
8450: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
8460: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
8470: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
8480: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
8490: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
84a0: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
84b0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
84c0: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
84d0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
84e0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
84f0: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
8500: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b  Tab, &zOrigCol);
8510: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62  ..    /* The vdb
8520: 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20  e must make its 
8530: 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20  own copy of the 
8540: 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20  column-type and 
8550: 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f  other .    ** co
8560: 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74  lumn specific st
8570: 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74  rings, in case t
8580: 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73  he schema is res
8590: 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20  et before this. 
85a0: 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
85b0: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
85c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
85d0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
85e0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
85f0: 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67  _DATABASE, zOrig
8600: 44 62 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54  Db, P4_TRANSIENT
8610: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8620: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8630: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45  i, COLNAME_TABLE
8640: 2c 20 7a 4f 72 69 67 54 61 62 2c 20 50 34 5f 54  , zOrigTab, P4_T
8650: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
8660: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8670: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8680: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
8690: 43 6f 6c 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e  Col, P4_TRANSIEN
86a0: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54  T);.#else.    zT
86b0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
86c0: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
86d0: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  0);.#endif.    s
86e0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
86f0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8700: 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79  ME_DECLTYPE, zTy
8710: 70 65 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54  pe, P4_TRANSIENT
8720: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
8730: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
8740: 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  LTYPE */.}../*.*
8750: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
8760: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
8770: 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65  he VDBE the name
8780: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
8790: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
87a0: 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  t.  This informa
87b0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
87c0: 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61  provide the.** a
87d0: 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e  zCol[] values in
87e0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a   the callback..*
87f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
8800: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
8810: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
8820: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
8830: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
8840: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
8850: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
8860: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
8870: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
8880: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
8890: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
88a0: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  t set */.){.  Vd
88b0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
88c0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20  pVdbe;.  int i, 
88d0: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
88e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
88f0: 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20   int fullNames, 
8900: 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66  shortNames;..#if
8910: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8920: 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
8930: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
8940: 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
8950: 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
8960: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
8970: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8980: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
8990: 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( v!=0 );.  if( 
89a0: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
89b0: 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 64  Set || v==0 || d
89c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
89d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
89e0: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
89f0: 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73  = 1;.  fullNames
8a00: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
8a10: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
8a20: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74  mes)!=0;.  short
8a30: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
8a40: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
8a50: 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  tColNames)!=0;. 
8a60: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
8a70: 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74  umCols(v, pEList
8a80: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28  ->nExpr);.  for(
8a90: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
8aa0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
8ab0: 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d  Expr *p;.    p =
8ac0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
8ad0: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  xpr;.    if( p==
8ae0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
8af0: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
8b00: 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
8b10: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
8b20: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8b30: 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  me;.      sqlite
8b40: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8b50: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8b60: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  ME, zName, strle
8b70: 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  n(zName));.     
8b80: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
8b90: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
8ba0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61  TK_COLUMN && pTa
8bb0: 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54  bList ){.      T
8bc0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
8bd0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
8be0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
8bf0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
8c00: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
8c10: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
8c20: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
8c30: 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b  rsor!=p->iTable;
8c40: 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73   j++){}.      as
8c50: 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74  sert( j<pTabList
8c60: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ->nSrc );.      
8c70: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
8c80: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
8c90: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
8ca0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
8cb0: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
8cc0: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
8cd0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
8ce0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
8cf0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
8d00: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
8d10: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  "rowid";.      }
8d20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
8d30: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
8d40: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
8d50: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
8d60: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66  shortNames && !f
8d70: 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73  ullNames && p->s
8d80: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
8d90: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  .z[0] ){.       
8da0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8db0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8dc0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72  NAME_NAME, (char
8dd0: 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e  *)p->span.z, p->
8de0: 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d  span.n);.      }
8df0: 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d  else if( fullNam
8e00: 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d  es || (!shortNam
8e10: 65 73 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  es && pTabList->
8e20: 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20  nSrc>1) ){.     
8e30: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
8e40: 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   0;.        char
8e50: 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20   *zTab;. .      
8e60: 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73    zTab = pTabLis
8e70: 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a  t->a[j].zAlias;.
8e80: 20 20 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c          if( full
8e90: 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30  Names || zTab==0
8ea0: 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e   ) zTab = pTab->
8eb0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73  zName;.        s
8ec0: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
8ed0: 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e  &zName, zTab, ".
8ee0: 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29  ", zCol, (char*)
8ef0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
8f00: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8f10: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8f20: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f  NAME, zName, P4_
8f30: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
8f40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8f50: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8f60: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8f70: 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73  ME_NAME, zCol, s
8f80: 74 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20  trlen(zCol));.  
8f90: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
8fa0: 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26  if( p->span.z &&
8fb0: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
8fc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8fd0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8fe0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
8ff0: 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e   (char*)p->span.
9000: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  z, p->span.n);. 
9010: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56       /* sqlite3V
9020: 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65  dbeCompressSpace
9030: 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20  (v, addr); */.  
9040: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
9050: 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20  har zName[30];. 
9060: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9070: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
9080: 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a   pTabList==0 );.
9090: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
90a0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4e  printf(sizeof(zN
90b0: 61 6d 65 29 2c 20 7a 4e 61 6d 65 2c 20 22 63 6f  ame), zName, "co
90c0: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20  lumn%d", i+1);. 
90d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
90e0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
90f0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
9100: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
9110: 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f    }.  generateCo
9120: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
9130: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
9140: 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  st);.}..#ifndef 
9150: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
9160: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
9170: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
9180: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
9190: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
91a0: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
91b0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
91c0: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
91d0: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
91e0: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
91f0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
9200: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
9210: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
9220: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9230: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
9240: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
9250: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9260: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
9270: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
9280: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
9290: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
92a0: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
92b0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
92c0: 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
92d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
92e0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
92f0: 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  /../*.** Forward
9300: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
9310: 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53  static int prepS
9320: 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 2a  electStmt(Parse*
9330: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a  , Select*);../*.
9340: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
9350: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
9360: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
9370: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
9380: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
9390: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
93a0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
93b0: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
93c0: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
93d0: 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
93e0: 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63  *zTabName, Selec
93f0: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
9400: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e  able *pTab;.  in
9410: 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69  t i, j;.  ExprLi
9420: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f  st *pEList;.  Co
9430: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
9440: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
9450: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
9460: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
9470: 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
9480: 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29  e, pSelect, 0) )
9490: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
94a0: 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 53    }..  while( pS
94b0: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20  elect->pPrior ) 
94c0: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
94d0: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28  t->pPrior;.  if(
94e0: 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
94f0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
9500: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
9510: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
9520: 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65  te3SelectResolve
9530: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
9540: 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
9550: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
9560: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
9570: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
9580: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
9590: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
95a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
95b0: 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
95c0: 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
95d0: 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69   zTabName ? sqli
95e0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
95f0: 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20  zTabName) : 0;. 
9600: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
9610: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61  t->pEList;.  pTa
9620: 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74  b->nCol = pEList
9630: 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ->nExpr;.  asser
9640: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20  t( pTab->nCol>0 
9650: 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20  );.  pTab->aCol 
9660: 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  = aCol = sqlite3
9670: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
9680: 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43   sizeof(pTab->aC
9690: 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f  ol[0])*pTab->nCo
96a0: 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  l);.  for(i=0, p
96b0: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62  Col=aCol; i<pTab
96c0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
96d0: 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  l++){.    Expr *
96e0: 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72  p, *pR;.    char
96f0: 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61   *zType;.    cha
9700: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
9710: 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c  t nName;.    Col
9720: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
9730: 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61   int cnt;.    Na
9740: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
9750: 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61     .    /* Get a
9760: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
9770: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
9780: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
9790: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
97a0: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
97b0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c   p->pRight==0 ||
97c0: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
97d0: 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  n.z==0 || p->pRi
97e0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21  ght->token.z[0]!
97f0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  =0 );.    if( (z
9800: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
9810: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
9820: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
9830: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
9840: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
9850: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
9860: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
9870: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
9880: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9890: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
98a0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d  }else if( p->op=
98b0: 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20 20 20 20  =TK_DOT .       
98c0: 20 20 20 20 20 20 20 26 26 20 28 70 52 3d 70 2d         && (pR=p-
98d0: 3e 70 52 69 67 68 74 29 21 3d 30 20 26 26 20 70  >pRight)!=0 && p
98e0: 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52  R->token.z && pR
98f0: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a  ->token.z[0] ){.
9900: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c        /* For col
9910: 75 6d 6e 73 20 6f 66 20 74 68 65 20 66 72 6f 6d  umns of the from
9920: 20 41 2e 42 20 75 73 65 20 42 20 61 73 20 74 68   A.B use B as th
9930: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
9940: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
9950: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 54 22 2c  Printf(db, "%T",
9960: 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20   &pR->token);.  
9970: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
9980: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
9990: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f  .z[0] ){.      /
99a0: 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e  * Use the origin
99b0: 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  al text of the c
99c0: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
99d0: 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a   as its name */.
99e0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
99f0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
9a00: 20 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29   "%T", &p->span)
9a10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9a20: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65 6c 73     /* If all els
9a30: 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20 75 70  e fails, make up
9a40: 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20   a name */.     
9a50: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
9a60: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c  MPrintf(db, "col
9a70: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20  umn%d", i+1);.  
9a80: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 4e 61    }.    if( !zNa
9a90: 6d 65 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  me || db->malloc
9aa0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
9ab0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9ac0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
9ad0: 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b  te3_free(zName);
9ae0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
9af0: 6c 65 74 65 54 61 62 6c 65 28 70 54 61 62 29 3b  leteTable(pTab);
9b00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
9b10: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9b20: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
9b30: 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  ;..    /* Make s
9b40: 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ure the column n
9b50: 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20  ame is unique.  
9b60: 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e  If the name is n
9b70: 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a  ot unique,.    *
9b80: 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67  * append a integ
9b90: 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73  er to the name s
9ba0: 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65  o that it become
9bb0: 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f  s unique..    */
9bc0: 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72  .    nName = str
9bd0: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  len(zName);.    
9be0: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
9bf0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
9c00: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
9c10: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
9c20: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
9c30: 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65       zName[nName
9c40: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  ] = 0;.        z
9c50: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
9c60: 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 3a 25 64  rintf(db, "%z:%d
9c70: 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29  ", zName, ++cnt)
9c80: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31  ;.        j = -1
9c90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  ;.        if( zN
9ca0: 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ame==0 ) break;.
9cb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9cc0: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
9cd0: 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47  zName;..    /* G
9ce0: 65 74 20 74 68 65 20 74 79 70 65 6e 61 6d 65 2c  et the typename,
9cf0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 2c 20   type affinity, 
9d00: 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
9d10: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 0a 20  quence for the. 
9d20: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20     ** column..  
9d30: 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
9d40: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
9d50: 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
9d60: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
9d70: 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 7a 54 79  t->pSrc;.    zTy
9d80: 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  pe = sqlite3DbSt
9d90: 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54  rDup(db, columnT
9da0: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20  ype(&sNC, p, 0, 
9db0: 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c  0, 0));.    pCol
9dc0: 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70 65 3b  ->zType = zType;
9dd0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
9de0: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
9df0: 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
9e00: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
9e10: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
9e20: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  rse, p);.    if(
9e30: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
9e40: 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71  pCol->zColl = sq
9e50: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
9e60: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
9e70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
9e80: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
9e90: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
9ea0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
9eb0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
9ec0: 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
9ed0: 20 62 79 20 64 6f 69 6e 67 20 74 68 65 20 66 6f   by doing the fo
9ee0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 69 6e 67  llowing.** thing
9ef0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s:.**.**    (1) 
9f00: 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
9f10: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
9f20: 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
9f30: 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
9f40: 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
9f50: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9f60: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
9f70: 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
9f80: 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
9f90: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
9fa0: 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
9fb0: 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
9fc0: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
9fd0: 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
9fe0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9ff0: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
a000: 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
a010: 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
a020: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
a030: 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
a040: 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
a050: 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
a060: 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
a070: 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
a080: 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
a090: 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
a0a0: 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
a0b0: 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
a0c0: 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
a0d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
a0e0: 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
a0f0: 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
a100: 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70  e presistent rep
a110: 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
a120: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
a130: 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
a140: 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
a150: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
a160: 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68  to accomodate th
a170: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
a180: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
a190: 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
a1a0: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
a1b0: 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
a1c0: 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74  *    (4)  Scan t
a1d0: 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
a1e0: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
a1f0: 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
a200: 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
a210: 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
a220: 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
a230: 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
a240: 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
a250: 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
a260: 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
a270: 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
a280: 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
a290: 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
a2a0: 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
a2b0: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
a2c0: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  TABLE..**.** Ret
a2d0: 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73  urn 0 on success
a2e0: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
a2f0: 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20  problems, leave 
a300: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
a310: 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e  .** in pParse an
a320: 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  d return non-zer
a330: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
a340: 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
a350: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
a360: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
a370: 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20   i, j, k, rc;.  
a380: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
a390: 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
a3a0: 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
a3b0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
a3c0: 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
a3d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a3e0: 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ..  if( p==0 || 
a3f0: 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 64 62  p->pSrc==0 || db
a400: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a410: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
a420: 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d    }.  pTabList =
a430: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
a440: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
a450: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
a460: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
a470: 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
a480: 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
a490: 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
a4a0: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
a4b0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
a4c0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
a4d0: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
a4e0: 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e  sors(pParse, p->
a4f0: 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  pSrc);..  /* Loo
a500: 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
a510: 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
a520: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
a530: 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
a540: 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
a550: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
a560: 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
a570: 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
a580: 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
a590: 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
a5a0: 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
a5b0: 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
a5c0: 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
a5d0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
a5e0: 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
a5f0: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
a600: 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
a610: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
a620: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  ab;.    if( pFro
a630: 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20  m->pTab!=0 ){.  
a640: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74      /* This stat
a650: 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64  ement has alread
a660: 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e  y been prepared.
a670: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
a680: 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67  ed.      ** to g
a690: 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  o further. */.  
a6a0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30      assert( i==0
a6b0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
a6c0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
a6d0: 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
a6e0: 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
a6f0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
a700: 59 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  Y.      /* A sub
a710: 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
a720: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
a730: 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
a740: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
a750: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  elect!=0 );.    
a760: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c    if( pFrom->zAl
a770: 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ias==0 ){.      
a780: 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20    pFrom->zAlias 
a790: 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  =.          sqli
a7a0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
a7b0: 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f  sqlite_subquery_
a7c0: 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 46 72  %p_", (void*)pFr
a7d0: 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
a7e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a7f0: 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
a800: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
a810: 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
a820: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
a830: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
a840: 63 74 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  ct(pParse, pFrom
a850: 2d 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d  ->zAlias, pFrom-
a860: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
a870: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
a880: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
a890: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a8a0: 2f 2a 20 54 68 65 20 69 73 45 70 68 65 6d 20 66  /* The isEphem f
a8b0: 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  lag indicates th
a8c0: 61 74 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  at the Table str
a8d0: 75 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 0a  ucture has been.
a8e0: 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63        ** dynamic
a8f0: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61  ally allocated a
a900: 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65 64 20  nd may be freed 
a910: 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e  at any time.  In
a920: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20   other words,.  
a930: 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20 6e      ** pTab is n
a940: 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ot pointing to a
a950: 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c   persistent tabl
a960: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
a970: 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20 2a   defines.      *
a980: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 63  * part of the sc
a990: 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70  hema. */.      p
a9a0: 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 3d 20 31  Tab->isEphem = 1
a9b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
a9c0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
a9d0: 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
a9e0: 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
a9f0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
aa00: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
aa10: 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
aa20: 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
aa30: 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
aa40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
aa50: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
aa60: 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70  0,pFrom->zName,p
aa70: 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  From->zDatabase)
aa80: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
aa90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
aaa0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
aab0: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
aac0: 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  f++;.#if !define
aad0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
aae0: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
aaf0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
ab00: 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
ab10: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
ab20: 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28  ct || IsVirtual(
ab30: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
ab40: 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72   /* We reach her
ab50: 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74  e if the named t
ab60: 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79  able is a really
ab70: 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   a view */.     
ab80: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69     if( sqlite3Vi
ab90: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
aba0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
abb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
abc0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
abd0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46          /* If pF
abe0: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  rom->pSelect!=0 
abf0: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
ac00: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20  dealing with a. 
ac10: 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77         ** view w
ac20: 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54  ithin a view.  T
ac30: 68 65 20 53 45 4c 45 43 54 20 73 74 72 75 63 74  he SELECT struct
ac40: 75 72 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ure has already 
ac50: 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  been.        ** 
ac60: 63 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f 75  copied by the ou
ac70: 74 65 72 20 76 69 65 77 20 73 6f 20 77 65 20 63  ter view so we c
ac80: 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79  an skip the copy
ac90: 20 73 74 65 70 20 68 65 72 65 0a 20 20 20 20 20   step here.     
aca0: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e     ** in the inn
acb0: 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20  er view..       
acc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
acd0: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pFrom->pSelect==
ace0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
acf0: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
ad00: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
ad10: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65  (db, pTab->pSele
ad20: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ct);.        }. 
ad30: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
ad40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
ad50: 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65  ocess NATURAL ke
ad60: 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61  ywords, and ON a
ad70: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
ad80: 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a   of joins..  */.
ad90: 20 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f 63    if( sqliteProc
ada0: 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20  essJoin(pParse, 
adb0: 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a  p) ) return 1;..
adc0: 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
add0: 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
ade0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
adf0: 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
ae00: 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
ae10: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
ae20: 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20  ables.  And for 
ae30: 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e  every TABLE.* in
ae40: 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20  sert the names. 
ae50: 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d   ** of all colum
ae60: 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68  ns in TABLE.  Th
ae70: 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65  e parser inserte
ae80: 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  d a special expr
ae90: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68  ession.  ** with
aea0: 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72   the TK_ALL oper
aeb0: 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a  ator for each "*
aec0: 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20  " that it found 
aed0: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
aee0: 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c  st..  ** The fol
aef0: 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
af00: 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
af10: 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73  he TK_ALL expres
af20: 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64  sions and expand
af30: 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74  .  ** each one t
af40: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
af50: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
af60: 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
af70: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f  ** The first loo
af80: 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f  p just checks to
af90: 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
afa0: 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74  e any "*" operat
afb0: 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65  ors.  ** that ne
afc0: 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20  ed expanding..  
afd0: 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
afe0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
aff0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
b000: 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d  E = pEList->a[k]
b010: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
b020: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  pE->op==TK_ALL )
b030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
b040: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
b050: 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20  & pE->pRight && 
b060: 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
b070: 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20  TK_ALL.         
b080: 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20  && pE->pLeft && 
b090: 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pE->pLeft->op==T
b0a0: 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20  K_ID ) break;.  
b0b0: 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69 66  }.  rc = 0;.  if
b0c0: 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ( k<pEList->nExp
b0d0: 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  r ){.    /*.    
b0e0: 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72  ** If we get her
b0f0: 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72  e it means the r
b100: 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69  esult set contai
b110: 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22  ns one or more "
b120: 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  *".    ** operat
b130: 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
b140: 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c   be expanded.  L
b150: 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
b160: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
b170: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
b180: 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20   set and expand 
b190: 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  them one by one.
b1a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75  .    */.    stru
b1b0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
b1c0: 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b   *a = pEList->a;
b1d0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
b1e0: 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  New = 0;.    int
b1f0: 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d   flags = pParse-
b200: 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  >db->flags;.    
b210: 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20  int longNames = 
b220: 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
b230: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
b240: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
b250: 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 73            (flags
b260: 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
b270: 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20  olNames)==0;..  
b280: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
b290: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
b2a0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
b2b0: 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
b2c0: 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
b2d0: 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20  =TK_ALL &&.     
b2e0: 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54        (pE->op!=T
b2f0: 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69  K_DOT || pE->pRi
b300: 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52  ght==0 || pE->pR
b310: 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ight->op!=TK_ALL
b320: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
b330: 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
b340: 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
b350: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  not need to be e
b360: 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20  xpanded..       
b370: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
b380: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
b390: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
b3a0: 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70   pNew, a[k].pExp
b3b0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
b3c0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
b3d0: 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
b3e0: 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  w->nExpr-1].zNam
b3f0: 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a  e = a[k].zName;.
b400: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b410: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
b420: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b430: 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
b440: 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  0;.        a[k].
b450: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
b460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b470: 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
b480: 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
b490: 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
b4a0: 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
b4b0: 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
b4c0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
b4d0: 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
b4e0: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
b4f0: 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
b500: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
b510: 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20  r *zTName;      
b520: 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
b530: 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
b540: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
b550: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
b560: 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pE->pLeft ){.   
b570: 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
b580: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
b590: 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e 70 4c  oken(db, &pE->pL
b5a0: 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  eft->token);.   
b5b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b5c0: 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30        zTName = 0
b5d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b5e0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
b5f0: 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
b600: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
b610: 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
b620: 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
b630: 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
b640: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
b650: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
b660: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pFrom->zAlias;.
b670: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
b680: 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61  abName==0 || zTa
b690: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a  bName[0]==0 ){ .
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
b6b0: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
b6c0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
b6d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
b6e0: 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61 6d  Name && (zTabNam
b6f0: 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65  e==0 || zTabName
b700: 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20  [0]==0 || .     
b710: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
b720: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d  te3StrICmp(zTNam
b730: 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29  e, zTabName)!=0)
b740: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b750: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
b760: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b770: 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20  tableSeen = 1;. 
b780: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
b790: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
b7a0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
b7b0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a    Expr *pExpr, *
b7c0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
b7d0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
b7e0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
b7f0: 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20  zName;..        
b800: 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75      /* If a colu
b810: 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  mn is marked as 
b820: 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e  'hidden' (curren
b830: 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c  tly only possibl
b840: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
b850: 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62   for virtual tab
b860: 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63  les), do not inc
b870: 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20 65  lude it in the e
b880: 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20  xpanded.        
b890: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65      ** result-se
b8a0: 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20  t list..        
b8b0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
b8c0: 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43     if( IsHiddenC
b8d0: 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
b8e0: 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  l[j]) ){.       
b8f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49 73         assert(Is
b900: 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a  Virtual(pTab));.
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
b920: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
b930: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
b940: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
b950: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
b960: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
b970: 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69  *pLeft = &pTabLi
b980: 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20  st->a[i-1];.    
b990: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
b9a0: 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65  Left[1].jointype
b9b0: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
b9c0: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
b9e0: 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e  umnIndex(pLeft->
b9f0: 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  pTab, zName)>=0 
ba00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
ba10: 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
ba20: 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
ba30: 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
ba40: 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
ba50: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
ba60: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  e on the right *
ba70: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
ba80: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
ba90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
baa0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
bab0: 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
bac0: 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e 67  (pLeft[1].pUsing
bad0: 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
baf0: 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
bb00: 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
bb10: 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
bb20: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
bb30: 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
bb40: 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
bb50: 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
bb60: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
bb70: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
bb90: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
bba0: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
bbb0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
bbc0: 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c  Parse, TK_ID, 0,
bbd0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
bbe0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d 3d      if( pRight==
bbf0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
bc00: 20 20 20 20 20 20 20 73 65 74 51 75 6f 74 65 64         setQuoted
bc10: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70  Token(pParse, &p
bc20: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e  Right->token, zN
bc30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
bc40: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26    if( zTabName &
bc50: 26 20 28 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20  & (longNames || 
bc60: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
bc70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
bc80: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
bc90: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
bca0: 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20  arse, TK_ID, 0, 
bcb0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
bcc0: 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
bcd0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bce0: 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
bcf0: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
bd00: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
bd10: 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Expr==0 ) break;
bd20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
bd30: 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50  etQuotedToken(pP
bd40: 61 72 73 65 2c 20 26 70 4c 65 66 74 2d 3e 74 6f  arse, &pLeft->to
bd50: 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a  ken, zTabName);.
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
bd70: 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73  tToken(&pExpr->s
bd80: 70 61 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  pan, .          
bd90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
bda0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
bdb0: 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
bdc0: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
bdd0: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
bde0: 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  .dyn = 1;.      
bdf0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
be00: 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  oken.z = 0;.    
be10: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
be20: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20  >token.n = 0;.  
be30: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
be40: 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30  r->token.dyn = 0
be50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
be60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
be70: 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
be80: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
be90: 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70   pExpr->span = p
bea0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Expr->token;.   
beb0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
bec0: 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 30 3b 0a  ->span.dyn = 0;.
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
bee0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
bef0: 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  ngNames ){.     
bf00: 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
bf10: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
bf20: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
bf30: 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45 78 70  ew, pExpr, &pExp
bf40: 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  r->span);.      
bf50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bf60: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
bf70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
bf80: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
bf90: 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 52  pNew, pExpr, &pR
bfa0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  ight->token);.  
bfb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
bfc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bfd0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
bfe0: 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
bff0: 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
c000: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
c010: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
c020: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
c030: 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e   table: %s", zTN
c040: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
c050: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c060: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c070: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
c080: 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
c090: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
c0a0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
c0b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c0c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c0d0: 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  zTName);.      }
c0e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
c0f0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
c100: 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  (pEList);.    p-
c110: 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
c120: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
c130: 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
c140: 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e  p->pEList && p->
c150: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
c160: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
c170: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
c180: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
c190: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
c1a0: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
c1b0: 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a  n result set");.
c1c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c1d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69  ERROR;.  }.#endi
c1e0: 66 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  f.  if( db->mall
c1f0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
c200: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
c210: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
c220: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 20  rc;.}../*.** pE 
c230: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c240: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 68  an expression wh
c250: 69 63 68 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ich is a single 
c260: 74 65 72 6d 20 69 6e 0a 2a 2a 20 4f 52 44 45 52  term in.** ORDER
c270: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
c280: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 74  clause..**.** At
c290: 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73 20   the point this 
c2a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
c2b0: 64 2c 20 77 65 20 61 6c 72 65 61 64 79 20 6b 6e  d, we already kn
c2c0: 6f 77 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 4f  ow that the.** O
c2d0: 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 73 20  RDER BY term is 
c2e0: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 69  not an integer i
c2f0: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 72 65  ndex into the re
c300: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 61 74 0a  sult set.  That.
c310: 2a 2a 20 63 61 73 65 65 20 69 73 20 68 61 6e 64  ** casee is hand
c320: 6c 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  led by the calli
c330: 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  ng routine..**.*
c340: 2a 20 49 66 20 70 45 20 69 73 20 61 20 77 65 6c  * If pE is a wel
c350: 6c 2d 66 6f 72 6d 65 64 20 65 78 70 72 65 73 73  l-formed express
c360: 69 6f 6e 20 61 6e 64 20 74 68 65 20 53 45 4c 45  ion and the SELE
c370: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
c380: 69 73 20 6e 6f 74 20 63 6f 6d 70 6f 75 6e 64 2c  is not compound,
c390: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 2e 20   then return 0. 
c3a0: 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
c3b0: 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72  to the.** caller
c3c0: 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20   that it should 
c3d0: 73 6f 72 74 20 62 79 20 74 68 65 20 76 61 6c 75  sort by the valu
c3e0: 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  e of the ORDER B
c3f0: 59 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  Y.** expression.
c400: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45  .**.** If the SE
c410: 4c 45 43 54 20 69 73 20 63 6f 6d 70 6f 75 6e 64  LECT is compound
c420: 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74  , then attempt t
c430: 6f 20 6d 61 74 63 68 20 70 45 20 61 67 61 69 6e  o match pE again
c440: 73 74 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65 74  st.** result set
c450: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
c460: 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  left-most SELECT
c470: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74   statement.  Ret
c480: 75 72 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  urn.** the index
c490: 20 69 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69   i of the matchi
c4a0: 6e 67 20 63 6f 6c 75 6d 6e 2c 20 61 73 20 61 6e  ng column, as an
c4b0: 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 74   indication to t
c4c0: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 68  he .** caller th
c4d0: 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f 72  at it should sor
c4e0: 74 20 62 79 20 74 68 65 20 69 2d 74 68 20 63 6f  t by the i-th co
c4f0: 6c 75 6d 6e 2e 20 20 49 66 20 74 68 65 72 65 20  lumn.  If there 
c500: 69 73 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c 20  is.** no match, 
c510: 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 6c 65  return -1 and le
c520: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
c530: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
c540: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61  */.static int ma
c550: 74 63 68 4f 72 64 65 72 42 79 54 65 72 6d 54 6f  tchOrderByTermTo
c560: 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
c570: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
c580: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c590: 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  t for error mess
c5a0: 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ages */.  Select
c5b0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20   *pSelect,   /* 
c5c0: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
c5d0: 6d 65 6e 74 20 77 69 74 68 20 74 68 65 20 4f 52  ment with the OR
c5e0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
c5f0: 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 20 20 20  .  Expr *pE,    
c600: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65        /* The spe
c610: 63 69 66 69 63 20 4f 52 44 45 52 20 42 59 20 74  cific ORDER BY t
c620: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  erm */.  int idx
c630: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ,           /* W
c640: 68 65 6e 20 4f 52 44 45 52 20 42 59 20 74 65 72  hen ORDER BY ter
c650: 6d 20 69 73 20 74 68 69 73 20 2a 2f 0a 20 20 69  m is this */.  i
c660: 6e 74 20 69 73 43 6f 6d 70 6f 75 6e 64 2c 20 20  nt isCompound,  
c670: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
c680: 73 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  s is a compound 
c690: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 75 38 20 2a  SELECT */.  u8 *
c6a0: 70 48 61 73 41 67 67 20 20 20 20 20 20 20 20 2f  pHasAgg        /
c6b0: 2a 20 54 72 75 65 20 69 66 20 65 78 70 72 65 73  * True if expres
c6c0: 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67  sion contains ag
c6d0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
c6e0: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c700: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
c710: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
c720: 73 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75  st;  /* The colu
c730: 6d 6e 73 20 6f 66 20 74 68 65 20 72 65 73 75 6c  mns of the resul
c740: 74 20 73 65 74 20 2a 2f 0a 20 20 4e 61 6d 65 43  t set */.  NameC
c750: 6f 6e 74 65 78 74 20 6e 63 3b 20 20 20 20 2f 2a  ontext nc;    /*
c760: 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
c770: 72 20 72 65 73 6f 6c 76 69 6e 67 20 70 45 20 2a  r resolving pE *
c780: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
c790: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
c7a0: 72 28 70 45 2c 20 26 69 29 3d 3d 30 20 29 3b 0a  r(pE, &i)==0 );.
c7b0: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
c7c0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f  ct->pEList;..  /
c7d0: 2a 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73  * If the term is
c7e0: 20 61 20 73 69 6d 70 6c 65 20 69 64 65 6e 74 69   a simple identi
c7f0: 66 69 65 72 20 74 68 61 74 20 74 72 79 20 74 6f  fier that try to
c800: 20 6d 61 74 63 68 20 74 68 61 74 20 69 64 65 6e   match that iden
c810: 74 69 66 69 65 72 0a 20 20 2a 2a 20 61 67 61 69  tifier.  ** agai
c820: 6e 73 74 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d  nst a column nam
c830: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
c840: 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
c850: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c  pE->op==TK_ID ||
c860: 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52   (pE->op==TK_STR
c870: 49 4e 47 20 26 26 20 70 45 2d 3e 74 6f 6b 65 6e  ING && pE->token
c880: 2e 7a 5b 30 5d 21 3d 27 5c 27 27 29 20 29 7b 0a  .z[0]!='\'') ){.
c890: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
c8a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
c8b0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 73    char *zCol = s
c8c0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
c8d0: 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e 74 6f 6b  ken(db, &pE->tok
c8e0: 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 43 6f  en);.    if( zCo
c8f0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  l==0 ){.      re
c900: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
c910: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
c920: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
c930: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
c940: 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  As = pEList->a[i
c950: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  ].zName;.      i
c960: 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c  f( zAs!=0 && sql
c970: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c  ite3StrICmp(zAs,
c980: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
c990: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
c9a0: 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  e(zCol);.       
c9b0: 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20   return i+1;.   
c9c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
c9d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c  qlite3_free(zCol
c9e0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  );.  }..  /* Res
c9f0: 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69  olve all names i
ca00: 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  n the ORDER BY t
ca10: 65 72 6d 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  erm expression. 
ca20: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6e 63   */.  memset(&nc
ca30: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6e 63 29 29  , 0, sizeof(nc))
ca40: 3b 0a 20 20 6e 63 2e 70 50 61 72 73 65 20 3d 20  ;.  nc.pParse = 
ca50: 70 50 61 72 73 65 3b 0a 20 20 6e 63 2e 70 53 72  pParse;.  nc.pSr
ca60: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
ca70: 3e 70 53 72 63 3b 0a 20 20 6e 63 2e 70 45 4c 69  >pSrc;.  nc.pELi
ca80: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 6e  st = pEList;.  n
ca90: 63 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a  c.allowAgg = 1;.
caa0: 20 20 6e 63 2e 6e 45 72 72 20 3d 20 30 3b 0a 20    nc.nErr = 0;. 
cab0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
cac0: 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 6e 63  ResolveNames(&nc
cad0: 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 69 66 28  , pE) ){.    if(
cae0: 20 69 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20   isCompound ){. 
caf0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
cb00: 72 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  rClear(pParse);.
cb10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
cb20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cb30: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
cb40: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 63 2e 68  }.  }.  if( nc.h
cb50: 61 73 41 67 67 20 26 26 20 70 48 61 73 41 67 67  asAgg && pHasAgg
cb60: 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 41 67 67   ){.    *pHasAgg
cb70: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
cb80: 46 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  For a compound S
cb90: 45 4c 45 43 54 2c 20 77 65 20 6e 65 65 64 20 74  ELECT, we need t
cba0: 6f 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74  o try to match t
cbb0: 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a  he ORDER BY.  **
cbc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69   expression agai
cbd0: 6e 73 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f  nst an expressio
cbe0: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
cbf0: 73 65 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  set.  */.  if( i
cc00: 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20  sCompound ){.   
cc10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
cc20: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
cc30: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
cc40: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
cc50: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
cc60: 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20  , pE) ){.       
cc70: 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20   return i+1;.   
cc80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
cc90: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
cca0: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64  *.** Analyze and
ccb0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
ccc0: 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  UP BY clause in 
ccd0: 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54 20  a simple SELECT 
cce0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 52 65  statement..** Re
ccf0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
cd00: 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a  of errors seen..
cd10: 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 74 65 72 6d  **.** Every term
cd20: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
cd30: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
cd40: 75 73 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  use needs to be 
cd50: 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
cd60: 2e 20 20 49 66 20 61 6e 79 20 65 78 70 72 65 73  .  If any expres
cd70: 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67  sion is an integ
cd80: 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  er constant, the
cd90: 6e 0a 2a 2a 20 74 68 61 74 20 65 78 70 72 65 73  n.** that expres
cda0: 73 69 6f 6e 20 69 73 20 72 65 70 6c 61 63 65 64  sion is replaced
cdb0: 20 62 79 20 74 68 65 20 63 6f 72 72 65 73 70 6f   by the correspo
cdc0: 6e 64 69 6e 67 20 0a 2a 2a 20 65 78 70 72 65 73  nding .** expres
cdd0: 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72 65  sion from the re
cde0: 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
cdf0: 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 4f  tic int processO
ce00: 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 50  rderGroupBy(.  P
ce10: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
ce20: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
ce30: 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20  context.  Leave 
ce40: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68  error messages h
ce50: 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ere */.  Select 
ce60: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f  *pSelect,      /
ce70: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
ce80: 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e  tement containin
ce90: 67 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a  g the clause */.
cea0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
ceb0: 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f  erBy,   /* The O
cec0: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
ced0: 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65   BY clause to be
cee0: 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
cef0: 69 6e 74 20 69 73 4f 72 64 65 72 2c 20 20 20 20  int isOrder,    
cf00: 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 4f        /* 1 for O
cf10: 52 44 45 52 20 42 59 2e 20 20 30 20 66 6f 72 20  RDER BY.  0 for 
cf20: 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 75 38  GROUP BY */.  u8
cf30: 20 2a 70 48 61 73 41 67 67 20 20 20 20 20 20 20   *pHasAgg       
cf40: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 54 52      /* Set to TR
cf50: 55 45 20 69 66 20 61 6e 79 20 74 65 72 6d 20 63  UE if any term c
cf60: 6f 6e 74 61 69 6e 73 20 61 6e 20 61 67 67 72 65  ontains an aggre
cf70: 67 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  gate */.){.  int
cf80: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
cf90: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
cfa0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
cfb0: 73 74 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65  st;..  if( pOrde
cfc0: 72 42 79 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  rBy==0 || pParse
cfd0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
cfe0: 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  ed ) return 0;.#
cff0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
d000: 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64 65  LUMN.  if( pOrde
d010: 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  rBy->nExpr>db->a
d020: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
d030: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
d040: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
d050: 79 70 65 20 3d 20 69 73 4f 72 64 65 72 20 3f 20  ype = isOrder ? 
d060: 22 4f 52 44 45 52 22 20 3a 20 22 47 52 4f 55 50  "ORDER" : "GROUP
d070: 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ";.    sqlite3Er
d080: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d090: 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
d0a0: 6e 20 25 73 20 42 59 20 63 6c 61 75 73 65 22 2c  n %s BY clause",
d0b0: 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 72 65 74   zType);.    ret
d0c0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 1;.  }.#endi
d0d0: 66 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  f.  pEList = pSe
d0e0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
d0f0: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
d100: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
d110: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
d120: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
d130: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69   i++){.    int i
d140: 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  Col;.    Expr *p
d150: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
d160: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
d170: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
d180: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
d190: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
d1a0: 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70  Col<=0 || iCol>p
d1b0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
d1c0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
d1d0: 61 72 20 2a 7a 54 79 70 65 20 3d 20 69 73 4f 72  ar *zType = isOr
d1e0: 64 65 72 20 3f 20 22 4f 52 44 45 52 22 20 3a 20  der ? "ORDER" : 
d1f0: 22 47 52 4f 55 50 22 3b 0a 20 20 20 20 20 20 20  "GROUP";.       
d200: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d210: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
d220: 20 20 20 20 20 22 25 72 20 25 73 20 42 59 20 74       "%r %s BY t
d230: 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  erm out of range
d240: 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20   - should be ". 
d250: 20 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65            "betwe
d260: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2b  en 1 and %d", i+
d270: 31 2c 20 7a 54 79 70 65 2c 20 70 45 4c 69 73 74  1, zType, pEList
d280: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
d290: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
d2a0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
d2b0: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6d 61 74 63       iCol = matc
d2c0: 68 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78  hOrderByTermToEx
d2d0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
d2e0: 53 65 6c 65 63 74 2c 20 70 45 2c 20 69 2b 31 2c  Select, pE, i+1,
d2f0: 20 30 2c 20 70 48 61 73 41 67 67 29 3b 0a 20 20   0, pHasAgg);.  
d300: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
d310: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
d320: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
d330: 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30  }.    if( iCol>0
d340: 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
d350: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 45 2d 3e 70  q *pColl = pE->p
d360: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  Coll;.      int 
d370: 66 6c 61 67 73 20 3d 20 70 45 2d 3e 66 6c 61 67  flags = pE->flag
d380: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
d390: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
d3a0: 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a  ExprDelete(pE);.
d3b0: 20 20 20 20 20 20 70 45 20 3d 20 73 71 6c 69 74        pE = sqlit
d3c0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
d3d0: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e  List->a[iCol-1].
d3e0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 4f  pExpr);.      pO
d3f0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
d400: 70 72 20 3d 20 70 45 3b 0a 20 20 20 20 20 20 69  pr = pE;.      i
d410: 66 28 20 70 45 20 26 26 20 70 43 6f 6c 6c 20 26  f( pE && pColl &
d420: 26 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  & flags ){.     
d430: 20 20 20 70 45 2d 3e 70 43 6f 6c 6c 20 3d 20 70     pE->pColl = p
d440: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 45  Coll;.        pE
d450: 2d 3e 66 6c 61 67 73 20 7c 3d 20 66 6c 61 67 73  ->flags |= flags
d460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d470: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
d480: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
d490: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72   and ORDER BY or
d4a0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
d4b0: 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61   in a SELECT sta
d4c0: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  tement.  Return.
d4d0: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
d4e0: 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a   errors seen..**
d4f0: 0a 2a 2a 20 49 66 20 69 54 61 62 6c 65 3e 30 20  .** If iTable>0 
d500: 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 4e 2d  then make the N-
d510: 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  th term of the O
d520: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 72  RDER BY clause r
d530: 65 66 65 72 20 74 6f 0a 2a 2a 20 74 68 65 20 4e  efer to.** the N
d540: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  -th column of ta
d550: 62 6c 65 20 69 54 61 62 6c 65 2e 0a 2a 2a 0a 2a  ble iTable..**.*
d560: 2a 20 49 66 20 69 54 61 62 6c 65 3d 3d 30 20 74  * If iTable==0 t
d570: 68 65 6e 20 74 72 61 6e 73 66 6f 72 6d 20 65 61  hen transform ea
d580: 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ch term of the O
d590: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
d5a0: 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 61 20  o refer.** to a 
d5b0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 65  column of the re
d5c0: 73 75 6c 74 20 73 65 74 20 62 79 20 6e 75 6d 62  sult set by numb
d5d0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
d5e0: 74 20 70 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e  t processCompoun
d5f0: 64 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  dOrderBy(.  Pars
d600: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d610: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d620: 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72  text.  Leave err
d630: 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65  or messages here
d640: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
d650: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54  elect,      /* T
d660: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
d670: 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ent containing t
d680: 68 65 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  he ORDER BY */. 
d690: 20 69 6e 74 20 69 54 61 62 6c 65 20 20 20 20 20   int iTable     
d6a0: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
d6b0: 20 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 6f   table for compo
d6c0: 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
d6d0: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
d6e0: 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  t i;.  ExprList 
d6f0: 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 45 78 70  *pOrderBy;.  Exp
d700: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
d710: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
d720: 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31  int moreToDo = 1
d730: 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  ;..  pOrderBy = 
d740: 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
d750: 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  y;.  if( pOrderB
d760: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
d770: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
d780: 64 62 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  db;.#if SQLITE_M
d790: 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
d7a0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e  pOrderBy->nExpr>
d7b0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
d7c0: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
d7d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d7e0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d7f0: 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
d800: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
d810: 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e");.    return 
d820: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  1;.  }.#endif.  
d830: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
d840: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
d850: 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  {.    pOrderBy->
d860: 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20  a[i].done = 0;. 
d870: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c   }.  while( pSel
d880: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
d890: 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65     pSelect = pSe
d8a0: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
d8b0: 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  }.  while( pSele
d8c0: 63 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20 29  ct && moreToDo )
d8d0: 7b 0a 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d  {.    moreToDo =
d8e0: 20 30 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   0;.    pEList =
d8f0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
d900: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
d910: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
d920: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
d930: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
d940: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
d950: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
d960: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 45 78  l = -1;.      Ex
d970: 70 72 20 2a 70 45 2c 20 2a 70 44 75 70 3b 0a 20  pr *pE, *pDup;. 
d980: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
d990: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63  y->a[i].done ) c
d9a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
d9b0: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
d9c0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
d9d0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
d9e0: 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
d9f0: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ol) ){.        i
da00: 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f  f( iCol<0 || iCo
da10: 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
da20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
da30: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
da40: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
da50: 20 20 20 22 25 72 20 4f 52 44 45 52 20 42 59 20     "%r ORDER BY 
da60: 74 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67  term out of rang
da70: 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a  e - should be ".
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 62 65               "be
da90: 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c  tween 1 and %d",
daa0: 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45   i+1, pEList->nE
dab0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
dac0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
dad0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
dae0: 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20  .        pDup = 
daf0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
db00: 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20 20 20  b, pE);.        
db10: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
db20: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
db30: 20 20 20 61 73 73 65 72 74 28 70 44 75 70 29 3b     assert(pDup);
db40: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20  .          iCol 
db50: 3d 20 6d 61 74 63 68 4f 72 64 65 72 42 79 54 65  = matchOrderByTe
db60: 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61  rmToExprList(pPa
db70: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 44  rse, pSelect, pD
db80: 75 70 2c 20 69 2b 31 2c 20 31 2c 20 30 29 3b 0a  up, i+1, 1, 0);.
db90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dba0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
dbb0: 65 74 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20  ete(pDup);.     
dbc0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
dbd0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
dbe0: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
dbf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
dc00: 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20   iCol>0 ){.     
dc10: 20 20 20 69 66 28 20 69 54 61 62 6c 65 20 29 7b     if( iTable ){
dc20: 0a 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 6f  .          pE->o
dc30: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
dc40: 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 54 61           pE->iTa
dc50: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
dc60: 20 20 20 20 20 20 20 20 70 45 2d 3e 69 41 67 67          pE->iAgg
dc70: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
dc80: 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69   pE->iColumn = i
dc90: 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  Col-1;.         
dca0: 20 70 45 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20   pE->pTab = 0;. 
dcb0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
dcc0: 20 20 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d          pE->op =
dcd0: 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20   TK_INTEGER;.   
dce0: 20 20 20 20 20 20 20 70 45 2d 3e 66 6c 61 67 73         pE->flags
dcf0: 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
dd00: 0a 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69  .          pE->i
dd10: 54 61 62 6c 65 20 3d 20 69 43 6f 6c 3b 0a 20 20  Table = iCol;.  
dd20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dd30: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
dd40: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  one = 1;.      }
dd50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 6f  else{.        mo
dd60: 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 20 20 20 20  reToDo = 1;.    
dd70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53    }.    }.    pS
dd80: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
dd90: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 66 6f  >pNext;.  }.  fo
dda0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
ddb0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
ddc0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
ddd0: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20 29  ->a[i].done==0 )
dde0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
ddf0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
de00: 22 25 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  "%r ORDER BY ter
de10: 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  m does not match
de20: 20 61 6e 79 20 22 0a 20 20 20 20 20 20 20 20 20   any ".         
de30: 20 20 20 22 63 6f 6c 75 6d 6e 20 69 6e 20 74 68     "column in th
de40: 65 20 72 65 73 75 6c 74 20 73 65 74 22 2c 20 69  e result set", i
de50: 2b 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  +1);.      retur
de60: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
de70: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
de80: 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
de90: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
dea0: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
deb0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
dec0: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
ded0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
dee0: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
def0: 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
df00: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
df10: 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
df20: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
df30: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
df40: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
df50: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
df60: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
df70: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56  pVdbe = sqlite3V
df80: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
df90: 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66 20 53  ->db);.#ifndef S
dfa0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
dfb0: 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20  .    if( v ){.  
dfc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dfd0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63  ddOp0(v, OP_Trac
dfe0: 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
dff0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
e000: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
e010: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
e020: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
e030: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
e040: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
e050: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
e060: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
e070: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
e080: 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  et hold the expr
e090: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
e0a0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
e0b0: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
e0c0: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
e0d0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
e0e0: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
e0f0: 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
e100: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
e110: 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
e120: 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
e130: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
e140: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
e150: 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
e160: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
e170: 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
e180: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
e190: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
e1a0: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
e1b0: 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
e1c0: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
e1d0: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
e1e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
e1f0: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
e200: 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
e210: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
e220: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
e230: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
e240: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
e250: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
e260: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
e270: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
e280: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
e290: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
e2a0: 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75  s.** (usually bu
e2b0: 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29  t not always -1)
e2c0: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
e2d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
e2e0: 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
e2f0: 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21  t!=0 or pOffset!
e300: 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
e310: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
e320: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
e330: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
e340: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
e350: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
e360: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
e370: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
e380: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
e390: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
e3a0: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
e3b0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
e3c0: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
e3d0: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
e3e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
e3f0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
e400: 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
e410: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
e420: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
e430: 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72  fset;.  int addr
e440: 31 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  1;.  if( p->iLim
e450: 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  it ) return;..  
e460: 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  /* .  ** "LIMIT 
e470: 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
e480: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
e490: 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
e4a0: 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74  ontraversy about
e4b0: 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
e4c0: 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
e4d0: 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
e4e0: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
e4f0: 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
e500: 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
e510: 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
e520: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
e530: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
e540: 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20  iLimit = iLimit 
e550: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
e560: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
e570: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
e580: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
e590: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
e5a0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e5b0: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  rse, p->pLimit, 
e5c0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c  iLimit);.    sql
e5d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
e5e0: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
e5f0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 56 64 62  iLimit);.    Vdb
e600: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
e610: 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
e620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e630: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp2(v, OP_IfZe
e640: 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65  ro, iLimit, iBre
e650: 61 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ak);.  }.  if( p
e660: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
e670: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f   p->iOffset = iO
e680: 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  ffset = ++pParse
e690: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20  ->nMem;.    if( 
e6a0: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
e6b0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b     pParse->nMem+
e6c0: 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  +;   /* Allocate
e6d0: 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73 74   an extra regist
e6e0: 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66  er for limit+off
e6f0: 73 65 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  set */.    }.   
e700: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
e710: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
e720: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
e730: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  rn;.    sqlite3E
e740: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
e750: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66  p->pOffset, iOff
e760: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
e770: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
e780: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66  P_MustBeInt, iOf
e790: 66 73 65 74 29 3b 0a 20 20 20 20 56 64 62 65 43  fset);.    VdbeC
e7a0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
e7b0: 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
e7c0: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
e7d0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e7e0: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
e7f0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
e800: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e810: 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66 66  Integer, 0, iOff
e820: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
e830: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
e840: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 69 66 28   addr1);.    if(
e850: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
e860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e870: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c  ddOp3(v, OP_Add,
e880: 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74   iLimit, iOffset
e890: 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20  , iOffset+1);.  
e8a0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e8b0: 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45  (v, "LIMIT+OFFSE
e8c0: 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72  T"));.      addr
e8d0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
e8e0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
e8f0: 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  s, iLimit);.    
e900: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e910: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
e920: 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31  r, -1, iOffset+1
e930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e940: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
e950: 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20  addr1);.    }.  
e960: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
e970: 61 74 65 20 61 20 76 69 72 74 75 61 6c 20 69 6e  ate a virtual in
e980: 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 73  dex to use for s
e990: 6f 72 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  orting..*/.stati
e9a0: 63 20 76 6f 69 64 20 63 72 65 61 74 65 53 6f 72  c void createSor
e9b0: 74 69 6e 67 49 6e 64 65 78 28 50 61 72 73 65 20  tingIndex(Parse 
e9c0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
e9d0: 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  *p, ExprList *pO
e9e0: 72 64 65 72 42 79 29 7b 0a 20 20 69 66 28 20 70  rderBy){.  if( p
e9f0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
ea00: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 61 73 73  nt addr;.    ass
ea10: 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 69  ert( pOrderBy->i
ea20: 45 43 75 72 73 6f 72 3d 3d 30 20 29 3b 0a 20 20  ECursor==0 );.  
ea30: 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
ea40: 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
ea50: 54 61 62 2b 2b 3b 0a 20 20 20 20 61 64 64 72 20  Tab++;.    addr 
ea60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ea70: 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
ea80: 65 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  e, OP_OpenEpheme
ea90: 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eab0: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
eac0: 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  sor, pOrderBy->n
ead0: 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 61 73 73  Expr+1);.    ass
eae0: 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
eaf0: 45 70 68 6d 5b 32 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[2] == -1 );
eb00: 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
eb10: 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[2] = addr;.
eb20: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
eb30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
eb40: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
eb50: 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
eb60: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
eb70: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
eb80: 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
eb90: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75  n of.** the resu
eba0: 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63  lt set for the c
ebb0: 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73  ompound-select s
ebc0: 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52  tatement "p".  R
ebd0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a  eturn NULL if.**
ebe0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
ebf0: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
ec00: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
ec10: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
ec20: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
ec30: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
ec40: 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  ect is taken fro
ec50: 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  m the.** left-mo
ec60: 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73  st term of the s
ec70: 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61  elect that has a
ec80: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
ec90: 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  nce..*/.static C
eca0: 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c  ollSeq *multiSel
ecb0: 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ectCollSeq(Parse
ecc0: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
ecd0: 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
ece0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b    CollSeq *pRet;
ecf0: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
ed00: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d   ){.    pRet = m
ed10: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
ed20: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  q(pParse, p->pPr
ed30: 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65  ior, iCol);.  }e
ed40: 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  lse{.    pRet = 
ed50: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65  0;.  }.  if( pRe
ed60: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74  t==0 ){.    pRet
ed70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
ed80: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
ed90: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
eda0: 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  .pExpr);.  }.  r
edb0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
edc0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
edd0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
ede0: 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  ECT */../* Forwa
edf0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
ee00: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
ee10: 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
ee20: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ee30: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
ee40: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
ee50: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
ee60: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
ee70: 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
ee80: 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
ee90: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
eea0: 44 65 73 74 2c 20 20 20 20 2f 2a 20 57 68 61 74  Dest,    /* What
eeb0: 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
eec0: 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 63  y results */.  c
eed0: 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
eee0: 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74       /* If eDest
eef0: 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   is SRT_Union, t
ef00: 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
ef10: 6e 67 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64  ng */.);...#ifnd
ef20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
ef30: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
ef40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ef50: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
ef60: 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e  rocess a compoun
ef70: 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f  d query form fro
ef80: 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65  m.** two or more
ef90: 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65   separate querie
efa0: 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55  s using UNION, U
efb0: 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54  NION ALL, EXCEPT
efc0: 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43  , or.** INTERSEC
efd0: 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e  T.**.** "p" poin
efe0: 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ts to the right-
eff0: 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20  most of the two 
f000: 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75  queries.  the qu
f010: 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65  ery on the.** le
f020: 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e  ft is p->pPrior.
f030: 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79    The left query
f040: 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61   could also be a
f050: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a   compound query.
f060: 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  ** in which case
f070: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
f080: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63  ll be called rec
f090: 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a  ursively. .**.**
f0a0: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
f0b0: 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
f0c0: 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  are to be writte
f0d0: 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61  n into a destina
f0e0: 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20  tion.** of type 
f0f0: 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d  eDest with param
f100: 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  eter iParm..**.*
f110: 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f  * Example 1:  Co
f120: 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77  nsider a three-w
f130: 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20  ay compound SQL 
f140: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
f150: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
f160: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
f170: 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT b FROM t2 UNI
f180: 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  ON SELECT c FROM
f190: 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73   t3.**.** This s
f1a0: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
f1b0: 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73  ed up as follows
f1c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
f1d0: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20  CT c FROM t3.** 
f1e0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60       |.**      `
f1f0: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62  ----->  SELECT b
f200: 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20   FROM t2.**     
f210: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
f220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60                 `
f230: 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  ------>  SELECT 
f240: 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20  a FROM t1.**.** 
f250: 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68  The arrows in th
f260: 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20  e diagram above 
f270: 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65  represent the Se
f280: 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e  lect.pPrior poin
f290: 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68  ter..** So if th
f2a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
f2b0: 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61  lled with p equa
f2c0: 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72  l to the t3 quer
f2d0: 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f  y, then.** pPrio
f2e0: 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32  r will be the t2
f2f0: 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77   query.  p->op w
f300: 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20  ill be TK_UNION 
f310: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
f320: 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20  .** Notice that 
f330: 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
f340: 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73  ay SQLite parses
f350: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
f360: 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  s, the.** indivi
f370: 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77  dual selects alw
f380: 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c  ays group from l
f390: 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f  eft to right..*/
f3a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
f3b0: 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  iSelect(.  Parse
f3c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
f3d0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
f3e0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
f3f0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
f400: 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
f410: 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
f420: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
f430: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
f440: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
f450: 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
f460: 6c 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  lts */.  char *a
f470: 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ff             /
f480: 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52  * If eDest is SR
f490: 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66  T_Union, the aff
f4a0: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
f4b0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
f4c0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75  LITE_OK;   /* Su
f4d0: 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
f4e0: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
f4f0: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
f500: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
f510: 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
f520: 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
f530: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f550: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
f560: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
f570: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
f580: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f590: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
f5a0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
f5b0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
f5c0: 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
f5d0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
f5e0: 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 61 53 65  n p */.  int aSe
f5f0: 74 50 32 5b 32 5d 3b 20 20 20 20 20 20 20 20 2f  tP2[2];        /
f600: 2a 20 53 65 74 20 50 32 20 76 61 6c 75 65 20 6f  * Set P2 value o
f610: 66 20 74 68 65 73 65 20 6f 70 20 74 6f 20 6e 75  f these op to nu
f620: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
f630: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74 50 32 20  */.  int nSetP2 
f640: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
f650: 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e  mber of slots in
f660: 20 61 53 65 74 50 32 5b 5d 20 75 73 65 64 20 2a   aSetP2[] used *
f670: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
f680: 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
f690: 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
f6a0: 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53  stination */.  S
f6b0: 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d  elect *pDelete =
f6c0: 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66   0;  /* Chain of
f6d0: 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20   simple selects 
f6e0: 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 0a 20 20  to delete */..  
f6f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
f700: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
f710: 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
f720: 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
f730: 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
f740: 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
f750: 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
f760: 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
f770: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
f780: 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
f790: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
f7a0: 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
f7b0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
f7c0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
f7d0: 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20  d;.  }.  pPrior 
f7e0: 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
f7f0: 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
f800: 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f  Rightmost!=pPrio
f810: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
f820: 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
f830: 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t==p->pRightmost
f840: 20 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72   );.  if( pPrior
f850: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
f860: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f870: 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20  g(pParse,"ORDER 
f880: 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  BY clause should
f890: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
f8a0: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
f8b0: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
f8c0: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
f8d0: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
f8e0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
f8f0: 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d   }.  if( pPrior-
f900: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >pLimit ){.    s
f910: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f920: 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61  Parse,"LIMIT cla
f930: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
f940: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
f950: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
f960: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
f970: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
f980: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f990: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
f9a0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
f9b0: 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65  have a valid que
f9c0: 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e  ry engine.  If n
f9d0: 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ot, create a new
f9e0: 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d   one..  */.  v =
f9f0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
fa00: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
fa10: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
fa20: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
fa30: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
fa40: 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  }..  /* Create t
fa50: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
fa60: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
fa70: 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
fa80: 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
fa90: 3b 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65  ;.  if( dest.eDe
faa0: 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
fab0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
fac0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
fad0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fae0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
faf0: 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 50 61  emeral, dest.iPa
fb00: 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  rm, p->pEList->n
fb10: 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e  Expr);.    dest.
fb20: 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c  eDest = SRT_Tabl
fb30: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  e;.  }..  /* Mak
fb40: 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43  e sure all SELEC
fb50: 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  Ts in the statem
fb60: 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ent have the sam
fb70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
fb80: 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ents.  ** in the
fb90: 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ir result sets..
fba0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
fbb0: 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
fbc0: 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
fbd0: 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
fbe0: 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr!=pPrior->pE
fbf0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
fc00: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
fc10: 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
fc20: 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
fc30: 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
fc40: 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20  .      " do not 
fc50: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
fc60: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
fc70: 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f  olumns", selectO
fc80: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
fc90: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
fca0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
fcb0: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 23 69 66 20 31  _end;.  }..#if 1
fcc0: 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
fcd0: 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  By ){.    return
fce0: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
fcf0: 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  rBy(pParse, p, p
fd00: 44 65 73 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a  Dest, aff);.  }.
fd10: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
fd20: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
fd30: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
fd40: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
fd50: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 64  nts..  */.  pOrd
fd60: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
fd70: 42 79 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  By;.  switch( p-
fd80: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
fd90: 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  TK_ALL: {.      
fda0: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
fdb0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
fdc0: 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ddr = 0;.       
fdd0: 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
fde0: 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20  ->pLimit );.    
fdf0: 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d      pPrior->pLim
fe00: 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
fe10: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
fe20: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
fe30: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72 63  fset;.        rc
fe40: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
fe50: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
fe60: 20 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c   &dest, 0, 0, 0,
fe70: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70   aff);.        p
fe80: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
fe90: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
fea0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
feb0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
fec0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
fed0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
fee0: 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50   }.        p->pP
fef0: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
ff00: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
ff10: 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
ff20: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
ff30: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
ff40: 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
ff50: 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
ff60: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
ff70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ff80: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
ff90: 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >iLimit);.      
ffa0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
ffb0: 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20  (v, "Jump ahead 
ffc0: 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64  if LIMIT reached
ffd0: 22 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  "));.        }. 
ffe0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
fff0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
10000 2c 20 70 2c 20 26 64 65 73 74 2c 20 30 2c 20 30  , p, &dest, 0, 0
10010 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
10020 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
10030 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
10040 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
10050 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
10060 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
10070 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
10080 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
10090 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
100a0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
100b0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
100c0 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
100d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
100e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
100f0 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e      /* For UNION
10100 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42   ALL ... ORDER B
10110 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  Y fall through t
10120 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20  o the next case 
10130 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
10140 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
10150 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
10160 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
10170 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
10180 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
10190 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
101a0 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
101b0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  */.      int op 
101c0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65  = 0;      /* One
101d0 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
101e0 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
101f0 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
10200 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
10210 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
10220 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
10230 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
10240 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
10250 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
10260 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
10270 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
10280 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
10290 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
102a0 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
102b0 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a  est uniondest;..
102c0 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
102d0 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20  p->op==TK_ALL ? 
102e0 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f  SRT_Table : SRT_
102f0 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  Union;.      if(
10300 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69   dest.eDest==pri
10310 6f 72 4f 70 20 26 26 20 70 4f 72 64 65 72 42 79  orOp && pOrderBy
10320 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69  ==0 && !p->pLimi
10330 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74  t && !p->pOffset
10340 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
10350 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
10360 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
10370 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
10380 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
10390 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
103a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
103b0 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
103c0 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  iParm;.      }el
103d0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
103e0 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
103f0 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
10400 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
10410 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
10420 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
10430 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
10440 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
10450 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
10460 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
10470 20 69 66 28 20 70 72 6f 63 65 73 73 43 6f 6d 70   if( processComp
10480 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50 61 72  oundOrderBy(pPar
10490 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62 29  se, p, unionTab)
104a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
104b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
104c0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
104d0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
104e0 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
104f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10500 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
10510 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  meral, unionTab,
10520 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
10530 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54 5f 54 61   priorOp==SRT_Ta
10540 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ble ){.         
10550 20 61 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c   assert( nSetP2<
10560 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73  sizeof(aSetP2)/s
10570 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29  izeof(aSetP2[0])
10580 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 53   );.          aS
10590 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d  etP2[nSetP2++] =
105a0 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 7d   addr;.        }
105b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
105c0 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
105d0 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
105e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   );.          p-
105f0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
10600 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
10610 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
10620 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 31 3b 0a  ->usesEphm = 1;.
10630 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10640 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49    createSortingI
10650 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20  ndex(pParse, p, 
10660 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
10670 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
10680 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
10690 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
106a0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
106b0 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
106c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
106d0 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
106e0 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
106f0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
10700 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64  DestInit(&uniond
10710 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  est, priorOp, un
10720 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 72  ionTab);.      r
10730 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
10740 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
10750 2c 20 26 75 6e 69 6f 6e 64 65 73 74 2c 20 30 2c  , &uniondest, 0,
10760 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
10770 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10780 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
10790 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
107a0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
107b0 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
107c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
107d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
107e0 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
107f0 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
10800 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53  _EXCEPT:  op = S
10810 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65  RT_Except;   bre
10820 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
10830 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70  e TK_UNION:   op
10840 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20   = SRT_Union;   
10850 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10860 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
10870 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65    op = SRT_Table
10880 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
10890 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
108a0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
108b0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
108c0 20 20 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f        p->disallo
108d0 77 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  wOrderBy = pOrde
108e0 72 42 79 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c  rBy!=0;.      pL
108f0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
10900 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
10910 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
10920 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
10930 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
10940 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  set = 0;.      u
10950 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
10960 20 6f 70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   op;.      rc = 
10970 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
10980 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
10990 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  est, 0, 0, 0, af
109a0 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65  f);.      /* Que
109b0 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
109c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
109d0 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
109e0 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
109f0 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
10a00 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
10a10 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
10a20 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
10a30 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73  leak. */.      s
10a40 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
10a50 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79  lete(p->pOrderBy
10a60 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
10a70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
10a80 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
10a90 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
10aa0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
10ab0 65 72 42 79 3b 0a 20 20 20 20 20 20 73 71 6c 69  erBy;.      sqli
10ac0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
10ad0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
10ae0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
10af0 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
10b00 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
10b10 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
10b20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  = 0;.      p->iO
10b30 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
10b40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
10b50 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
10b60 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
10b70 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  }...      /* Con
10b80 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e  vert the data in
10b90 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
10ba0 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76  able into whatev
10bb0 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  er form.      **
10bc0 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
10bd0 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
10be0 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20       */      .  
10bf0 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
10c00 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75  st!=priorOp || u
10c10 6e 69 6f 6e 54 61 62 21 3d 64 65 73 74 2e 69 50  nionTab!=dest.iP
10c20 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arm ){.        i
10c30 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
10c40 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
10c50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
10c60 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
10c70 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
10c80 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
10c90 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
10ca0 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
10cb0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
10cc0 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
10cd0 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
10ce0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
10cf0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
10d00 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
10d10 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
10d20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10d30 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
10d40 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
10d50 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43  l(v);.        iC
10d60 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
10d70 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
10d80 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
10d90 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
10da0 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
10db0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10dc0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10dd0 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61  _Rewind, unionTa
10de0 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  b, iBreak);.    
10df0 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
10e00 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
10e10 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
10e20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
10e30 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
10e40 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  List, unionTab, 
10e50 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
10e60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10e70 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
10e80 42 79 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69  By, -1, &dest, i
10e90 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29  Cont, iBreak, 0)
10ea0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10eb0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
10ec0 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
10ed0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10ee0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
10ef0 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
10f00 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  art);.        sq
10f10 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
10f20 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
10f30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10f40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10f50 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
10f60 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
10f70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10f80 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
10f90 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20  TERSECT: {.     
10fa0 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
10fb0 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
10fc0 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
10fd0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
10fe0 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
10ff0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
11000 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
11010 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
11020 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20        int r1;.. 
11030 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
11040 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
11050 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
11060 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
11070 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
11080 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
11090 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
110a0 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
110b0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
110c0 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
110d0 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
110e0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
110f0 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
11100 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
11110 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
11120 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
11130 70 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f  processCompoundO
11140 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70  rderBy(pParse, p
11150 2c 20 74 61 62 31 29 20 29 7b 0a 20 20 20 20 20  , tab1) ){.     
11160 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
11170 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
11180 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
11190 7d 0a 20 20 20 20 20 20 63 72 65 61 74 65 53 6f  }.      createSo
111a0 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73  rtingIndex(pPars
111b0 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b  e, p, pOrderBy);
111c0 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ..      addr = s
111d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
111e0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
111f0 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a  eral, tab1, 0);.
11200 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
11210 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
11220 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
11230 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
11240 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
11250 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e   p->pRightmost->
11260 75 73 65 73 45 70 68 6d 20 3d 20 31 3b 0a 20 20  usesEphm = 1;.  
11270 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
11280 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20  EList );..      
11290 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
112a0 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
112b0 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
112c0 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
112d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
112e0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
112f0 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  t(&intersectdest
11300 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
11310 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  1);.      rc = s
11320 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
11330 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e  rse, pPrior, &in
11340 74 65 72 73 65 63 74 64 65 73 74 2c 20 30 2c 20  tersectdest, 0, 
11350 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
11360 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
11370 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
11380 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
11390 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
113a0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
113b0 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72  LECT into tempor
113c0 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22  ary table "tab2"
113d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
113e0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
113f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
11400 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
11410 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b2, 0);.      as
11420 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
11430 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29  nEphm[1] == -1 )
11440 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
11450 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64  penEphm[1] = add
11460 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
11470 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
11480 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
11490 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
114a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
114b0 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
114c0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
114d0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
114e0 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 50 61  ntersectdest.iPa
114f0 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20  rm = tab2;.     
11500 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
11510 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
11520 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 30  intersectdest, 0
11530 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
11540 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
11550 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
11560 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
11570 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
11580 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
11590 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
115a0 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
115b0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
115c0 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
115d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
115e0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
115f0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11600 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
11610 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
11620 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
11630 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
11640 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
11650 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
11660 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
11670 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
11680 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
11690 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
116a0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c  k ){.        Sel
116b0 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
116c0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
116d0 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
116e0 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
116f0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
11700 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
11710 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
11720 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
11730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11740 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
11750 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11760 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20  ;.      iCont = 
11770 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
11780 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63  abel(v);.      c
11790 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
117a0 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
117b0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
117c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
117d0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
117e0 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ab1, iBreak);.  
117f0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
11800 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
11810 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  e);.      iStart
11820 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
11830 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65  dOp2(v, OP_RowKe
11840 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20  y, tab1, r1);.  
11850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11860 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 46  ddOp3(v, OP_NotF
11870 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
11880 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  t, r1);.      sq
11890 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
118a0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
118b0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
118c0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
118d0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
118e0 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  1, p->pEList->nE
118f0 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
11900 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
11910 72 42 79 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20  rBy, -1, &dest, 
11920 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30  iCont, iBreak, 0
11930 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11940 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
11950 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
11960 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11970 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
11980 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20  tab1, iStart);. 
11990 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
119a0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
119b0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
119c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
119d0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
119e0 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
119f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11a00 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
11a10 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
11a20 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
11a30 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
11a40 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
11a50 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
11a60 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20  s.  */.  nCol = 
11a70 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
11a80 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 65 74 50  ;.  while( nSetP
11a90 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  2 ){.    sqlite3
11aa0 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
11ab0 61 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50 32 5d  aSetP2[--nSetP2]
11ac0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20  , nCol);.  }..  
11ad0 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
11ae0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
11af0 73 65 64 20 62 79 20 65 69 74 68 65 72 20 74 68  sed by either th
11b00 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
11b10 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79  e or.  ** by any
11b20 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
11b30 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
11b40 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
11b50 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
11b60 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
11b70 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
11b80 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
11b90 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68  bles.  Invoke th
11ba0 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20  e.  ** ORDER BY 
11bb0 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74 68  processing if th
11bc0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
11bd0 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  BY clause..  **.
11be0 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
11bf0 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
11c00 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
11c10 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
11c20 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
11c30 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
11c40 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
11c50 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
11c60 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
11c70 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
11c80 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
11c90 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
11ca0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
11cb0 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
11cc0 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
11cd0 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
11ce0 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 75  pOrderBy || p->u
11cf0 73 65 73 45 70 68 6d 20 29 7b 0a 20 20 20 20 69  sesEphm ){.    i
11d00 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11d20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
11d30 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
11d40 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
11d50 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
11d60 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
11d70 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
11d80 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11da0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
11db0 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
11dc0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
11dd0 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  int nKeyCol;    
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11df0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
11e00 65 73 20 69 6e 20 70 4b 65 79 49 6e 66 6f 2d 3e  es in pKeyInfo->
11e10 61 43 6f 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f  aCol[] */.    Co
11e20 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
11e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11e40 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
11e50 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
11e60 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ll[] */.    Coll
11e70 53 65 71 20 2a 2a 61 43 6f 70 79 3b 20 20 20 20  Seq **aCopy;    
11e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
11e90 6f 70 79 20 6f 66 20 70 4b 65 79 49 6e 66 6f 2d  opy of pKeyInfo-
11ea0 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 0a 20 20 20  >aColl[] */..   
11eb0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
11ec0 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
11ed0 20 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20   nKeyCol = nCol 
11ee0 2b 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70 4f  + (pOrderBy ? pO
11ef0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20  rderBy->nExpr : 
11f00 30 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  0);.    pKeyInfo
11f10 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
11f20 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
11f30 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
11f40 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
11f50 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 4b 65 79  (*pKeyInfo)+nKey
11f60 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  Col*(sizeof(Coll
11f70 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20  Seq*) + 1));.   
11f80 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29   if( !pKeyInfo )
11f90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
11fa0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
11fb0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
11fc0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20  ct_end;.    }.. 
11fd0 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63     pKeyInfo->enc
11fe0 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
11ff0 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  b);.    pKeyInfo
12000 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b  ->nField = nCol;
12010 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61  ..    for(i=0, a
12020 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  pColl=pKeyInfo->
12030 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  aColl; i<nCol; i
12040 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20  ++, apColl++){. 
12050 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d       *apColl = m
12060 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
12070 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
12080 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61  .      if( 0==*a
12090 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
120a0 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73   *apColl = pPars
120b0 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
120c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
120d0 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
120e0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
120f0 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
12100 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12110 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
12120 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
12130 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
12140 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
12150 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
12160 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
12170 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
12180 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
12190 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
121a0 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
121b0 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
121c0 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
121d0 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
121e0 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
121f0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
12200 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
12210 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
12220 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
12230 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
12240 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
12250 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
12260 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12270 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
12280 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49  dr, (char*)pKeyI
12290 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
122a0 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
122b0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
122c0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
122d0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
122e0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
122f0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
12300 69 74 65 6d 20 2a 70 4f 54 65 72 6d 20 3d 20 70  item *pOTerm = p
12310 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20 20  OrderBy->a;.    
12320 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 45 78    int nOrderByEx
12330 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  pr = pOrderBy->n
12340 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
12350 61 64 64 72 3b 0a 20 20 20 20 20 20 75 38 20 2a  addr;.      u8 *
12360 70 53 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20  pSortOrder;..   
12370 20 20 20 2f 2a 20 52 65 75 73 65 20 74 68 65 20     /* Reuse the 
12380 73 61 6d 65 20 70 4b 65 79 49 6e 66 6f 20 66 6f  same pKeyInfo fo
12390 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  r the ORDER BY a
123a0 73 20 77 61 73 20 75 73 65 64 20 61 62 6f 76 65  s was used above
123b0 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68   for.      ** th
123c0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
123d0 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 45  t statements.  E
123e0 78 63 65 70 74 20 77 65 20 68 61 76 65 20 74 6f  xcept we have to
123f0 20 63 68 61 6e 67 65 20 6f 75 74 20 74 68 65 0a   change out the.
12400 20 20 20 20 20 20 2a 2a 20 70 4b 65 79 49 6e 66        ** pKeyInf
12410 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65  o->aColl[] value
12420 73 2e 20 20 53 6f 6d 65 20 6f 66 20 74 68 65 20  s.  Some of the 
12430 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73 20 77  aColl[] values w
12440 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ill be.      ** 
12450 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e 73  reused when cons
12460 74 72 75 63 74 69 6e 67 20 74 68 65 20 70 4b 65  tructing the pKe
12470 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f 52  yInfo for the OR
12480 44 45 52 20 42 59 2c 20 73 6f 20 6d 61 6b 65 0a  DER BY, so make.
12490 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 2e        ** a copy.
124a0 20 20 53 75 66 66 69 63 69 65 6e 74 20 73 70 61    Sufficient spa
124b0 63 65 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20  ce to hold both 
124c0 74 68 65 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73  the nCol entries
124d0 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68   for.      ** th
124e0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
124f0 74 20 61 6e 64 20 74 68 65 20 6e 4f 72 64 65 72  t and the nOrder
12500 62 79 45 78 70 72 20 65 6e 74 72 69 65 73 20 66  byExpr entries f
12510 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  or the ORDER BY.
12520 20 20 20 20 20 20 2a 2a 20 77 61 73 20 61 6c 6c        ** was all
12530 6f 63 61 74 65 64 20 61 62 6f 76 65 2e 20 20 42  ocated above.  B
12540 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 6f  ut we need to mo
12550 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ve the compound 
12560 73 65 6c 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  select.      ** 
12570 65 6e 74 72 69 65 73 20 6f 75 74 20 6f 66 20 74  entries out of t
12580 68 65 20 77 61 79 20 62 65 66 6f 72 65 20 63 6f  he way before co
12590 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 4f  nstructing the O
125a0 52 44 45 52 20 42 59 20 65 6e 74 72 69 65 73 2e  RDER BY entries.
125b0 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20 74  .      ** Move t
125c0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
125d0 63 74 20 65 6e 74 72 69 65 73 20 69 6e 74 6f 20  ct entries into 
125e0 61 43 6f 70 79 5b 5d 20 77 68 65 72 65 20 74 68  aCopy[] where th
125f0 65 79 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20  ey can be.      
12600 2a 2a 20 61 63 63 65 73 73 65 64 20 61 6e 64 20  ** accessed and 
12610 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e 73  reused when cons
12620 74 72 75 63 74 69 6e 67 20 74 68 65 20 4f 52 44  tructing the ORD
12630 45 52 20 42 59 20 65 6e 74 72 69 65 73 2e 0a 20  ER BY entries.. 
12640 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
12650 6e 43 6f 6c 20 6d 69 67 68 74 20 62 65 20 67 72  nCol might be gr
12660 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 6c 65  eater than or le
12670 73 73 20 74 68 61 6e 20 6e 4f 72 64 65 72 42 79  ss than nOrderBy
12680 45 78 70 72 0a 20 20 20 20 20 20 2a 2a 20 77 65  Expr.      ** we
12690 20 68 61 76 65 20 74 6f 20 75 73 65 20 6d 65 6d   have to use mem
126a0 6d 6f 76 65 28 29 20 77 68 65 6e 20 64 6f 69 6e  move() when doin
126b0 67 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20 20  g the copy..    
126c0 20 20 2a 2f 0a 20 20 20 20 20 20 61 43 6f 70 79    */.      aCopy
126d0 20 3d 20 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43   = &pKeyInfo->aC
126e0 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 45 78 70 72  oll[nOrderByExpr
126f0 5d 3b 0a 20 20 20 20 20 20 70 53 6f 72 74 4f 72  ];.      pSortOr
12700 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  der = pKeyInfo->
12710 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
12720 2a 29 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d 3b 0a  *)&aCopy[nCol];.
12730 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 61 43        memmove(aC
12740 6f 70 79 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  opy, pKeyInfo->a
12750 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f  Coll, nCol*sizeo
12760 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 0a 20  f(CollSeq*));.. 
12770 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d 20 70 4b       apColl = pK
12780 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20  eyInfo->aColl;. 
12790 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
127a0 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 20 69 2b  nOrderByExpr; i+
127b0 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20 61 70 43  +, pOTerm++, apC
127c0 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72 64 65  oll++, pSortOrde
127d0 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  r++){.        Ex
127e0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 54 65  pr *pExpr = pOTe
127f0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
12800 20 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e 66     if( (pExpr->f
12810 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
12820 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  late) ){.       
12830 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
12840 2d 3e 70 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20  ->pColl!=0 );.  
12850 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
12860 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a  = pExpr->pColl;.
12870 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
12880 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c           *apColl
12890 20 3d 20 61 43 6f 70 79 5b 70 45 78 70 72 2d 3e   = aCopy[pExpr->
128a0 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20  iColumn];.      
128b0 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 53 6f    }.        *pSo
128c0 72 74 4f 72 64 65 72 20 3d 20 70 4f 54 65 72 6d  rtOrder = pOTerm
128d0 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
128e0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
128f0 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t( p->pRightmost
12900 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==p );.      ass
12910 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
12920 45 70 68 6d 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20  Ephm[2]>=0 );.  
12930 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 61 64      addr = p->ad
12940 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3b 0a 20  drOpenEphm[2];. 
12950 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12960 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
12970 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  , p->pOrderBy->n
12980 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 20 20 70  Expr+2);.      p
12990 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
129a0 3d 20 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 0a  = nOrderByExpr;.
129b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
129c0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
129d0 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  r, (char*)pKeyIn
129e0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
129f0 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 70  ANDOFF);.      p
12a00 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20  KeyInfo = 0;.   
12a10 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
12a20 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76  ail(pParse, p, v
12a30 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
12a40 70 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  pr, &dest);.    
12a50 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  }..    sqlite3_f
12a60 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ree(pKeyInfo);. 
12a70 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
12a80 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69  _end:.  pDest->i
12a90 4d 65 6d 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b  Mem = dest.iMem;
12aa0 0a 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d  .  pDest->nMem =
12ab0 20 64 65 73 74 2e 6e 4d 65 6d 3b 0a 20 20 73 71   dest.nMem;.  sq
12ac0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
12ad0 65 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  e(pDelete);.  re
12ae0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
12af0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12b00 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
12b10 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
12b20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
12b30 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
12b40 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
12b50 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
12b60 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
12b70 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
12b80 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
12b90 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 4d  ained in pIn->iM
12ba0 65 6d 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a  em.  There are.*
12bb0 2a 20 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75  * pIn->nMem colu
12bc0 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74  mns to be output
12bd0 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72  .  pDest is wher
12be0 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f  e the output sho
12bf0 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a  uld.** be sent..
12c00 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20  **.** regReturn 
12c10 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
12c20 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f   the register ho
12c30 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  lding the subrou
12c40 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61  tine.** return a
12c50 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ddress..**.** If
12c60 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
12c70 69 74 20 69 73 20 61 20 74 68 65 20 66 69 72 73  it is a the firs
12c80 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
12c90 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
12ca0 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
12cb0 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
12cc0 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
12cd0 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
12ce0 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
12cf0 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
12d00 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
12d10 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
12d20 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
12d30 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
12d40 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
12d50 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
12d60 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
12d70 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
12d80 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
12d90 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
12da0 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
12db0 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
12dc0 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
12dd0 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
12de0 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
12df0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12e00 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
12e10 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
12e20 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
12e30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
12e40 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
12e50 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
12e60 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
12e70 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
12e80 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
12e90 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
12ea0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
12eb0 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
12ec0 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
12ed0 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
12ee0 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
12ef0 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
12f00 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
12f10 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
12f20 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
12f30 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
12f40 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
12f50 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
12f60 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
12f70 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
12f80 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
12f90 69 6e 74 20 70 34 74 79 70 65 2c 20 20 20 20 20  int p4type,     
12fa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
12fb0 34 20 74 79 70 65 20 66 6f 72 20 70 4b 65 79 49  4 type for pKeyI
12fc0 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  nfo */.  int iBr
12fd0 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
12fe0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
12ff0 20 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49   we hit the LIMI
13000 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  T */.){.  Vdbe *
13010 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
13020 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  e;.  int iContin
13030 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  ue;.  int addr;.
13040 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
13050 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13060 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 61 64   return 0;..  ad
13070 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
13080 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
13090 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71    iContinue = sq
130a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
130b0 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70  el(v);..  /* Sup
130c0 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
130d0 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45   for UNION, EXCE
130e0 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43  PT, and INTERSEC
130f0 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  T .  */.  if( re
13100 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74  gPrev ){.    int
13110 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20   j1, j2;.    j1 
13120 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13130 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
13140 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 6a   regPrev);.    j
13150 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
13160 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
13170 61 72 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  are, pIn->iMem, 
13180 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
13190 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  nMem,.          
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131b0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
131c0 6e 66 6f 2c 20 70 34 74 79 70 65 29 3b 0a 20 20  nfo, p4type);.  
131d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
131e0 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
131f0 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  j2+2, iContinue,
13200 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69   j2+2);.    sqli
13210 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
13220 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69  v, j1);.    sqli
13230 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
13240 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65  pParse, pIn->iMe
13250 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  m, regPrev+1, pI
13260 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 73 71  n->nMem);.    sq
13270 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13280 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
13290 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a  , regPrev);.  }.
132a0 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74  .  /* Suppress t
132b0 68 65 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  he the first OFF
132c0 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74  SET entries if t
132d0 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45  here is an OFFSE
132e0 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  T clause.  */.  
132f0 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
13300 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20   iContinue);..  
13310 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65  switch( pDest->e
13320 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  Dest ){.    /* S
13330 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
13340 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
13350 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
13360 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
13370 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
13380 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
13390 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
133a0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
133b0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
133c0 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
133d0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
133e0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
133f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
13400 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
13410 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d  n->iMem, pIn->nM
13420 65 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  em, r1);.      s
13430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13440 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
13450 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72   pDest->iParm, r
13460 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
13470 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
13480 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  P_Insert, pDest-
13490 3e 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b  >iParm, r1, r2);
134a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
134b0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
134c0 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
134d0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
134e0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
134f0 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
13500 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
13510 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
13520 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13530 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
13540 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
13550 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
13560 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
13570 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
13580 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
13590 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a  onstruct,.    **
135a0 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75   then there shou
135b0 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69  ld be a single i
135c0 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
135d0 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20  .  Write this.  
135e0 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74    ** item into t
135f0 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74  he set table wit
13600 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20  h bogus data..  
13610 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
13620 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
13630 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73  nt r1;.      ass
13640 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d  ert( pIn->nMem==
13650 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66  1 );.      p->af
13660 66 69 6e 69 74 79 20 3d 20 0a 20 20 20 20 20 20  finity = .      
13670 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
13680 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c  eAffinity(p->pEL
13690 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
136a0 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
136b0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
136c0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
136d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
136e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
136f0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
13700 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c  d, pIn->iMem, 1,
13710 20 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74   r1, &p->affinit
13720 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  y, 1);.      sql
13730 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
13740 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
13750 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31  se, pIn->iMem, 1
13760 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13770 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13780 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73  _IdxInsert, pDes
13790 74 2d 3e 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t->iParm, r1);. 
137a0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
137b0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
137c0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
137d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
137e0 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
137f0 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
13800 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
13810 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
13820 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
13830 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
13840 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13850 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
13860 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74  nteger, 1, pDest
13870 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  ->iParm);.      
13880 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
13890 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
138a0 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
138b0 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
138c0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
138d0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
138e0 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
138f0 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
13900 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
13910 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
13920 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
13930 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
13940 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
13950 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
13960 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
13970 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
13980 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
13990 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65  assert( pIn->nMe
139a0 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  m==1 );.      sq
139b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
139c0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
139d0 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  Mem, pDest->iPar
139e0 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
139f0 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
13a00 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
13a10 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
13a20 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
13a30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
13a40 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
13a50 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
13a60 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74  /..    /* Send t
13a70 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63  he data to the c
13a80 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
13a90 20 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74   or to a subrout
13aa0 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20  ine.  In the.   
13ab0 20 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75   ** case of a su
13ac0 62 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75  broutine, the su
13ad0 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20  broutine itself 
13ae0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
13af0 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e  or.    ** poppin
13b00 67 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20  g the data from 
13b10 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
13b20 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  /.    case SRT_C
13b30 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  oroutine: {.    
13b40 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d 65    if( pDest->iMe
13b50 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
13b60 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71  pDest->iMem = sq
13b70 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
13b80 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
13b90 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 44  Mem);.        pD
13ba0 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d  est->nMem = pIn-
13bb0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >nMem;.      }. 
13bc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13bd0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
13be0 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73   pIn->iMem, pDes
13bf0 74 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e  t->iMem, pDest->
13c00 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  nMem);.      sql
13c10 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13c20 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
13c30 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  t->iParm);.     
13c40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
13c50 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c     case SRT_Call
13c60 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 73 71  back: {.      sq
13c70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13c80 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
13c90 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d   pIn->iMem, pIn-
13ca0 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71  >nMem);.      sq
13cb0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
13cc0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
13cd0 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  rse, pIn->iMem, 
13ce0 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  pIn->nMem);.    
13cf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
13d00 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
13d10 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
13d20 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64  ).    /* Discard
13d30 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
13d40 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
13d50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13d60 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20  s inside.    ** 
13d70 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52  the body of a TR
13d80 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70  IGGER.  The purp
13d90 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65  ose of such sele
13da0 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20  cts is to call. 
13db0 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e     ** user-defin
13dc0 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ed functions tha
13dd0 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65  t have side effe
13de0 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  cts.  We do not 
13df0 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75  care.    ** abou
13e00 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73  t the actual res
13e10 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
13e20 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ct..    */.    d
13e30 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
13e40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
13e50 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
13e60 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
13e70 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
13e80 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
13e90 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
13ea0 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
13eb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13ec0 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70  (v, OP_AddImm, p
13ed0 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20  ->iLimit, -1);. 
13ee0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13ef0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp2(v, OP_IfZer
13f00 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
13f10 72 65 61 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  reak);.  }..  /*
13f20 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
13f30 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
13f40 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
13f50 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
13f60 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
13f70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13f80 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
13f90 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
13fa0 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
13fb0 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
13fc0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
13fd0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
13fe0 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
13ff0 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
14000 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
14010 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
14020 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
14030 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
14040 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
14050 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
14060 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
14070 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
14080 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
14090 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
140a0 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
140b0 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
140c0 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
140d0 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
140e0 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
140f0 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
14100 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
14110 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
14120 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
14130 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
14140 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
14150 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
14160 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
14170 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
14180 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
14190 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
141a0 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
141b0 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
141c0 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
141d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
141e0 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
141f0 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
14200 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
14210 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
14220 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
14230 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
14240 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
14250 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
14260 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
14270 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
14280 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
142a0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
142b0 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
142c0 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
142d0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
142e0 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
142f0 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
14300 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
14310 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
14320 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
14330 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
14340 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
14350 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
14360 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
14370 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
14380 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
14390 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
143a0 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
143b0 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
143c0 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
143d0 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
143e0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
143f0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
14400 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
14410 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
14420 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
14430 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
14440 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
14450 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
14460 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
14470 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
14480 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
14490 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
144a0 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
144b0 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
144c0 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
144d0 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
144e0 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
144f0 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
14500 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
14510 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
14520 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
14530 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
14540 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
14550 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
14560 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
14570 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
14580 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
14590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
145a0 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
145b0 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
145c0 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
145d0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
145e0 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
145f0 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
14600 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
14610 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
14620 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
14630 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
14640 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
14650 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
14660 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
14670 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
14680 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
14690 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
146a0 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
146b0 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
146c0 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
146d0 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
146e0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
146f0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
14700 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
14710 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
14720 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
14730 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
14740 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
14750 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
14760 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
14770 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
14780 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
14790 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
147a0 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
147b0 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
147c0 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
147d0 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
147e0 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
147f0 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
14800 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
14810 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
14820 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
14830 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
14840 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
14850 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
14860 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
14870 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
14880 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
14890 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
148a0 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
148b0 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
148c0 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
148d0 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
148e0 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
148f0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
14900 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
14910 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
14920 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
14930 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
14940 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
14950 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
14960 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
14970 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
14980 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
14990 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
149a0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
149b0 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
149c0 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
149d0 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
149e0 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
149f0 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
14a00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
14a10 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
14a20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
14a30 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
14a40 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
14a50 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
14a60 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
14a70 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
14a80 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
14a90 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
14aa0 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
14ab0 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
14ac0 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
14ad0 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
14ae0 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
14af0 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
14b00 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
14b10 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
14b20 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
14b30 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
14b40 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
14b50 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
14b60 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
14b70 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
14b80 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
14b90 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
14ba0 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
14bb0 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
14bc0 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
14bd0 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
14be0 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
14bf0 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
14c00 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
14c10 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
14c20 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
14c30 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
14c40 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
14c50 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
14c60 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
14c70 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
14c80 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
14c90 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
14ca0 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
14cb0 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
14cc0 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
14cd0 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
14ce0 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
14cf0 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
14d00 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
14d10 45 6f 66 42 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  EofB..*/.static 
14d20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
14d30 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
14d40 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
14d50 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
14d60 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
14d70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
14d80 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
14d90 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
14da0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
14db0 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
14dc0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
14dd0 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
14de0 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66  ts */.  char *af
14df0 66 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f             /*
14e00 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54   If eDest is SRT
14e10 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69  _Union, the affi
14e20 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
14e30 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
14e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
14e50 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
14e60 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
14e70 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
14e80 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
14e90 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
14ea0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
14eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
14ec0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
14ed0 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
14ee0 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20  lectDest destA; 
14ef0 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
14f00 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
14f10 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65   A */.  SelectDe
14f20 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a  st destB;     /*
14f30 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
14f40 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a   coroutine B */.
14f50 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20    int regAddrA; 
14f60 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
14f70 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
14f80 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
14f90 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45  ne */.  int regE
14fa0 6f 66 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ofA;          /*
14fb0 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74   Flag to indicat
14fc0 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 41 20  e when select-A 
14fd0 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20  is complete */. 
14fe0 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20   int regAddrB;  
14ff0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
15000 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
15010 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
15020 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f  e */.  int regEo
15030 66 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fB;          /* 
15040 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65  Flag to indicate
15050 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 42 20 69   when select-B i
15060 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20  s complete */.  
15070 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b  int addrSelectA;
15080 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
15090 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
150a0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
150b0 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b  int addrSelectB;
150c0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
150d0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
150e0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
150f0 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20  int regOutA;    
15100 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
15110 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
15120 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
15130 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
15140 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20  egOutB;         
15150 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
15160 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
15170 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
15180 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
15190 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tA;         /* A
151a0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
151b0 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
151c0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
151d0 75 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utB;         /* 
151e0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
151f0 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
15200 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
15210 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofA;         /*
15220 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
15230 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74  select-A-exhaust
15240 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
15250 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
15260 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
15270 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
15280 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
15290 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
152a0 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
152b0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
152c0 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
152d0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
152e0 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
152f0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
15300 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
15310 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
15320 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
15330 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
15340 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
15350 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
15360 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
15370 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
15380 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
15390 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
153a0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
153b0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
153c0 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
153d0 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
153e0 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
153f0 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
15400 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
15410 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
15420 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
15430 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
15440 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
15450 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
15460 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
15470 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
15480 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
15490 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
154a0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
154b0 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
154c0 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
154d0 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
154e0 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
154f0 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
15500 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
15510 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20  */.  int j1;    
15520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
15530 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
15540 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
15550 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
15560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15570 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
15580 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
15590 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
155a0 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
155b0 20 2a 70 4b 65 79 44 75 70 3b 20 20 20 20 20 2f   *pKeyDup;     /
155c0 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
155d0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
155e0 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
155f0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
15600 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
15610 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
15620 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
15630 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
15640 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
15650 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
15660 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
15670 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
15680 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
15690 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
156a0 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
156b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
156c0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
156d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
156e0 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
156f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
15700 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
15710 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
15720 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
15730 0a 20 20 75 38 20 4e 6f 74 55 73 65 64 3b 20 20  .  u8 NotUsed;  
15740 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d           /* Dumm
15750 79 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 0a  y variables */..
15760 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
15770 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 64 62  derBy!=0 );.  db
15780 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
15790 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
157a0 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  be;.  if( v==0 )
157b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
157c0 4f 4d 45 4d 3b 0a 20 20 6c 61 62 65 6c 45 6e 64  OMEM;.  labelEnd
157d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
157e0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
157f0 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
15800 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
15810 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
15820 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
15830 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
15840 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
15850 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
15860 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
15870 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
15880 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
15890 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
158a0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
158b0 20 20 20 69 66 28 20 70 72 6f 63 65 73 73 43 6f     if( processCo
158c0 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50  mpoundOrderBy(pP
158d0 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20  arse, p, 0) ){. 
158e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
158f0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
15900 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70      nOrderBy = p
15910 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
15920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72    }else{.    nOr
15930 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  derBy = 0;.  }. 
15940 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72   /* For operator
15950 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  s other than UNI
15960 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74  ON ALL we have t
15970 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
15980 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  .  ** the ORDER 
15990 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73  BY clause covers
159a0 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
159b0 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
159c0 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74  Add.  ** terms t
159d0 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
159e0 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61  lause as necessa
159f0 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ry..  */.  if( o
15a00 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
15a10 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61   for(i=1; db->ma
15a20 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26  llocFailed==0 &&
15a30 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   i<=p->pEList->n
15a40 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
15a50 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 4f 72    for(j=0; j<nOr
15a60 64 65 72 42 79 3b 20 6a 2b 2b 29 7b 0a 20 20 20  derBy; j++){.   
15a70 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d       Expr *pTerm
15a80 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a   = pOrderBy->a[j
15a90 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
15aa0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
15ab0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
15ac0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15ad0 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  ( (pTerm->flags 
15ae0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d  & EP_IntValue)!=
15af0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
15b00 20 70 54 65 72 6d 2d 3e 69 54 61 62 6c 65 3d 3d   pTerm->iTable==
15b10 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
15b20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
15b30 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
15b40 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
15b50 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
15b60 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52  arse, TK_INTEGER
15b70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
15b80 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
15b90 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
15ba0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
15bb0 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
15bc0 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
15bd0 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20     pNew->iTable 
15be0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  = i;.        pOr
15bf0 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
15c00 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
15c10 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
15c20 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 20 20  pNew, 0);.      
15c30 20 20 6e 4f 72 64 65 72 42 79 2b 2b 3b 0a 20 20    nOrderBy++;.  
15c40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15c50 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
15c60 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
15c70 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
15c80 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
15c90 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
15ca0 70 65 72 6d 75 74 61 74 69 6f 6e 20 69 6e 20 6f  permutation in o
15cb0 72 64 65 72 20 74 6f 20 63 6f 6d 70 61 72 69 73  rder to comparis
15cc0 6f 6e 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ons to determine
15cd0 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a   if the next.  *
15ce0 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73  * row of results
15cf0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65   comes from sele
15d00 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20  ctA or selectB. 
15d10 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63   Also add explic
15d20 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  it.  ** collatio
15d30 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ns to the ORDER 
15d40 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
15d50 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
15d60 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a   subqueries.  **
15d70 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e   to the right an
15d80 64 20 74 68 65 20 6c 65 66 74 20 61 72 65 20 65  d the left are e
15d90 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75  valuated, they u
15da0 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  se the correct. 
15db0 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20   ** collation.. 
15dc0 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d   */.  aPermute =
15dd0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
15de0 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69  Raw(db, sizeof(i
15df0 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20  nt)*nOrderBy);. 
15e00 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b   if( aPermute ){
15e10 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15e20 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
15e30 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
15e40 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  m = pOrderBy->a[
15e50 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
15e60 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 6f  assert( pTerm->o
15e70 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b  p==TK_INTEGER );
15e80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
15e90 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45  pTerm->flags & E
15ea0 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 29  P_IntValue)!=0 )
15eb0 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65  ;.      aPermute
15ec0 5b 69 5d 20 3d 20 70 54 65 72 6d 2d 3e 69 54 61  [i] = pTerm->iTa
15ed0 62 6c 65 2d 31 3b 0a 20 20 20 20 20 20 61 73 73  ble-1;.      ass
15ee0 65 72 74 28 20 61 50 65 72 6d 75 74 65 5b 69 5d  ert( aPermute[i]
15ef0 3e 3d 30 20 26 26 20 61 50 65 72 6d 75 74 65 5b  >=0 && aPermute[
15f00 69 5d 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  i]<p->pEList->nE
15f10 78 70 72 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xpr );.    }.   
15f20 20 70 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20 20   pKeyMerge =.   
15f30 20 20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c     sqlite3DbMall
15f40 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
15f50 28 2a 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f 72  (*pKeyMerge)+nOr
15f60 64 65 72 42 79 2a 28 73 69 7a 65 6f 66 28 43 6f  derBy*(sizeof(Co
15f70 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 20  llSeq*)+1));.   
15f80 20 69 66 28 20 70 4b 65 79 4d 65 72 67 65 20 29   if( pKeyMerge )
15f90 7b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67  {.      pKeyMerg
15fa0 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  e->aSortOrder = 
15fb0 28 75 38 2a 29 26 70 4b 65 79 4d 65 72 67 65 2d  (u8*)&pKeyMerge-
15fc0 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d  >aColl[nOrderBy]
15fd0 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67  ;.      pKeyMerg
15fe0 65 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f 72 64  e->nField = nOrd
15ff0 65 72 42 79 3b 0a 20 20 20 20 20 20 70 4b 65 79  erBy;.      pKey
16000 4d 65 72 67 65 2d 3e 65 6e 63 20 3d 20 45 4e 43  Merge->enc = ENC
16010 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  (db);.      for(
16020 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
16030 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   i++){.        C
16040 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
16050 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65         Expr *pTe
16060 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  rm = pOrderBy->a
16070 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
16080 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
16090 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
160a0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ate ){.         
160b0 20 70 43 6f 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e   pColl = pTerm->
160c0 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  pColl;.        }
160d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
160e0 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
160f0 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
16100 65 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b 69  e, p, aPermute[i
16110 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54  ]);.          pT
16120 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  erm->flags |= EP
16130 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
16140 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 43         pTerm->pC
16150 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  oll = pColl;.   
16160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
16170 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b  KeyMerge->aColl[
16180 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
16190 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61      pKeyMerge->a
161a0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
161b0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
161c0 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d  rtOrder;.      }
161d0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
161e0 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
161f0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  0;.  }..  /* Rea
16200 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  ttach the ORDER 
16210 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  BY clause to the
16220 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
16230 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
16240 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d  derBy;.  pPrior-
16250 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
16260 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
16270 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65  Parse->db, pOrde
16280 72 42 79 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  rBy);..  /* Allo
16290 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20  cate a range of 
162a0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
162b0 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49  ers and the KeyI
162c0 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20  nfo needed.  ** 
162d0 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68  for the logic th
162e0 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69  at removes dupli
162f0 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73  cate result rows
16300 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f   when the.  ** o
16310 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
16320 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
16330 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20  ERSECT (but not 
16340 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f  UNION ALL)..  */
16350 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
16360 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76  L ){.    regPrev
16370 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
16380 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
16390 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
163a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72  .    assert( nOr
163b0 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 29 3b 0a  derBy>=nExpr );.
163c0 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 73 71      regPrev = sq
163d0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
163e0 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b  e(pParse, nExpr+
163f0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
16400 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16410 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50  Integer, 0, regP
16420 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75  rev);.    pKeyDu
16430 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
16440 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20  locZero(db,.    
16450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
16460 7a 65 6f 66 28 2a 70 4b 65 79 44 75 70 29 20 2b  zeof(*pKeyDup) +
16470 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43   nExpr*(sizeof(C
16480 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20  ollSeq*)+1) );. 
16490 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29     if( pKeyDup )
164a0 7b 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d  {.      pKeyDup-
164b0 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
164c0 38 2a 29 26 70 4b 65 79 44 75 70 2d 3e 61 43 6f  8*)&pKeyDup->aCo
164d0 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20  ll[nExpr];.     
164e0 20 70 4b 65 79 44 75 70 2d 3e 6e 46 69 65 6c 64   pKeyDup->nField
164f0 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20   = nExpr;.      
16500 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d 20 45  pKeyDup->enc = E
16510 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f  NC(db);.      fo
16520 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
16530 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  i++){.        pK
16540 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  eyDup->aColl[i] 
16550 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
16560 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
16570 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  i);.        pKey
16580 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Dup->aSortOrder[
16590 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
165a0 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a      }.  }. .  /*
165b0 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65   Separate the le
165c0 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74  ft and the right
165d0 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20   query from one 
165e0 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70  another.  */.  p
165f0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
16600 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f  pPrior->pRightmo
16610 73 74 20 3d 20 30 3b 0a 20 20 70 72 6f 63 65 73  st = 0;.  proces
16620 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  sOrderGroupBy(pP
16630 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
16640 65 72 42 79 2c 20 31 2c 20 26 4e 6f 74 55 73 65  erBy, 1, &NotUse
16650 64 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  d);.  if( pPrior
16660 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
16670 20 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47     processOrderG
16680 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
16690 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
166a0 4f 72 64 65 72 42 79 2c 20 31 2c 20 26 4e 6f 74  OrderBy, 1, &Not
166b0 55 73 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Used);.  }..  /*
166c0 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
166d0 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
166e0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
166f0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
16700 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
16710 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
16720 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
16730 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
16740 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
16750 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
16760 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
16770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16780 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
16790 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
167a0 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
167b0 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
167c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167d0 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
167e0 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
167f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16800 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
16810 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
16820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
16830 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
16840 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
16850 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
16860 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
16870 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71  pLimit = 0;.  sq
16880 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
16890 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70  p->pOffset);.  p
168a0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->pOffset = 0;..
168b0 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70    regAddrA = ++p
168c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
168d0 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73  egEofA = ++pPars
168e0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64  e->nMem;.  regAd
168f0 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drB = ++pParse->
16900 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20  nMem;.  regEofB 
16910 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
16920 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
16930 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
16940 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
16950 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
16960 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
16970 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
16980 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
16990 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
169a0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
169b0 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
169c0 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
169d0 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68   /* Jump past th
169e0 65 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75  e various subrou
169f0 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74  tines and corout
16a00 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e  ines to the main
16a10 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70  .  ** merge loop
16a20 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c  .  */.  j1 = sql
16a30 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
16a40 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64  , OP_Goto);.  ad
16a50 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69  drSelectA = sqli
16a60 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
16a70 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65  dr(v);...  /* Ge
16a80 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
16a90 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
16aa0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
16ab0 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ent to the.  ** 
16ac0 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  left of the comp
16ad0 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20  ound operator - 
16ae0 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a  the "A" select..
16af0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
16b00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
16b10 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  n coroutine for 
16b20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
16b30 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
16b40 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20   = regLimitA;.  
16b50 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
16b60 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
16b70 65 73 74 41 2c 20 30 2c 20 30 2c 20 30 2c 20 30  estA, 0, 0, 0, 0
16b80 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16b90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
16ba0 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 41  eger, 1, regEofA
16bb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16bc0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
16bd0 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
16be0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
16bf0 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74  ((v, "End corout
16c00 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c  ine for left SEL
16c10 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65  ECT"));..  /* Ge
16c20 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
16c30 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
16c40 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
16c50 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65  ent on .  ** the
16c60 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22   right - the "B"
16c70 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61   select.  */.  a
16c80 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c  ddrSelectB = sql
16c90 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
16ca0 64 64 72 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f  ddr(v);.  VdbeNo
16cb0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  opComment((v, "B
16cc0 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66  egin coroutine f
16cd0 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22  or right SELECT"
16ce0 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74  ));.  savedLimit
16cf0 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
16d00 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d  savedOffset = p-
16d10 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69  >iOffset;.  p->i
16d20 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
16d30 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  B;.  p->iOffset 
16d40 3d 20 30 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  = 0;  .  sqlite3
16d50 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
16d60 2c 20 26 64 65 73 74 42 2c 20 30 2c 20 30 2c 20  , &destB, 0, 0, 
16d70 30 2c 20 30 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d  0, 0);.  p->iLim
16d80 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b  it = savedLimit;
16d90 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
16da0 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73  savedOffset;.  s
16db0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16dc0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
16dd0 31 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73  1, regEofB);.  s
16de0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16df0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
16e00 67 41 64 64 72 42 29 3b 0a 20 20 56 64 62 65 4e  gAddrB);.  VdbeN
16e10 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
16e20 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  End coroutine fo
16e30 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29  r right SELECT")
16e40 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
16e50 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
16e60 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
16e70 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
16e80 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he A.  ** select
16e90 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
16ea0 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
16eb0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
16ec0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
16ed0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
16ee0 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41  ut routine for A
16ef0 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20  "));.  addrOutA 
16f00 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
16f10 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
16f20 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
16f30 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70      p, &destA, p
16f40 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20  Dest, regOutA,. 
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f60 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
16f70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
16f80 44 4f 46 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  DOFF, labelEnd);
16f90 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  .  .  /* Generat
16fa0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
16fb0 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
16fc0 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
16fd0 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he B.  ** select
16fe0 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
16ff0 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
17000 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
17010 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
17020 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
17030 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62  UNION ){.    Vdb
17040 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
17050 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
17060 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61   for B"));.    a
17070 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61  ddrOutB = genera
17080 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
17090 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
170a0 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
170b0 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65  destB, pDest, re
170c0 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20  gOutB,.         
170d0 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
170e0 20 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59   pKeyDup, P4_KEY
170f0 49 4e 46 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62  INFO_STATIC, lab
17100 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f  elEnd);.  }..  /
17110 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
17120 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
17130 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
17140 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20  from select A.  
17150 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
17160 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
17170 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69  n select B remai
17180 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ns..  */.  VdbeN
17190 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
171a0 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  eof-A subroutine
171b0 22 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  "));.  if( op==T
171c0 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
171d0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
171e0 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73      addrEofA = s
171f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17200 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
17210 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c  labelEnd);.  }el
17220 73 65 7b 20 20 0a 20 20 20 20 61 64 64 72 45 6f  se{  .    addrEo
17230 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
17240 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
17250 20 72 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45   regEofB, labelE
17260 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nd);.    sqlite3
17270 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17280 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
17290 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20   addrOutB);.    
172a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
172b0 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
172c0 65 67 41 64 64 72 42 29 3b 0a 20 20 20 20 73 71  egAddrB);.    sq
172d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
172e0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
172f0 64 64 72 45 6f 66 41 29 3b 0a 20 20 7d 0a 0a 20  ddrEofA);.  }.. 
17300 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
17310 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
17320 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
17330 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a  s from select B.
17340 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
17350 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
17360 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d   in select A rem
17370 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
17380 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
17390 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
173a0 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20  B = addrEofA;.  
173b0 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
173c0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
173d0 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69   "eof-B subrouti
173e0 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
173f0 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofB = sqlite3Vdb
17400 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
17410 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c  , regEofA, label
17420 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  End);.    sqlite
17430 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17440 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
17450 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
17460 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17470 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
17480 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73  regAddrA);.    s
17490 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
174a0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
174b0 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a  addrEofB);.  }..
174c0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
174d0 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
174e0 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
174f0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
17500 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
17510 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
17520 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
17530 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17540 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
17550 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
17560 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17570 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
17580 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
17590 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
175a0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
175b0 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73  , addrEofA);.  s
175c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
175d0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
175e0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
175f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
17600 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
17610 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
17620 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
17630 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
17640 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
17650 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
17660 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
17670 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
17680 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
17690 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
176a0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
176b0 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
176c0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
176d0 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
176e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
176f0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
17700 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73  regAddrA);.    s
17710 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17720 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
17730 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  fA, addrEofA);. 
17740 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17750 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
17760 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
17770 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
17780 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
17790 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e  e the case of A>
177a0 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
177b0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
177c0 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  gt-B subroutine"
177d0 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d  ));.  addrAgtB =
177e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
177f0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
17800 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
17810 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
17820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17830 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
17840 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
17850 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  OutB);.  }.  sql
17860 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
17870 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
17880 64 64 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrB);.  sqlite3
17890 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
178a0 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64  _If, regEofB, ad
178b0 64 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74  drEofB);.  sqlit
178c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
178d0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
178e0 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  lCmpr);..  /* Th
178f0 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63  is code runs onc
17900 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
17910 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  everything..  */
17920 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
17930 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
17940 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17950 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
17960 2c 20 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20  , 0, regEofA);. 
17970 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17980 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
17990 2c 20 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20  , 0, regEofB);. 
179a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
179b0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
179c0 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 53 65  regAddrA, addrSe
179d0 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  lectA);.  sqlite
179e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
179f0 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72  P_Gosub, regAddr
17a00 42 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b  B, addrSelectB);
17a10 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17a20 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
17a30 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41  egEofA, addrEofA
17a40 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
17a50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
17a60 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f   regEofB, addrEo
17a70 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65  fB);..  /* Imple
17a80 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65  ment the main me
17a90 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
17aa0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
17ab0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
17ac0 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cmpr);.  sqlite3
17ad0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
17ae0 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c  _Permutation, 0,
17af0 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50   0, 0, (char*)aP
17b00 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52  ermute, P4_INTAR
17b10 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  RAY);.  sqlite3V
17b20 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
17b30 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69  Compare, destA.i
17b40 4d 65 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c  Mem, destB.iMem,
17b50 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
17b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b70 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
17b80 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
17b90 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c  _HANDOFF);.  sql
17ba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17bb0 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41  , OP_Jump, addrA
17bc0 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61  ltB, addrAeqB, a
17bd0 64 64 72 41 67 74 42 29 3b 0a 0a 20 20 2f 2a 20  ddrAgtB);..  /* 
17be0 52 65 6c 65 61 73 65 20 74 65 6d 70 6f 72 61 72  Release temporar
17bf0 79 20 72 65 67 69 73 74 65 72 73 0a 20 20 2a 2f  y registers.  */
17c00 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29  .  if( regPrev )
17c10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  {.    sqlite3Rel
17c20 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
17c30 61 72 73 65 2c 20 72 65 67 50 72 65 76 2c 20 6e  arse, regPrev, n
17c40 4f 72 64 65 72 42 79 2b 31 29 3b 0a 20 20 7d 0a  OrderBy+1);.  }.
17c50 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
17c60 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  e this point in 
17c70 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61  order to termina
17c80 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  te the query..  
17c90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
17ca0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
17cb0 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a  labelEnd);..  /*
17cc0 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
17cd0 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  of output column
17ce0 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  s.  */.  if( pDe
17cf0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 43  st->eDest==SRT_C
17d00 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 53  allback ){.    S
17d10 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
17d20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c  pPrior;.    whil
17d30 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
17d40 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
17d50 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
17d60 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
17d70 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
17d80 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
17d90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73  .  }..  /* Reass
17da0 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75  embly the compou
17db0 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74  nd query so that
17dc0 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
17dd0 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
17de0 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
17df0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
17e00 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
17e10 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
17e20 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f 72  Delete(p->pPrior
17e30 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69  );.  }.  p->pPri
17e40 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20 20  or = pPrior;..  
17e50 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
17e60 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
17e70 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
17e80 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
17e90 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
17ea0 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 72 65 74 75  ies ****/.  retu
17eb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17ec0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17ed0 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 20 46 6f 72  OMIT_VIEW./* For
17ee0 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e  ward Declaration
17ef0 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
17f00 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 73   substExprList(s
17f10 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73  qlite3*, ExprLis
17f20 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73  t*, int, ExprLis
17f30 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  t*);.static void
17f40 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c   substSelect(sql
17f50 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c  ite3*, Select *,
17f60 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a   int, ExprList *
17f70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  );../*.** Scan t
17f80 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
17f90 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
17fa0 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
17fb0 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
17fc0 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
17fd0 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
17fe0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
17ff0 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
18000 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
18010 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
18020 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
18030 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
18040 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
18050 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
18060 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
18070 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
18080 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
18090 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
180a0 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
180b0 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
180c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
180d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
180e0 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
180f0 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
18100 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
18110 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
18120 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
18130 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
18140 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73  e make the neces
18150 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
18160 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
18170 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
18180 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
18190 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
181a0 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
181b0 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
181c0 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
181d0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
181e0 64 20 73 75 62 73 74 45 78 70 72 28 0a 20 20 73  d substExpr(.  s
181f0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
18200 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
18210 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68  loc errors to th
18220 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  is connection */
18230 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
18240 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69         /* Expr i
18250 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75  n which substitu
18260 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20  tion occurs */. 
18270 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
18280 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
18290 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20   be substituted 
182a0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
182b0 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73  EList    /* Subs
182c0 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69 6f  titute expressio
182d0 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ns */.){.  if( p
182e0 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
182f0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
18300 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
18310 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
18320 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
18330 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
18340 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
18350 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
18360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18370 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
18380 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
18390 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69  t!=0 && pExpr->i
183a0 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e  Column<pEList->n
183b0 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Expr );.      as
183c0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
183d0 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
183e0 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78  pRight==0 && pEx
183f0 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
18400 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c        pNew = pEL
18410 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43  ist->a[pExpr->iC
18420 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20  olumn].pExpr;.  
18430 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
18440 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  !=0 );.      pEx
18450 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f  pr->op = pNew->o
18460 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
18470 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
18480 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
18490 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  >pLeft = sqlite3
184a0 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65 77  ExprDup(db, pNew
184b0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
184c0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
184d0 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
184e0 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
184f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
18500 28 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69 67 68  (db, pNew->pRigh
18510 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
18520 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  ( pExpr->pList==
18530 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
18540 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  ->pList = sqlite
18550 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
18560 20 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20   pNew->pList);. 
18570 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
18580 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c  le = pNew->iTabl
18590 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e;.      pExpr->
185a0 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61  pTab = pNew->pTa
185b0 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  b;.      pExpr->
185c0 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e  iColumn = pNew->
185d0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
185e0 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65  Expr->iAgg = pNe
185f0 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73  w->iAgg;.      s
18600 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
18610 64 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65  db, &pExpr->toke
18620 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29  n, &pNew->token)
18630 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
18640 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45  okenCopy(db, &pE
18650 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77  xpr->span, &pNew
18660 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70  ->span);.      p
18670 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Expr->pSelect = 
18680 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
18690 28 64 62 2c 20 70 4e 65 77 2d 3e 70 53 65 6c 65  (db, pNew->pSele
186a0 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ct);.      pExpr
186b0 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e  ->flags = pNew->
186c0 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  flags;.    }.  }
186d0 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
186e0 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
186f0 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
18700 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
18710 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
18720 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
18730 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
18740 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78  stSelect(db, pEx
18750 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61  pr->pSelect, iTa
18760 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
18770 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
18780 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  db, pExpr->pList
18790 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
187a0 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
187b0 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
187c0 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st(.  sqlite3 *d
187d0 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
187e0 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
187f0 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70  rs here */.  Exp
18800 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
18810 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61    /* List to sca
18820 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74  n and in which t
18830 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
18840 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  es */.  int iTab
18850 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
18860 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
18870 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
18880 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
18890 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
188a0 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  values */.){.  i
188b0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
188c0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
188d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
188e0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
188f0 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62      substExpr(db
18900 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
18910 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  xpr, iTable, pEL
18920 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  ist);.  }.}.stat
18930 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
18940 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
18950 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
18960 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
18970 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65  ors here */.  Se
18980 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
18990 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
189a0 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20  tement in which 
189b0 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
189c0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tions */.  int i
189d0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
189e0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72  /* Table to be r
189f0 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70  eplaced */.  Exp
18a00 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
18a10 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
18a20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  values */.){.  i
18a30 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
18a40 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
18a50 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69  db, p->pEList, i
18a60 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
18a70 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
18a80 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
18a90 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
18aa0 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
18ab0 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  t(db, p->pOrderB
18ac0 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
18ad0 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28  t);.  substExpr(
18ae0 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
18af0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
18b00 0a 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c  .  substExpr(db,
18b10 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62   p->pWhere, iTab
18b20 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
18b30 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
18b40 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65  ->pPrior, iTable
18b50 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e  , pEList);.}.#en
18b60 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
18b70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
18b80 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
18b90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
18ba0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18bb0 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
18bc0 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
18bd0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65   in order to spe
18be0 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  ed.** execution.
18bf0 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69    It returns 1 i
18c00 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
18c10 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
18c20 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63  lattening.** occ
18c30 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
18c40 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
18c50 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
18c60 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
18c70 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
18c80 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
18c90 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
18ca0 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
18cb0 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
18cc0 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
18cd0 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
18ce0 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
18cf0 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
18d00 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
18d10 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
18d20 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
18d30 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
18d40 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
18d50 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
18d60 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
18d70 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
18d80 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
18d90 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
18da0 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
18db0 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
18dc0 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
18dd0 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
18de0 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
18df0 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
18e00 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
18e10 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
18e20 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
18e30 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
18e40 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
18e50 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
18e60 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
18e70 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
18e80 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
18e90 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
18ea0 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
18eb0 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
18ec0 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
18ed0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
18ee0 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
18ef0 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
18f00 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
18f10 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
18f20 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
18f30 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
18f40 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
18f50 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
18f60 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
18f70 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
18f80 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
18f90 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
18fa0 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
18fb0 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
18fc0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
18fd0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
18fe0 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
18ff0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
19000 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
19010 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
19020 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
19030 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
19040 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
19050 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
19060 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
19070 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
19080 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
19090 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
190a0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
190b0 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
190c0 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  in, or.**       
190d0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
190e0 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f   not itself a jo
190f0 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30  in.  (Ticket #30
19100 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  6).**.**   (4)  
19110 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
19120 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
19130 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
19140 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
19150 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20  *.**   (5)  The 
19160 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
19170 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
19180 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
19190 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
191a0 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
191b0 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20  *.**   (6)  The 
191c0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
191d0 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
191e0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
191f0 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
19200 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a       DISTINCT..*
19210 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20  *.**   (7)  The 
19220 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46  subquery has a F
19230 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
19240 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
19250 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
19260 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
19270 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
19280 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
19290 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
192a0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
192b0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
192c0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
192d0 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
192e0 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
192f0 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73  .**  (10)  The s
19300 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
19310 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
19320 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
19330 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
19340 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
19350 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
19360 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
19370 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
19380 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
19390 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
193a0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54  ..**.**  (12)  T
193b0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
193c0 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ot the right ter
193d0 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  m of a LEFT OUTE
193e0 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a  R JOIN or the.**
193f0 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
19400 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
19410 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62 79  ause.  (added by
19420 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a   ticket #350).**
19430 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
19440 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
19450 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
19460 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a 2a  oth use LIMIT.**
19470 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73  .**  (14)  The s
19480 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
19490 20 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a   use OFFSET.**.*
194a0 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74  *  (15)  The out
194b0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
194c0 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
194d0 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65  nd select or the
194e0 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
194f0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ery does not hav
19500 65 20 62 6f 74 68 20 61 6e 20 4f 52 44 45 52 20  e both an ORDER 
19510 42 59 20 61 6e 64 20 61 20 4c 49 4d 49 54 20 63  BY and a LIMIT c
19520 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  lause..**       
19530 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33   (See ticket #23
19540 33 39 29 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  39).**.**  (16) 
19550 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
19560 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
19570 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71  gate or the subq
19580 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20  uery does.**    
19590 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20      not contain 
195a0 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b  ORDER BY.  (Tick
195b0 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20  et #2942)  This 
195c0 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74  used to not matt
195d0 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74  er.**        unt
195e0 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64  il we introduced
195f0 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61   the group_conca
19600 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a  t() function.  .
19610 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65  **.**  (17)  The
19620 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f   sub-query is no
19630 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  t a compound sel
19640 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20  ect, or it is a 
19650 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20  UNION ALL .**   
19660 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 77 69       compound wi
19670 74 68 6f 75 74 20 61 6e 20 4f 52 44 45 52 20 42  thout an ORDER B
19680 59 2c 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53  Y, LIMIT or OFFS
19690 45 54 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75  ET clause made u
196a0 70 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 74 69  p.**        enti
196b0 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72  rely of non-aggr
196c0 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20 61  egate queries, a
196d0 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68  nd .**        th
196e0 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a  e parent query:.
196f0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  **.**          *
19700 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70   is not itself p
19710 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
19720 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20  d select,.**    
19730 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61        * is not a
19740 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 44  n aggregate or D
19750 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61  ISTINCT query, a
19760 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  nd.**          *
19770 20 68 61 73 20 6e 6f 20 6f 74 68 65 72 20 74 61   has no other ta
19780 62 6c 65 73 20 6f 72 20 73 75 62 2d 73 65 6c 65  bles or sub-sele
19790 63 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  cts in the FROM 
197a0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
197b0 20 20 20 20 20 54 68 65 20 70 61 72 65 6e 74 20       The parent 
197c0 71 75 65 72 79 20 6d 61 79 20 68 61 76 65 20 57  query may have W
197d0 48 45 52 45 2c 20 4f 52 44 45 52 20 42 59 2c 20  HERE, ORDER BY, 
197e0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
197f0 0a 2a 2a 20 20 20 20 20 20 20 20 63 6c 61 75 73  .**        claus
19800 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  es..**.** In thi
19810 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
19820 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
19830 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
19840 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
19850 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
19860 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
19870 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
19880 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
19890 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
198a0 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
198b0 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
198c0 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
198d0 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
198e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
198f0 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
19900 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
19910 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
19920 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
19930 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
19940 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
19950 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
19960 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
19970 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
19980 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
19990 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
199a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
199b0 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
199c0 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
199d0 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
199e0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
199f0 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 73 71  enSubquery(.  sq
19a00 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
19a10 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
19a20 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 53  onnection */.  S
19a30 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
19a40 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
19a50 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
19a60 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
19a70 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
19a80 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
19a90 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
19aa0 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
19ab0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
19ac0 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Agg,           /
19ad0 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
19ae0 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
19af0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
19b00 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72  */.  int subquer
19b10 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75  yIsAgg    /* Tru
19b20 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
19b30 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
19b40 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
19b50 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
19b60 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  nt;.  Select *pS
19b70 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
19b80 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
19b90 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
19ba0 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20  Select *pSub1;  
19bb0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
19bc0 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  o the rightmost 
19bd0 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75  select in sub-qu
19be0 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
19bf0 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
19c00 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
19c10 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
19c20 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
19c30 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
19c40 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
19c50 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
19c60 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
19c70 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72  ist;    /* The r
19c80 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
19c90 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
19ca0 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20    int iParent;  
19cb0 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75        /* VDBE cu
19cc0 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
19cd0 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73  he pSub result s
19ce0 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  et temp table */
19cf0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
19d00 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
19d10 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72  ounter */.  Expr
19d20 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19d40 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
19d50 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
19d60 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69  List_item *pSubi
19d70 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75  tem;   /* The su
19d80 62 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20  bquery */..  /* 
19d90 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
19da0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
19db0 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
19dc0 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
19dd0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
19de0 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
19df0 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
19e00 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
19e10 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
19e20 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
19e30 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  bitem = &pSrc->a
19e40 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70 53 75 62 20  [iFrom];.  pSub 
19e50 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
19e60 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
19e70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Sub!=0 );.  if( 
19e80 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72  isAgg && subquer
19e90 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
19ea0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
19eb0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
19ec0 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (1)  */.  if( 
19ed0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26  subqueryIsAgg &&
19ee0 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
19ef0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
19f00 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
19f10 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62  n (2)  */.  pSub
19f20 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
19f30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
19f40 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
19f50 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
19f60 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
19f70 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
19f80 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
19f90 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
19fa0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
19fb0 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65  sions, we allowe
19fc0 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67  d some combining
19fd0 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   of LIMIT and OF
19fe0 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73  FSET.  ** becaus
19ff0 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20  e they could be 
1a000 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70  computed at comp
1a010 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77  ile-time.  But w
1a020 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
1a030 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65  FSET.  ** became
1a040 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
1a050 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20  ssions, we were 
1a060 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65  forced to add re
1a070 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a  strictions (13).
1a080 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a    ** and (14). *
1a090 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1a0a0 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69  imit && p->pLimi
1a0b0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1a0c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1a0d0 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a  striction (13) *
1a0e0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f  /.  if( pSub->pO
1a0f0 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30  ffset ) return 0
1a100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1a120 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a  striction (14) *
1a130 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68  /.  if( p->pRigh
1a140 74 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70  tmost && pSub->p
1a150 4c 69 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70  Limit && pSub->p
1a160 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72  OrderBy ){.    r
1a170 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1a0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1a1b0 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20  on (15) */.  }. 
1a1c0 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
1a1d0 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
1a1e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a1f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1a200 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20  iction (7)  */. 
1a210 20 69 66 28 20 28 70 53 75 62 2d 3e 69 73 44 69   if( (pSub->isDi
1a220 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e  stinct || pSub->
1a230 70 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20  pLimit) .       
1a240 20 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63    && (pSrc->nSrc
1a250 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 20  >1 || isAgg) ){ 
1a260 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1a270 72 69 63 74 69 6f 6e 73 20 28 34 29 28 35 29 28  rictions (4)(5)(
1a280 38 29 28 39 29 20 2a 2f 0a 20 20 20 20 20 72 65  8)(9) */.     re
1a290 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 0a 20  turn 0;       . 
1a2a0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69   }.  if( p->isDi
1a2b0 73 74 69 6e 63 74 20 26 26 20 73 75 62 71 75 65  stinct && subque
1a2c0 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e  ryIsAgg ) return
1a2d0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1a2e0 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20  estriction (6)  
1a2f0 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 64 69 73  */.  if( (p->dis
1a300 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 7c 7c 20  allowOrderBy || 
1a310 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 26 26 20  p->pOrderBy) && 
1a320 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1a330 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1a370 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a  striction (11) *
1a380 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  /.  }.  if( isAg
1a390 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  g && pSub->pOrde
1a3a0 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20  rBy ) return 0; 
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a3c0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1a3d0 36 29 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 73 74  6) */..  /* Rest
1a3e0 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74  riction 3:  If t
1a3f0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
1a400 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
1a410 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1a420 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20   .  ** not used 
1a430 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  as the right ope
1a440 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72  rand of an outer
1a450 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73   join.  Examples
1a460 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a   of why this.  *
1a470 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  * is not allowed
1a480 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1a490 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
1a4a0 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20  R JOIN (t2 JOIN 
1a4b0 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  t3).  **.  ** If
1a4c0 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
1a4d0 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
1a4e0 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
1a4f0 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
1a500 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f  UTER JOIN t2) JO
1a510 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  IN t3.  **.  ** 
1a520 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20  which is not at 
1a530 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69  all the same thi
1a540 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ng..  */.  if( p
1a550 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26  SubSrc->nSrc>1 &
1a560 26 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69  & (pSubitem->joi
1a570 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
1a580 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
1a590 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
1a5a0 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20  Restriction 12: 
1a5b0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1a5c0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
1a5d0 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
1a5e0 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c  outer.  ** join,
1a5f0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
1a600 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57  ubquery has no W
1a610 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a  HERE clause..  *
1a620 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66  * An examples of
1a630 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74   why this is not
1a640 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
1a650 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
1a660 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
1a670 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
1a680 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20   WHERE t2.x>0). 
1a690 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
1a6a0 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
1a6b0 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
1a6c0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1a6d0 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
1a6e0 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74  JOIN t2) WHERE t
1a6f0 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  2.x>0.  **.  ** 
1a700 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74  But the t2.x>0 t
1a710 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  est will always 
1a720 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72  fail on a NULL r
1a730 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a  ow of t2, which.
1a740 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79    ** effectively
1a750 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55   converts the OU
1a760 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e  TER JOIN into an
1a770 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a   INNER JOIN..  *
1a780 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65  /.  if( (pSubite
1a790 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
1a7a0 5f 4f 55 54 45 52 29 21 3d 30 20 26 26 20 70 53  _OUTER)!=0 && pS
1a7b0 75 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b  ub->pWhere!=0 ){
1a7c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1a7d0 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63   }..  /* Restric
1a7e0 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20  tion 17: If the 
1a7f0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1a800 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20  ompound SELECT, 
1a810 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a  then it must.  *
1a820 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55  * use only the U
1a830 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
1a840 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  r. And none of t
1a850 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  he simple select
1a860 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68   queries.  ** th
1a870 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
1a880 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61  ompound SELECT a
1a890 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  re allowed to be
1a8a0 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69   aggregate or di
1a8b0 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72  stinct.  ** quer
1a8c0 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ies..  */.  if( 
1a8d0 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
1a8e0 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f      if( p->pPrio
1a8f0 72 20 7c 7c 20 69 73 41 67 67 20 7c 7c 20 70 2d  r || isAgg || p-
1a900 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70  >isDistinct || p
1a910 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a  Src->nSrc!=1 ){.
1a920 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1a930 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53      }.    for(pS
1a940 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b  ub1=pSub; pSub1;
1a950 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50   pSub1=pSub1->pP
1a960 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 69 66 28  rior){.      if(
1a970 20 70 53 75 62 31 2d 3e 69 73 41 67 67 20 7c 7c   pSub1->isAgg ||
1a980 20 70 53 75 62 31 2d 3e 69 73 44 69 73 74 69 6e   pSub1->isDistin
1a990 63 74 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  ct .       || (p
1a9a0 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20  Sub1->pPrior && 
1a9b0 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  pSub1->op!=TK_AL
1a9c0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  L) ){.        re
1a9d0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1a9e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1a9f0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1aa00 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
1aa10 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
1aa20 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65   then it must be
1aa30 0a 20 20 2a 2a 20 61 20 55 4e 49 4f 4e 20 41 4c  .  ** a UNION AL
1aa40 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74  L and the parent
1aa50 20 71 75 65 72 79 20 6d 75 73 74 20 62 65 20 6f   query must be o
1aa60 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
1aa70 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1aa80 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f   <expr-list> FRO
1aa90 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20  M (<sub-query>) 
1aaa0 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a  <where-clause> .
1aab0 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77    **.  ** follow
1aac0 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20  ed by any ORDER 
1aad0 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72  BY, LIMIT and/or
1aae0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
1aaf0 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a   This block.  **
1ab00 20 63 72 65 61 74 65 73 20 4e 20 63 6f 70 69 65   creates N copie
1ab10 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  s of the parent 
1ab20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e  query without an
1ab30 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
1ab40 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45  T or .  ** OFFSE
1ab50 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f  T clauses and jo
1ab60 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20  ins them to the 
1ab70 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f  left-hand-side o
1ab80 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  f the original. 
1ab90 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20   ** using UNION 
1aba0 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49  ALL operators. I
1abb0 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73  n this case N is
1abc0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
1abd0 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63  imple.  ** selec
1abe0 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  t statements in 
1abf0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  the compound sub
1ac00 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  -query..  */.  f
1ac10 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  or(pSub=pSub->pP
1ac20 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62  rior; pSub; pSub
1ac30 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
1ac40 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77      Select *pNew
1ac50 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
1ac60 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
1ac70 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72  rderBy;.    Expr
1ac80 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c   *pLimit = p->pL
1ac90 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a  imit;.    Expr *
1aca0 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
1acb0 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  fset;.    Select
1acc0 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
1acd0 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rior;.    p->pOr
1ace0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
1acf0 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20  ->pSrc = 0;.    
1ad00 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
1ad10 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
1ad20 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
1ad30 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
1ad40 2c 20 70 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  , p);.    pNew->
1ad50 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1ad60 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
1ad70 20 70 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 70 4f   pNew;.    p->pO
1ad80 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
1ad90 79 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  y;.    p->op = T
1ada0 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70 53  K_ALL;.    p->pS
1adb0 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70  rc = pSrc;.    p
1adc0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
1add0 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  t;.    p->pOffse
1ade0 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
1adf0 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d   p->pRightmost =
1ae00 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 52   0;.    pNew->pR
1ae10 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20  ightmost = 0;.  
1ae20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  }..  /* If we re
1ae30 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
1ae40 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e  it means flatten
1ae50 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
1ae60 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46   for the.  ** iF
1ae70 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
1ae80 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1ae90 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1aea0 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20  ry..  */.  pSub 
1aeb0 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74  = pSub1 = pSubit
1aec0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 69  em->pSelect;.  i
1aed0 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65  Parent = pSubite
1aee0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 66 6f  m->iCursor;.  fo
1aef0 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
1af00 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
1af10 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
1af20 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1af30 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
1af40 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
1af50 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e  rc;.    int join
1af60 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53  type = 0;.    pS
1af70 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
1af80 72 63 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  rc;.    pSrc = p
1af90 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 0a 0a 20  Parent->pSrc;.. 
1afa0 20 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f     /* Move all o
1afb0 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
1afc0 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
1afd0 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ery into the.   
1afe0 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
1aff0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1b000 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
1b010 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
1b020 6d 62 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 20  mber.    ** the 
1b030 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
1b040 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
1b050 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
1b060 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 20 20 2a  element in.    *
1b070 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20  * iParent.  The 
1b080 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77  iParent cursor w
1b090 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
1b0a0 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63  d.  Subsequent c
1b0b0 6f 64 65 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  ode.    ** will 
1b0c0 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
1b0d0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
1b0e0 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
1b0f0 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20  and replace.    
1b100 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
1b110 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
1b120 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
1b130 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
1b140 79 20 46 52 4f 4d 0a 20 20 20 20 2a 2a 20 65 6c  y FROM.    ** el
1b150 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
1b160 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
1b170 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72    */.    if( pSr
1b180 63 20 29 7b 0a 20 20 20 20 20 20 70 53 75 62 69  c ){.      pSubi
1b190 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
1b1a0 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 6e 53 75  From];.      nSu
1b1b0 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e  bSrc = pSubSrc->
1b1c0 6e 53 72 63 3b 0a 20 20 20 20 20 20 6a 6f 69 6e  nSrc;.      join
1b1d0 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
1b1e0 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 20  >jointype;.     
1b1f0 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
1b200 62 6c 65 28 70 53 75 62 69 74 65 6d 2d 3e 70 54  ble(pSubitem->pT
1b210 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ab);.      sqlit
1b220 65 33 5f 66 72 65 65 28 70 53 75 62 69 74 65 6d  e3_free(pSubitem
1b230 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
1b240 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1b250 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65  (pSubitem->zName
1b260 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b270 5f 66 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  _free(pSubitem->
1b280 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 70  zAlias);.      p
1b290 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20  Subitem->pTab = 
1b2a0 30 3b 0a 20 20 20 20 20 20 70 53 75 62 69 74 65  0;.      pSubite
1b2b0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  m->zDatabase = 0
1b2c0 3b 0a 20 20 20 20 20 20 70 53 75 62 69 74 65 6d  ;.      pSubitem
1b2d0 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ->zName = 0;.   
1b2e0 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c     pSubitem->zAl
1b2f0 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ias = 0;.    }. 
1b300 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 21 3d     if( nSubSrc!=
1b310 31 20 7c 7c 20 21 70 53 72 63 20 29 7b 0a 20 20  1 || !pSrc ){.  
1b320 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20      int extra = 
1b330 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20  nSubSrc - 1;.   
1b340 20 20 20 66 6f 72 28 69 3d 28 70 53 72 63 3f 31     for(i=(pSrc?1
1b350 3a 30 29 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  :0); i<nSubSrc; 
1b360 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i++){.        pS
1b370 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
1b380 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 53  istAppend(db, pS
1b390 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rc, 0, 0);.     
1b3a0 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29     if( pSrc==0 )
1b3b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  {.          pPar
1b3c0 65 6e 74 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20  ent->pSrc = 0;. 
1b3d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b3e0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1b3f0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72 65     }.      pPare
1b400 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b  nt->pSrc = pSrc;
1b410 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53 72  .      for(i=pSr
1b420 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74  c->nSrc-1; i-ext
1b430 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b  ra>=iFrom; i--){
1b440 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61  .        pSrc->a
1b450 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d  [i] = pSrc->a[i-
1b460 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a  extra];.      }.
1b470 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
1b480 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b  0; i<nSubSrc; i+
1b490 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  +){.      pSrc->
1b4a0 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75  a[i+iFrom] = pSu
1b4b0 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  bSrc->a[i];.    
1b4c0 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72    memset(&pSubSr
1b4d0 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65  c->a[i], 0, size
1b4e0 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  of(pSubSrc->a[i]
1b4f0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ));.    }.    pS
1b500 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69  rc->a[iFrom].joi
1b510 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65  ntype = jointype
1b520 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ;.  .    /* Now 
1b530 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69  begin substituti
1b540 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ng subquery resu
1b550 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
1b560 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72  ns for .    ** r
1b570 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1b580 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
1b590 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
1b5a0 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d   ** .    ** Exam
1b5b0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
1b5c0 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c  **   SELECT a+5,
1b5d0 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45   b*10 FROM (SELE
1b5e0 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31  CT x*3 AS a, y+1
1b5f0 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20  0 AS b FROM t1) 
1b600 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a  WHERE a>b;.    *
1b610 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
1b620 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
1b630 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
1b640 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
1b650 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20         /.    ** 
1b660 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
1b670 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
1b680 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
1b690 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1b6a0 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20  ____/.    **.   
1b6b0 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
1b6c0 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
1b6d0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1b6e0 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
1b6f0 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a  ce we see.    **
1b700 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75   "a" we substitu
1b710 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65  te "x*3" and eve
1b720 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20  ry place we see 
1b730 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "b" we substitut
1b740 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f  e "y+10"..    */
1b750 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61  .    pList = pPa
1b760 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  rent->pEList;.  
1b770 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1b780 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1b790 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
1b7a0 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  pr;.      if( pL
1b7b0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d  ist->a[i].zName=
1b7c0 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d 20 70  =0 && (pExpr = p
1b7d0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1b7e0 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a  )->span.z!=0 ){.
1b7f0 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61          pList->a
1b800 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 0a 20 20 20  [i].zName = .   
1b810 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1b820 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
1b830 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 73   (char*)pExpr->s
1b840 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70  pan.z, pExpr->sp
1b850 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  an.n);.      }. 
1b860 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78     }.    substEx
1b870 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
1b880 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72  nt->pEList, iPar
1b890 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1b8a0 74 29 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67  t);.    if( isAg
1b8b0 67 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  g ){.      subst
1b8c0 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
1b8d0 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20  rent->pGroupBy, 
1b8e0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1b8f0 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 75  EList);.      su
1b900 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
1b910 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  ent->pHaving, iP
1b920 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1b930 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
1b940 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
1b950 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  By ){.      asse
1b960 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  rt( pParent->pOr
1b970 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
1b980 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65    pParent->pOrde
1b990 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
1b9a0 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62  erBy;.      pSub
1b9b0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
1b9c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
1b9d0 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
1b9e0 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
1b9f0 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
1ba00 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50  nt->pOrderBy, iP
1ba10 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1ba20 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
1ba30 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
1ba40 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65   ){.      pWhere
1ba50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
1ba60 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65  p(db, pSub->pWhe
1ba70 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  re);.    }else{.
1ba80 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30        pWhere = 0
1ba90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1baa0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
1bab0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1bac0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d  Parent->pHaving=
1bad0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
1bae0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  ent->pHaving = p
1baf0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a  Parent->pWhere;.
1bb00 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1bb10 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
1bb20 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 28        substExpr(
1bb30 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  db, pParent->pHa
1bb40 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
1bb50 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1bb60 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
1bb70 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
1bb80 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e  prAnd(db, pParen
1bb90 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20  t->pHaving, .   
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1bbc0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1bbd0 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29  , pSub->pHaving)
1bbe0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1bbf0 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
1bc00 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  By==0 );.      p
1bc10 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
1bc20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1bc30 73 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  stDup(db, pSub->
1bc40 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 7d  pGroupBy);.    }
1bc50 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73  else{.      subs
1bc60 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
1bc70 74 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65  t->pWhere, iPare
1bc80 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1bc90 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1bca0 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
1bcb0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50  e3ExprAnd(db, pP
1bcc0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70  arent->pWhere, p
1bcd0 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Where);.    }.  
1bce0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74  .    /* The flat
1bcf0 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64  tened query is d
1bd00 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65  istinct if eithe
1bd10 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74  r the inner or t
1bd20 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
1bd30 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
1bd40 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  t. .    */.    p
1bd50 50 61 72 65 6e 74 2d 3e 69 73 44 69 73 74 69 6e  Parent->isDistin
1bd60 63 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 69 73  ct = pParent->is
1bd70 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
1bd80 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
1bd90 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
1bda0 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28  ELECT ... FROM (
1bdb0 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54  SELECT ... LIMIT
1bdc0 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d   a OFFSET b) LIM
1bdd0 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20  IT x OFFSET y;. 
1bde0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65     **.    ** One
1bdf0 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
1be00 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
1be10 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
1be20 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
1be30 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e  is.    ** does n
1be40 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65  ot work if eithe
1be50 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  r limit is negat
1be60 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
1be70 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1be80 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
1be90 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62  t->pLimit = pSub
1bea0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
1beb0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
1bec0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1bed0 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65  * Finially, dele
1bee0 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20  te what is left 
1bef0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1bf00 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
1bf10 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  success..  */.  
1bf20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1bf30 65 74 65 28 70 53 75 62 31 29 3b 0a 0a 20 20 72  ete(pSub1);..  r
1bf40 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
1bf50 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1bf60 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VIEW */../*.** 
1bf70 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45  Analyze the SELE
1bf80 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  CT statement pas
1bf90 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
1bfa0 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a  nt to see if it.
1bfb0 2a 2a 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72  ** is a min() or
1bfc0 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 52 65   max() query. Re
1bfd0 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
1bfe0 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f  BY_MIN or WHERE_
1bff0 4f 52 44 45 52 42 59 5f 4d 41 58 20 69 66 20 0a  ORDERBY_MAX if .
1c000 2a 2a 20 69 74 20 69 73 2c 20 6f 72 20 30 20 6f  ** it is, or 0 o
1c010 74 68 65 72 77 69 73 65 2e 20 41 74 20 70 72 65  therwise. At pre
1c020 73 65 6e 74 2c 20 61 20 71 75 65 72 79 20 69 73  sent, a query is
1c030 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
1c040 65 0a 2a 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78  e.** a min()/max
1c050 28 29 20 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a  () query if:.**.
1c060 2a 2a 20 20 20 31 2e 20 54 68 65 72 65 20 69 73  **   1. There is
1c070 20 61 20 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74   a single object
1c080 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1c090 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20  use..**.**   2. 
1c0a0 54 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c  There is a singl
1c0b0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  e expression in 
1c0c0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
1c0d0 61 6e 64 20 69 74 20 69 73 0a 2a 2a 20 20 20 20  and it is.**    
1c0e0 20 20 65 69 74 68 65 72 20 6d 69 6e 28 78 29 20    either min(x) 
1c0f0 6f 72 20 6d 61 78 28 78 29 2c 20 77 68 65 72 65  or max(x), where
1c100 20 78 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72   x is a column r
1c110 65 66 65 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  eference..*/.sta
1c120 74 69 63 20 69 6e 74 20 6d 69 6e 4d 61 78 51 75  tic int minMaxQu
1c130 65 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ery(Parse *pPars
1c140 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
1c150 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
1c160 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1c170 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   = p->pEList;.. 
1c180 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
1c190 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 57  pr!=1 ) return W
1c1a0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
1c1b0 4d 41 4c 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  MAL;.  pExpr = p
1c1c0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1c1d0 72 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 45  r;.  pEList = pE
1c1e0 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66  xpr->pList;.  if
1c1f0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1c200 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20  AGG_FUNCTION || 
1c210 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c  pEList==0 || pEL
1c220 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
1c230 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1c240 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
1c250 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43  pr->op!=TK_AGG_C
1c260 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 57  OLUMN ) return W
1c270 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
1c280 4d 41 4c 3b 0a 20 20 69 66 28 20 70 45 78 70 72  MAL;.  if( pExpr
1c290 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72  ->token.n!=3 ) r
1c2a0 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
1c2b0 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66  RBY_NORMAL;.  if
1c2c0 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
1c2d0 70 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  p((char*)pExpr->
1c2e0 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29  token.z,"min",3)
1c2f0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1c300 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
1c310 4d 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  MIN;.  }else if(
1c320 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1c330 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74  ((char*)pExpr->t
1c340 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d  oken.z,"max",3)=
1c350 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1c360 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
1c370 41 58 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  AX;.  }.  return
1c380 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
1c390 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ORMAL;.}../*.** 
1c3a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  This routine res
1c3b0 6f 6c 76 65 73 20 61 6e 79 20 6e 61 6d 65 73 20  olves any names 
1c3c0 75 73 65 64 20 69 6e 20 74 68 65 20 72 65 73 75  used in the resu
1c3d0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a  lt set of the.**
1c3e0 20 73 75 70 70 6c 69 65 64 20 53 45 4c 45 43 54   supplied SELECT
1c3f0 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74   statement. If t
1c400 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1c410 65 6e 74 20 62 65 69 6e 67 20 72 65 73 6f 6c 76  ent being resolv
1c420 65 64 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73  ed.** is a sub-s
1c430 65 6c 65 63 74 2c 20 74 68 65 6e 20 70 4f 75 74  elect, then pOut
1c440 65 72 4e 43 20 69 73 20 61 20 70 6f 69 6e 74 65  erNC is a pointe
1c450 72 20 74 6f 20 74 68 65 20 4e 61 6d 65 43 6f 6e  r to the NameCon
1c460 74 65 78 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20  text .** of the 
1c470 70 61 72 65 6e 74 20 53 45 4c 45 43 54 2e 0a 2a  parent SELECT..*
1c480 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
1c490 65 63 74 52 65 73 6f 6c 76 65 28 0a 20 20 50 61  ectResolve(.  Pa
1c4a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1c4b0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
1c4c0 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
1c4d0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1c4e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
1c4f0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
1c500 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
1c510 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f   NameContext *pO
1c520 75 74 65 72 4e 43 20 20 2f 2a 20 54 68 65 20 6f  uterNC  /* The o
1c530 75 74 65 72 20 6e 61 6d 65 20 63 6f 6e 74 65 78  uter name contex
1c540 74 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  t. May be NULL. 
1c550 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  */.){.  ExprList
1c560 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20   *pEList;       
1c570 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74     /* Result set
1c580 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  . */.  int i;   
1c590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5a0 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76 61    /* For-loop va
1c5b0 72 69 61 62 6c 65 20 75 73 65 64 20 69 6e 20 6d  riable used in m
1c5c0 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 20 2a  ultiple places *
1c5d0 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
1c5e0 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f  sNC;           /
1c5f0 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e  * Local name-con
1c600 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
1c610 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
1c620 20 20 20 20 20 2f 2a 20 54 68 65 20 67 72 6f 75       /* The grou
1c630 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a  p by clause */..
1c640 20 20 2f 2a 20 49 66 20 74 68 69 73 20 72 6f 75    /* If this rou
1c650 74 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66  tine has run bef
1c660 6f 72 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65  ore, return imme
1c670 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66  diately. */.  if
1c680 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20  ( p->isResolved 
1c690 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
1c6a0 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20 20 20 20  pOuterNC );.    
1c6b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c6c0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73  ;.  }.  p->isRes
1c6d0 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a  olved = 1;..  /*
1c6e0 20 49 66 20 74 68 65 72 65 20 68 61 76 65 20 61   If there have a
1c6f0 6c 72 65 61 64 79 20 62 65 65 6e 20 65 72 72 6f  lready been erro
1c700 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  rs, do nothing. 
1c710 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
1c720 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 72  >nErr>0 ){.    r
1c730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1c740 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72  OR;.  }..  /* Pr
1c750 65 70 61 72 65 20 74 68 65 20 73 65 6c 65 63 74  epare the select
1c760 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
1c770 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63   call will alloc
1c780 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a  ate all cursors.
1c790 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 74 6f    ** required to
1c7a0 20 68 61 6e 64 6c 65 20 74 68 65 20 74 61 62 6c   handle the tabl
1c7b0 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  es and subquerie
1c7c0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
1c7d0 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ause..  */.  if(
1c7e0 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
1c7f0 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
1c800 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c810 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
1c820 20 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70   Resolve the exp
1c830 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
1c840 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1c850 20 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a   clauses. These.
1c860 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c    ** are not all
1c870 6f 77 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f  owed to refer to
1c880 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70   any names, so p
1c890 61 73 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d  ass an empty Nam
1c8a0 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20  eContext..  */. 
1c8b0 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
1c8c0 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
1c8d0 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
1c8e0 61 72 73 65 3b 0a 20 20 69 66 28 20 73 71 6c 69  arse;.  if( sqli
1c8f0 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
1c900 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69  mes(&sNC, p->pLi
1c910 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20 20 73 71  mit) ||.      sq
1c920 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
1c930 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
1c940 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72  Offset) ){.    r
1c950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1c960 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  OR;.  }..  /* Se
1c970 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e  t up the local n
1c980 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70  ame-context to p
1c990 61 73 73 20 74 6f 20 45 78 70 72 52 65 73 6f 6c  ass to ExprResol
1c9a0 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a  veNames() to.  *
1c9b0 2a 20 72 65 73 6f 6c 76 65 20 74 68 65 20 65 78  * resolve the ex
1c9c0 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20  pression-list.. 
1c9d0 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41   */.  sNC.allowA
1c9e0 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53  gg = 1;.  sNC.pS
1c9f0 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  rcList = p->pSrc
1ca00 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20  ;.  sNC.pNext = 
1ca10 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20  pOuterNC;..  /* 
1ca20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
1ca30 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
1ca40 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
1ca50 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
1ca60 21 70 45 4c 69 73 74 20 29 20 72 65 74 75 72 6e  !pEList ) return
1ca70 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1ca80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
1ca90 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1caa0 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20  .    Expr *pX = 
1cab0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
1cac0 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  pr;.    if( sqli
1cad0 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
1cae0 6d 65 73 28 26 73 4e 43 2c 20 70 58 29 20 29 7b  mes(&sNC, pX) ){
1caf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1cb00 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1cb10 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1cb20 68 65 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72  here are no aggr
1cb30 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1cb40 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  in the result-se
1cb50 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  t, and no GROUP 
1cb60 42 59 20 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  BY .  ** express
1cb70 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f  ion, do not allo
1cb80 77 20 61 67 67 72 65 67 61 74 65 73 20 69 6e 20  w aggregates in 
1cb90 61 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72  any of the other
1cba0 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
1cbb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d  */.  assert( !p-
1cbc0 3e 69 73 41 67 67 20 29 3b 0a 20 20 70 47 72 6f  >isAgg );.  pGro
1cbd0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1cbe0 42 79 3b 0a 20 20 69 66 28 20 70 47 72 6f 75 70  By;.  if( pGroup
1cbf0 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67 67  By || sNC.hasAgg
1cc00 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67 67   ){.    p->isAgg
1cc10 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
1cc20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20     sNC.allowAgg 
1cc30 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
1cc40 66 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73  f a HAVING claus
1cc50 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  e is present, th
1cc60 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
1cc70 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
1cc80 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
1cc90 2d 3e 70 48 61 76 69 6e 67 20 26 26 20 21 70 47  ->pHaving && !pG
1cca0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71  roupBy ){.    sq
1ccb0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1ccc0 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42  arse, "a GROUP B
1ccd0 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  Y clause is requ
1cce0 69 72 65 64 20 62 65 66 6f 72 65 20 48 41 56 49  ired before HAVI
1ccf0 4e 47 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  NG");.    return
1cd00 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1cd10 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
1cd20 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
1cd30 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e   to the name-con
1cd40 74 65 78 74 20 62 65 66 6f 72 65 20 70 61 72 73  text before pars
1cd50 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68  ing the.  ** oth
1cd60 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  er expressions i
1cd70 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
1cd80 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
1cd90 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 65 78 70  so that.  ** exp
1cda0 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
1cdb0 57 48 45 52 45 20 63 6c 61 75 73 65 20 28 65 74  WHERE clause (et
1cdc0 63 2e 29 20 63 61 6e 20 72 65 66 65 72 20 74 6f  c.) can refer to
1cdd0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79 0a   expressions by.
1cde0 20 20 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e 20    ** aliases in 
1cdf0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
1ce00 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20    **.  ** Minor 
1ce10 70 6f 69 6e 74 3a 20 49 66 20 74 68 69 73 20 69  point: If this i
1ce20 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
1ce30 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1ce40 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 72 65 2d  will be.  ** re-
1ce50 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61  evaluated for ea
1ce60 63 68 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ch reference to 
1ce70 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 70  it..  */.  sNC.p
1ce80 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
1ce90 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  t;.  if( sqlite3
1cea0 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
1ceb0 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65  (&sNC, p->pWhere
1cec0 29 20 7c 7c 0a 20 20 20 20 20 73 71 6c 69 74 65  ) ||.     sqlite
1ced0 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
1cee0 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69  s(&sNC, p->pHavi
1cef0 6e 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ng) ){.    retur
1cf00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
1cf10 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72    }.  if( p->pPr
1cf20 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ior==0 ){.    if
1cf30 28 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72  ( processOrderGr
1cf40 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
1cf50 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 31 2c   p->pOrderBy, 1,
1cf60 20 26 73 4e 43 2e 68 61 73 41 67 67 29 20 29 7b   &sNC.hasAgg) ){
1cf70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1cf80 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1cf90 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 6f 63  }.  }.  if( proc
1cfa0 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28  essOrderGroupBy(
1cfb0 70 50 61 72 73 65 2c 20 70 2c 20 70 47 72 6f 75  pParse, p, pGrou
1cfc0 70 42 79 2c 20 30 2c 20 26 73 4e 43 2e 68 61 73  pBy, 0, &sNC.has
1cfd0 41 67 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Agg) ){.    retu
1cfe0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1cff0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72  .  }..  if( pPar
1d000 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1d010 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
1d020 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1d030 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
1d040 73 75 72 65 20 74 68 65 20 47 52 4f 55 50 20 42  sure the GROUP B
1d050 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f  Y clause does no
1d060 74 20 63 6f 6e 74 61 69 6e 20 61 67 67 72 65 67  t contain aggreg
1d070 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  ate functions.. 
1d080 20 2a 2f 0a 20 20 69 66 28 20 70 47 72 6f 75 70   */.  if( pGroup
1d090 42 79 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  By ){.    struct
1d0a0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1d0b0 70 49 74 65 6d 3b 0a 20 20 0a 20 20 20 20 66 6f  pItem;.  .    fo
1d0c0 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72  r(i=0, pItem=pGr
1d0d0 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f  oupBy->a; i<pGro
1d0e0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
1d0f0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1d100 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1d110 70 65 72 74 79 28 70 49 74 65 6d 2d 3e 70 45 78  perty(pItem->pEx
1d120 70 72 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20  pr, EP_Agg) ){. 
1d130 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1d140 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1d150 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1d160 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ons are not allo
1d170 77 65 64 20 69 6e 20 22 0a 20 20 20 20 20 20 20  wed in ".       
1d180 20 20 20 20 20 22 74 68 65 20 47 52 4f 55 50 20       "the GROUP 
1d190 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20  BY clause");.   
1d1a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d1b0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
1d1c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1d1d0 2a 20 49 66 20 74 68 69 73 20 69 73 20 6f 6e 65  * If this is one
1d1e0 20 53 45 4c 45 43 54 20 6f 66 20 61 20 63 6f 6d   SELECT of a com
1d1f0 70 6f 75 6e 64 2c 20 62 65 20 73 75 72 65 20 74  pound, be sure t
1d200 6f 20 72 65 73 6f 6c 76 65 20 6e 61 6d 65 73 0a  o resolve names.
1d210 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 74 68 65    ** in the othe
1d220 72 20 53 45 4c 45 43 54 73 2e 0a 20 20 2a 2f 0a  r SELECTs..  */.
1d230 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
1d240 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
1d250 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c  lite3SelectResol
1d260 76 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  ve(pParse, p->pP
1d270 72 69 6f 72 2c 20 70 4f 75 74 65 72 4e 43 29 3b  rior, pOuterNC);
1d280 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1d290 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d2a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73    }.}../*.** Res
1d2b0 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65  et the aggregate
1d2c0 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a   accumulator..**
1d2d0 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74  .** The aggregat
1d2e0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73  e accumulator is
1d2f0 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79   a set of memory
1d300 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64   cells that hold
1d310 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65  .** intermediate
1d320 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63   results while c
1d330 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67  alculating an ag
1d340 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a  gregate.  This.*
1d350 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79  * routine simply
1d360 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e   stores NULLs in
1d370 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65   all of those me
1d380 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  mory cells..*/.s
1d390 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74  tatic void reset
1d3a0 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
1d3b0 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
1d3c0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
1d3d0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1d3e0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1d3f0 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
1d400 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b  nfo_func *pFunc;
1d410 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  .  if( pAggInfo-
1d420 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d  >nFunc+pAggInfo-
1d430 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20  >nColumn==0 ){. 
1d440 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1d450 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
1d460 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  Info->nColumn; i
1d470 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1d480 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d490 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
1d4a0 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
1d4b0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75  );.  }.  for(pFu
1d4c0 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  nc=pAggInfo->aFu
1d4d0 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49  nc, i=0; i<pAggI
1d4e0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
1d4f0 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73   pFunc++){.    s
1d500 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d510 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
1d520 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20  pFunc->iMem);.  
1d530 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69    if( pFunc->iDi
1d540 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
1d550 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46     Expr *pE = pF
1d560 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  unc->pExpr;.    
1d570 20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d    if( pE->pList=
1d580 3d 30 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d  =0 || pE->pList-
1d590 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
1d5a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1d5b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49  rMsg(pParse, "DI
1d5c0 53 54 49 4e 43 54 20 69 6e 20 61 67 67 72 65 67  STINCT in aggreg
1d5d0 61 74 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c  ate must be foll
1d5e0 6f 77 65 64 20 22 0a 20 20 20 20 20 20 20 20 20  owed ".         
1d5f0 20 20 22 62 79 20 61 6e 20 65 78 70 72 65 73 73    "by an express
1d600 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ion");.        p
1d610 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20  Func->iDistinct 
1d620 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1d630 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  e{.        KeyIn
1d640 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b  fo *pKeyInfo = k
1d650 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
1d660 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70  st(pParse, pE->p
1d670 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73  List);.        s
1d680 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1d690 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
1d6a0 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69  eral, pFunc->iDi
1d6b0 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6d0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1d6e0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
1d6f0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
1d700 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d710 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
1d720 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69  the OP_AggFinali
1d730 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76  ze opcode for ev
1d740 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75  ery aggregate fu
1d750 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  nction.** in the
1d760 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
1d770 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
1d780 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75  id finalizeAggFu
1d790 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70  nctions(Parse *p
1d7a0 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
1d7b0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
1d7c0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1d7d0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
1d7e0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1d7f0 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28  func *pF;.  for(
1d800 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
1d810 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
1d820 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
1d830 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   pF++){.    Expr
1d840 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
1d850 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  ->pExpr->pList;.
1d860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d870 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46  ddOp4(v, OP_AggF
1d880 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20  inal, pF->iMem, 
1d890 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
1d8a0 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20  Expr : 0, 0,.   
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8c0 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46     (void*)pF->pF
1d8d0 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
1d8e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ;.  }.}../*.** U
1d8f0 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75  pdate the accumu
1d900 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c  lator memory cel
1d910 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67  ls for an aggreg
1d920 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ate based on.** 
1d930 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
1d940 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
1d950 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61  static void upda
1d960 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  teAccumulator(Pa
1d970 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
1d980 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
1d990 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1d9a0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1d9b0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
1d9c0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
1d9d0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1d9e0 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67  _col *pC;..  pAg
1d9f0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
1da00 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 1;.  for(i=0
1da10 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
1da20 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
1da30 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
1da40 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ++){.    int nAr
1da50 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  g;.    int addrN
1da60 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
1da70 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70   regAgg;.    Exp
1da80 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
1da90 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b  F->pExpr->pList;
1daa0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
1dab0 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70  {.      nArg = p
1dac0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
1dad0 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69     regAgg = sqli
1dae0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1daf0 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20  pParse, nArg);. 
1db00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1db10 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
1db20 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41  rse, pList, regA
1db30 67 67 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  gg, 0);.    }els
1db40 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  e{.      nArg = 
1db50 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  0;.      regAgg 
1db60 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
1db70 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
1db80 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
1db90 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
1dba0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1dbb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
1dbc0 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Arg==1 );.      
1dbd0 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
1dbe0 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  rse, pF->iDistin
1dbf0 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
1dc00 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a   regAgg);.    }.
1dc10 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
1dc20 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  c->needCollSeq )
1dc30 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
1dc40 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
1dc50 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1dc60 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1dc70 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1dc80 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
1dc90 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
1dca0 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 2d  =0 if pF->pFunc-
1dcb0 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 69 73 20  >needCollSeq is 
1dcc0 74 72 75 65 20 2a 2f 0a 20 20 20 20 20 20 66 6f  true */.      fo
1dcd0 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
1dce0 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
1dcf0 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
1dd00 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
1dd10 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1dd20 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1dd30 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
1dd40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1dd50 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
1dd60 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
1dd70 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
1dd80 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
1dd90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1dda0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
1ddb0 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  eq, 0, 0, 0, (ch
1ddc0 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
1ddd0 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
1dde0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ddf0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74  dOp4(v, OP_AggSt
1de00 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70  ep, 0, regAgg, p
1de10 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20  F->iMem,.       
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1de30 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
1de40 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
1de50 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1de60 6e 67 65 50 35 28 76 2c 20 6e 41 72 67 29 3b 0a  ngeP5(v, nArg);.
1de70 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1de80 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
1de90 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
1dea0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1deb0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1dec0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
1ded0 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
1dee0 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b   if( addrNext ){
1def0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1df00 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1df10 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
1df20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30   }.  }.  for(i=0
1df30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pC=pAggInfo->a
1df40 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  Col; i<pAggInfo-
1df50 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69  >nAccumulator; i
1df60 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73  ++, pC++){.    s
1df70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1df80 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72  Parse, pC->pExpr
1df90 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d  , pC->iMem);.  }
1dfa0 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
1dfb0 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a  ectMode = 0;.}..
1dfc0 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73  #if 0./*.** This
1dfd0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1dfe0 64 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20  d when a SELECT 
1dff0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 73 65  statement is use
1e000 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a  d to create a.**
1e010 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1e020 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   for iterating t
1e030 68 72 6f 75 67 68 20 77 68 65 6e 20 72 75 6e 6e  hrough when runn
1e040 69 6e 67 20 61 6e 20 49 4e 53 54 45 41 44 20 4f  ing an INSTEAD O
1e050 46 0a 2a 2a 20 55 50 44 41 54 45 20 6f 72 20 49  F.** UPDATE or I
1e060 4e 53 54 45 41 44 20 4f 46 20 44 45 4c 45 54 45  NSTEAD OF DELETE
1e070 20 74 72 69 67 67 65 72 2e 20 0a 2a 2a 0a 2a 2a   trigger. .**.**
1e080 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   If possible, th
1e090 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1e0a0 6e 74 20 69 73 20 6d 6f 64 69 66 69 65 64 20 73  nt is modified s
1e0b0 6f 20 74 68 61 74 20 4e 55 4c 4c 20 76 61 6c 75  o that NULL valu
1e0c0 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  es.** are stored
1e0d0 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
1e0e0 79 20 74 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20  y table for all 
1e0f0 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63  columns for whic
1e100 68 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73  h the .** corres
1e110 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61  ponding bit in a
1e120 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20  rgument mask is 
1e130 6e 6f 74 20 73 65 74 2e 20 49 66 20 6d 61 73 6b  not set. If mask
1e140 20 74 61 6b 65 73 20 74 68 65 0a 2a 2a 20 73 70   takes the.** sp
1e150 65 63 69 61 6c 20 76 61 6c 75 65 20 30 78 66 66  ecial value 0xff
1e160 66 66 66 66 66 66 2c 20 74 68 65 6e 20 61 6c 6c  ffffff, then all
1e170 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 6f 70   columns are pop
1e180 75 6c 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ulated..*/.void 
1e190 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4d 61 73  sqlite3SelectMas
1e1a0 6b 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  k(Parse *pParse,
1e1b0 20 53 65 6c 65 63 74 20 2a 70 2c 20 75 33 32 20   Select *p, u32 
1e1c0 6d 61 73 6b 29 7b 0a 20 20 69 66 28 20 70 20 26  mask){.  if( p &
1e1d0 26 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20  & !p->pPrior && 
1e1e0 21 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26  !p->isDistinct &
1e1f0 26 20 6d 61 73 6b 21 3d 30 78 66 66 66 66 66 66  & mask!=0xffffff
1e200 66 66 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  ff ){.    ExprLi
1e210 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
1e220 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74  int i;.    sqlit
1e230 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
1e240 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20  pParse, p, 0);. 
1e250 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70     pEList = p->p
1e260 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69  EList;.    for(i
1e270 3d 30 3b 20 70 45 4c 69 73 74 20 26 26 20 69 3c  =0; pEList && i<
1e280 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 26  pEList->nExpr &&
1e290 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<32; i++){.   
1e2a0 20 20 20 69 66 28 20 21 28 6d 61 73 6b 26 28 28     if( !(mask&((
1e2b0 75 33 32 29 31 3c 3c 69 29 29 20 29 7b 0a 20 20  u32)1<<i)) ){.  
1e2c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e2d0 72 44 65 6c 65 74 65 28 70 45 4c 69 73 74 2d 3e  rDelete(pEList->
1e2e0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
1e2f0 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 69       pEList->a[i
1e300 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ].pExpr = sqlite
1e310 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62  3Expr(pParse->db
1e320 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c  , TK_NULL, 0, 0,
1e330 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1e340 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
1e350 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1e360 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69 76  code for the giv
1e370 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  en SELECT statem
1e380 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ent..**.** The r
1e390 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72  esults are distr
1e3a0 69 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75  ibuted in variou
1e3b0 73 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67  s ways depending
1e3c0 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   on the.** conte
1e3d0 6e 74 73 20 6f 66 20 74 68 65 20 53 65 6c 65 63  nts of the Selec
1e3e0 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 20  tDest structure 
1e3f0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 61 72  pointed to by ar
1e400 67 75 6d 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20  gument pDest.** 
1e410 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
1e420 2a 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65  *     pDest->eDe
1e430 73 74 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20  st    Result.** 
1e440 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
1e450 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
1e460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1e480 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62  **     SRT_Callb
1e490 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68  ack    Invoke th
1e4a0 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65  e callback for e
1e4b0 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72  ach row of the r
1e4c0 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  esult..**.**    
1e4d0 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20   SRT_Mem        
1e4e0 20 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73   Store first res
1e4f0 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  ult in memory ce
1e500 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 0a  ll pDest->iParm.
1e510 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
1e520 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  t         Store 
1e530 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20  results as keys 
1e540 6f 66 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  of table pDest->
1e550 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20  iParm. .**      
1e560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
1e570 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74  pply the affinit
1e580 79 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74  y pDest->affinit
1e590 79 20 62 65 66 6f 72 65 20 73 74 6f 72 69 6e 67  y before storing
1e5a0 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   them..**.**    
1e5b0 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20   SRT_Union      
1e5c0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
1e5d0 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d  s a key in a tem
1e5e0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
1e5f0 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  st->iParm..**.**
1e600 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20       SRT_Except 
1e610 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75       Remove resu
1e620 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d  lts from the tem
1e630 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
1e640 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  st->iParm..**.**
1e650 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20       SRT_Table  
1e660 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
1e670 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  ts in temporary 
1e680 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
1e690 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
1e6a0 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43 72 65  _EphemTab    Cre
1e6b0 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72 79  ate an temporary
1e6c0 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
1e6d0 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a  arm and store.**
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6f0 20 20 20 20 20 74 68 65 20 72 65 73 75 6c 74 20       the result 
1e700 74 68 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f  there. The curso
1e710 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61  r is left open a
1e720 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  fter.**         
1e730 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1e740 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  rning..**.**    
1e750 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20   SRT_Coroutine  
1e760 20 49 6e 76 6f 6b 65 20 61 20 63 6f 2d 72 6f 75   Invoke a co-rou
1e770 74 69 6e 65 20 74 6f 20 63 6f 6d 70 75 74 65 20  tine to compute 
1e780 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
1e790 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1e7a0 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73 75          the resu
1e7b0 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  lt.**.**     SRT
1e7c0 5f 45 78 69 73 74 73 20 20 20 20 20 20 53 74 6f  _Exists      Sto
1e7d0 72 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79  re a 1 in memory
1e7e0 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61   cell pDest->iPa
1e7f0 72 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  rm if the result
1e800 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1e810 20 20 20 20 20 20 20 20 73 65 74 20 69 73 20 6e          set is n
1e820 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  ot empty..**.** 
1e830 20 20 20 20 53 52 54 5f 44 69 73 63 61 72 64 20      SRT_Discard 
1e840 20 20 20 20 54 68 72 6f 77 20 74 68 65 20 72 65      Throw the re
1e850 73 75 6c 74 73 20 61 77 61 79 2e 0a 2a 2a 0a 2a  sults away..**.*
1e860 2a 20 53 65 65 20 74 68 65 20 73 65 6c 65 63 74  * See the select
1e870 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63  InnerLoop() func
1e880 74 69 6f 6e 20 66 6f 72 20 61 20 63 61 6e 6f 6e  tion for a canon
1e890 69 63 61 6c 20 6c 69 73 74 69 6e 67 20 6f 66 20  ical listing of 
1e8a0 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20  the .** allowed 
1e8b0 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20  values of eDest 
1e8c0 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e  and their meanin
1e8d0 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  gs..**.** This r
1e8e0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
1e8f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
1e900 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
1e910 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
1e920 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
1e930 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
1e940 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
1e950 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
1e960 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
1e970 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
1e980 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
1e990 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
1e9a0 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
1e9b0 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
1e9c0 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
1e9d0 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  hat..**.** The p
1e9e0 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
1e9f0 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41  b, and *pParentA
1ea00 67 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69  gg fields are fi
1ea10 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a  lled in if this.
1ea20 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73  ** SELECT is a s
1ea30 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72  ubquery.  This r
1ea40 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74  outine may try t
1ea50 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53  o combine this S
1ea60 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74  ELECT.** with it
1ea70 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d  s parent to form
1ea80 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71   a single flat q
1ea90 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69  uery.  In so doi
1eaa0 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20  ng, it might.** 
1eab0 63 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e  change the paren
1eac0 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e  t query from a n
1ead0 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20  on-aggregate to 
1eae0 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
1eaf0 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20  ry..** For that 
1eb00 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72  reason, the pPar
1eb10 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70  entAgg flag is p
1eb20 61 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74  assed as a point
1eb30 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e  er, so it.** can
1eb40 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a   be changed..**.
1eb50 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20  ** Example 1:   
1eb60 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
1eb70 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d  he pParent param
1eb80 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  eter..**.**    S
1eb90 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1eba0 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20  JOIN (SELECT x, 
1ebb0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
1ebc0 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20  ) JOIN t3;.**   
1ebd0 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
1ebe0 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
1ebf0 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f   subquery ______
1ec00 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20  _/        /.**  
1ec10 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20            /.**  
1ec50 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
1ec60 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
1ec70 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
1ec80 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a  _________/.**.**
1ec90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1eca0 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
1ecb0 6f 75 74 65 72 20 71 75 65 72 79 20 66 69 72 73  outer query firs
1ecc0 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63 61  t.   For that ca
1ecd0 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77  ll,.** pParent w
1ece0 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75  ill be NULL.  Du
1ecf0 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73  ring the process
1ed00 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72  ing of the outer
1ed10 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a   query, this .**
1ed20 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1ed30 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 74  ed recursively t
1ed40 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62  o handle the sub
1ed50 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20  query.  For the 
1ed60 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c  recursive.** cal
1ed70 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20  l, pParent will 
1ed80 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74  point to the out
1ed90 65 72 20 71 75 65 72 79 2e 20 20 42 65 63 61 75  er query.  Becau
1eda0 73 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  se the subquery 
1edb0 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64  is.** the second
1edc0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68   element in a th
1edd0 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68  ree-way join, th
1ede0 65 20 70 61 72 65 6e 74 54 61 62 20 70 61 72 61  e parentTab para
1edf0 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65  meter will.** be
1ee00 20 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75   1 (the 2nd valu
1ee10 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64  e of a 0-indexed
1ee20 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20   array.).*/.int 
1ee30 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
1ee40 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1ee50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1ee60 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
1ee70 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1ee80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ee90 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1eea0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
1eeb0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
1eec0 70 44 65 73 74 2c 20 20 20 20 20 2f 2a 20 57 68  pDest,     /* Wh
1eed0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
1eee0 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
1eef0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61  */.  Select *pPa
1ef00 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 41  rent,       /* A
1ef10 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 66 6f  nother SELECT fo
1ef20 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20  r which this is 
1ef30 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20  a sub-query */. 
1ef40 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62 2c 20   int parentTab, 
1ef50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1ef60 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53 72   in pParent->pSr
1ef70 63 20 6f 66 20 74 68 69 73 20 71 75 65 72 79 20  c of this query 
1ef80 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72 65 6e  */.  int *pParen
1ef90 74 41 67 67 2c 20 20 20 20 20 20 20 2f 2a 20 54  tAgg,       /* T
1efa0 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 75  rue if pParent u
1efb0 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
1efc0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  nctions */.  cha
1efd0 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20  r *aff          
1efe0 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20      /* If eDest 
1eff0 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68  is SRT_Union, th
1f000 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
1f010 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  g */.){.  int i,
1f020 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
1f030 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1f040 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  s */.  WhereInfo
1f050 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a   *pWInfo;     /*
1f060 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c   Return from sql
1f070 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
1f080 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
1f090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f0a0 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  The virtual mach
1f0b0 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ine under constr
1f0c0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
1f0d0 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20  isAgg;          
1f0e0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73     /* True for s
1f0f0 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65  elect lists like
1f100 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20   "count(*)" */. 
1f110 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1f120 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
1f130 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78  of columns to ex
1f140 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c  tract. */.  SrcL
1f150 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
1f160 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
1f170 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66  bles to select f
1f180 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  rom */.  Expr *p
1f190 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
1f1a0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1f1b0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
1f1c0 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
1f1d0 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a  *pOrderBy;    /*
1f1e0 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
1f1f0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
1f200 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
1f210 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
1f220 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
1f230 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
1f240 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
1f250 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
1f260 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
1f270 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
1f280 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69  LL */.  int isDi
1f290 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f  stinct;        /
1f2a0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
1f2b0 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
1f2c0 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
1f2d0 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20  nt distinct;    
1f2e0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1f2f0 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
1f300 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20  stinct set */.  
1f310 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
1f320 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1f330 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
1f340 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
1f350 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e    int addrSortIn
1f360 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  dex;     /* Addr
1f370 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65  ess of an OP_Ope
1f380 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
1f390 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49  uction */.  AggI
1f3a0 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20  nfo sAggInfo;   
1f3b0 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
1f3c0 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67  n used by aggreg
1f3d0 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
1f3e0 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20   int iEnd;      
1f3f0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1f400 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66  ss of the end of
1f410 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
1f420 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
1f430 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1f440 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1f450 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61  n */..  db = pPa
1f460 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
1f470 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
1f480 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1f490 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72  e->nErr ){.    r
1f4a0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
1f4b0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1f4c0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1f4d0 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
1f4e0 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   0) ) return 1;.
1f4f0 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e    memset(&sAggIn
1f500 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  fo, 0, sizeof(sA
1f510 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 70 4f 72  ggInfo));..  pOr
1f520 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
1f530 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72  rBy;.  if( Ignor
1f540 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
1f550 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72  t) ){.    p->pOr
1f560 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 20 20  derBy = 0;..    
1f570 2f 2a 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  /* In these case
1f580 73 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f  s the DISTINCT o
1f590 70 65 72 61 74 6f 72 20 6d 61 6b 65 73 20 6e 6f  perator makes no
1f5a0 20 64 69 66 66 65 72 65 6e 63 65 20 74 6f 20 74   difference to t
1f5b0 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
1f5c0 73 2c 20 73 6f 20 72 65 6d 6f 76 65 20 69 74 20  s, so remove it 
1f5d0 69 66 20 69 74 20 77 65 72 65 20 73 70 65 63 69  if it were speci
1f5e0 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
1f5f0 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65   assert(pDest->e
1f600 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73  Dest==SRT_Exists
1f610 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
1f620 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a  ==SRT_Union || .
1f630 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
1f640 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63  ->eDest==SRT_Exc
1f650 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ept || pDest->eD
1f660 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64  est==SRT_Discard
1f670 29 3b 0a 20 20 20 20 70 2d 3e 69 73 44 69 73 74  );.    p->isDist
1f680 69 6e 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  inct = 0;.  }.  
1f690 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
1f6a0 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
1f6b0 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f   p, 0) ){.    go
1f6c0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1f6d0 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79   }.  p->pOrderBy
1f6e0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 0a 20   = pOrderBy;... 
1f6f0 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63   /* Make local c
1f700 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
1f710 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73  ameters for this
1f720 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
1f730 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
1f740 63 3b 0a 20 20 69 73 41 67 67 20 3d 20 70 2d 3e  c;.  isAgg = p->
1f750 69 73 41 67 67 3b 0a 20 20 70 45 4c 69 73 74 20  isAgg;.  pEList 
1f760 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
1f770 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67  f( pEList==0 ) g
1f780 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1f790 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e  .  /* .  ** Do n
1f7a0 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20  ot even attempt 
1f7b0 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20  to generate any 
1f7c0 63 6f 64 65 20 69 66 20 77 65 20 68 61 76 65 20  code if we have 
1f7d0 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a  already seen.  *
1f7e0 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20  * errors before 
1f7f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  this routine sta
1f800 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rts..  */.  if( 
1f810 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
1f820 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1f830 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ;..  /* If writi
1f840 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
1f850 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
1f860 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
1f870 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
1f880 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23  e output..  */.#
1f890 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f8a0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
1f8b0 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
1f8c0 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
1f8d0 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
1f8e0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
1f8f0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
1f900 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
1f910 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59  f..  /* ORDER BY
1f920 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20   is ignored for 
1f930 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e  some destination
1f940 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 67  s..  */.  if( Ig
1f950 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
1f960 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 4f 72  Dest) ){.    pOr
1f970 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a  derBy = 0;.  }..
1f980 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
1f990 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f  ating code..  */
1f9a0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1f9b0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1f9c0 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
1f9d0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
1f9e0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1f9f0 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
1fa00 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
1fa10 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66   clause.  */.#if
1fa20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1fa30 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1fa40 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1fa50 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
1fa60 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72  for(i=0; !p->pPr
1fa70 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73  ior && i<pTabLis
1fa80 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
1fa90 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1faa0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1fab0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
1fac0 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20  .    SelectDest 
1fad0 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  dest;.    Select
1fae0 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
1faf0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74  pSelect;.    int
1fb00 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20   isAggSub;..    
1fb10 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 70  if( pSub==0 || p
1fb20 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
1fb30 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  d ) continue;.  
1fb40 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61    if( pItem->zNa
1fb50 6d 65 21 3d 30 20 29 7b 20 20 20 2f 2a 20 41 6e  me!=0 ){   /* An
1fb60 20 73 71 6c 20 76 69 65 77 20 2a 2f 0a 20 20 20   sql view */.   
1fb70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1fb80 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
1fb90 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
1fba0 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70  Context;.      p
1fbb0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
1fbc0 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61  ext = pItem->zNa
1fbd0 6d 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  me;.      rc = s
1fbe0 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f  qlite3SelectReso
1fbf0 6c 76 65 28 70 50 61 72 73 65 2c 20 70 53 75 62  lve(pParse, pSub
1fc00 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
1fc10 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1fc20 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
1fc30 74 65 78 74 3b 0a 20 20 20 20 20 20 69 66 28 20  text;.      if( 
1fc40 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
1fc50 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1fc60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1fc70 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
1fc80 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
1fc90 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
1fca0 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
1fcb0 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
1fcc0 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 74   refered to by t
1fcd0 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
1fce0 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
1fcf0 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
1fd00 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
1fd10 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
1fd20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
1fd30 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
1fd40 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
1fd50 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
1fd60 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
1fd70 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
1fd80 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
1fd90 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
1fda0 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
1fdb0 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
1fdc0 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
1fdd0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
1fde0 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
1fdf0 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
1fe00 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
1fe10 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1fe20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20  subquery can be 
1fe30 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 74 68  absorbed into th
1fe40 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  e parent. */.   
1fe50 20 69 73 41 67 67 53 75 62 20 3d 20 70 53 75 62   isAggSub = pSub
1fe60 2d 3e 69 73 41 67 67 3b 0a 20 20 20 20 69 66 28  ->isAgg;.    if(
1fe70 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
1fe80 28 64 62 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  (db, p, i, isAgg
1fe90 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20  , isAggSub) ){. 
1fea0 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75       if( isAggSu
1feb0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  b ){.        p->
1fec0 69 73 41 67 67 20 3d 20 69 73 41 67 67 20 3d 20  isAgg = isAgg = 
1fed0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1fee0 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c   i = -1;.    }el
1fef0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1ff00 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
1ff10 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d  &dest, SRT_Ephem
1ff20 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Tab, pItem->iCur
1ff30 73 6f 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  sor);.      sqli
1ff40 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
1ff50 2c 20 70 53 75 62 2c 20 26 64 65 73 74 2c 20 70  , pSub, &dest, p
1ff60 2c 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b  , i, &isAgg, 0);
1ff70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
1ff80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1ff90 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
1ffa0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
1ffb0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
1ffc0 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65  ght -= sqlite3Se
1ffd0 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
1ffe0 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20  );.    pTabList 
1fff0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
20000 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64  f( !IgnorableOrd
20010 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
20020 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
20030 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
20040 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
20050 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e  = p->pEList;.#en
20060 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70  dif.  pWhere = p
20070 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
20080 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
20090 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
200a0 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
200b0 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
200c0 44 69 73 74 69 6e 63 74 3b 0a 0a 23 69 66 6e 64  Distinct;..#ifnd
200d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
200e0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
200f0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
20100 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f  are a sequence o
20110 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68  f queries, do th
20120 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66  e earlier ones f
20130 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irst..  */.  if(
20140 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
20150 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d    if( p->pRightm
20160 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ost==0 ){.      
20170 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a  Select *pLoop, *
20180 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  pRight = 0;.    
20190 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
201a0 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63       int mxSelec
201b0 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f  t;.      for(pLo
201c0 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
201d0 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
201e0 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20  , cnt++){.      
201f0 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d    pLoop->pRightm
20200 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ost = p;.       
20210 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20   pLoop->pNext = 
20220 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
20230 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a  pRight = pLoop;.
20240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 78        }.      mx
20250 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69  Select = db->aLi
20260 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
20270 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
20280 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53  ];.      if( mxS
20290 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d 78 53  elect && cnt>mxS
202a0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
202b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
202c0 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
202d0 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70  ny terms in comp
202e0 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20  ound SELECT");. 
202f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
20300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20310 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
20320 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
20330 20 70 44 65 73 74 2c 20 61 66 66 29 3b 0a 20 20   pDest, aff);.  
20340 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
20350 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 77 72  f possible, rewr
20360 69 74 65 20 74 68 65 20 71 75 65 72 79 20 74 6f  ite the query to
20370 20 75 73 65 20 47 52 4f 55 50 20 42 59 20 69 6e   use GROUP BY in
20380 73 74 65 61 64 20 6f 66 20 44 49 53 54 49 4e 43  stead of DISTINC
20390 54 2e 0a 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  T..  ** GROUP BY
203a0 20 6d 61 79 20 75 73 65 20 61 6e 20 69 6e 64 65   may use an inde
203b0 78 2c 20 44 49 53 54 49 4e 43 54 20 6e 65 76 65  x, DISTINCT neve
203c0 72 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  r does..  */.  i
203d0 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  f( p->isDistinct
203e0 20 26 26 20 21 70 2d 3e 69 73 41 67 67 20 26 26   && !p->isAgg &&
203f0 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b   !p->pGroupBy ){
20400 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79  .    p->pGroupBy
20410 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
20420 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
20430 69 73 74 29 3b 0a 20 20 20 20 70 47 72 6f 75 70  ist);.    pGroup
20440 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
20450 3b 0a 20 20 20 20 70 2d 3e 69 73 44 69 73 74 69  ;.    p->isDisti
20460 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 69 73 44  nct = 0;.    isD
20470 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 7d  istinct = 0;.  }
20480 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
20490 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
204a0 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73  lause, then this
204b0 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e   sorting.  ** in
204c0 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70  dex might end up
204d0 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66   being unused if
204e0 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65   the data can be
204f0 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64   .  ** extracted
20500 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f   in pre-sorted o
20510 72 64 65 72 2e 20 20 49 66 20 74 68 61 74 20 69  rder.  If that i
20520 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
20530 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65   the.  ** OP_Ope
20540 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
20550 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  uction will be c
20560 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f  hanged to an OP_
20570 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77  Noop once.  ** w
20580 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61  e figure out tha
20590 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  t the sorting in
205a0 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65  dex is not neede
205b0 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72 74  d.  The addrSort
205c0 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61  Index.  ** varia
205d0 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66  ble is used to f
205e0 61 63 69 6c 69 74 61 74 65 20 74 68 61 74 20 63  acilitate that c
205f0 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hange..  */.  if
20600 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
20610 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
20620 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  nfo;.    pKeyInf
20630 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
20640 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
20650 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70  pOrderBy);.    p
20660 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
20670 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
20680 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f  ++;.    p->addrO
20690 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64  penEphm[2] = add
206a0 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20  rSortIndex =.   
206b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
206c0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
206d0 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
206e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206f0 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69       pOrderBy->i
20700 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42  ECursor, pOrderB
20710 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20  y->nExpr+2, 0,. 
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20730 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
20740 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
20750 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
20760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
20770 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b  rSortIndex = -1;
20780 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
20790 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74  e output is dest
207a0 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f  ined for a tempo
207b0 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e  rary table, open
207c0 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a   that table..  *
207d0 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65  /.  if( pDest->e
207e0 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
207f0 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
20800 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20810 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
20820 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 70   pDest->iParm, p
20830 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
20840 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
20850 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
20860 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
20870 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
20880 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
20890 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
208a0 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a   p, iEnd);..  /*
208b0 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20   Open a virtual 
208c0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
208d0 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
208e0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  t..  */.  if( is
208f0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
20900 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
20910 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  o;.    assert( i
20920 73 41 67 67 20 7c 7c 20 70 47 72 6f 75 70 42 79  sAgg || pGroupBy
20930 20 29 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74   );.    distinct
20940 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
20950 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  +;.    pKeyInfo 
20960 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
20970 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d  rList(pParse, p-
20980 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71  >pEList);.    sq
20990 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
209a0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
209b0 72 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30  ral, distinct, 0
209c0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
209e0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
209f0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
20a00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20a10 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  distinct = -1;. 
20a20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61   }..  /* Aggrega
20a30 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65  te and non-aggre
20a40 67 61 74 65 20 71 75 65 72 69 65 73 20 61 72 65  gate queries are
20a50 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
20a60 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69  ntly */.  if( !i
20a70 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79  sAgg && pGroupBy
20a80 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
20a90 69 73 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e  is case is for n
20aa0 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
20ab0 72 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69  ries.    ** Begi
20ac0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
20ad0 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  can.    */.    p
20ae0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
20af0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
20b00 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
20b10 72 65 2c 20 26 70 4f 72 64 65 72 42 79 2c 20 30  re, &pOrderBy, 0
20b20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
20b30 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
20b40 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
20b50 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
20b60 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
20b70 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
20b80 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
20b90 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
20ba0 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
20bb0 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
20bc0 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
20bd0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
20be0 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
20bf0 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
20c00 20 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64   if( addrSortInd
20c10 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42  ex>=0 && pOrderB
20c20 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y==0 ){.      sq
20c30 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
20c40 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72  oNoop(v, addrSor
20c50 74 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 20  tIndex, 1);.    
20c60 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
20c70 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  m[2] = -1;.    }
20c80 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
20c90 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
20ca0 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20  loop.    */.    
20cb0 61 73 73 65 72 74 28 21 69 73 44 69 73 74 69 6e  assert(!isDistin
20cc0 63 74 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49  ct);.    selectI
20cd0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
20ce0 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
20cf0 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20  , pOrderBy, -1, 
20d00 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
20d10 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
20d20 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57  o->iContinue, pW
20d30 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66  Info->iBreak, af
20d40 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  f);..    /* End 
20d50 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
20d60 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
20d70 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
20d80 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
20d90 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
20da0 20 69 73 20 74 68 65 20 70 72 6f 63 65 73 73 69   is the processi
20db0 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
20dc0 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20   queries */.    
20dd0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
20de0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
20df0 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ext for processi
20e00 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66  ng aggregate inf
20e10 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
20e20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20  int iAMem;      
20e30 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
20e40 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f   address for sto
20e50 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f  ring current GRO
20e60 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
20e70 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iBMem;         
20e80 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
20e90 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f  dress for previo
20ea0 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  us GROUP BY */. 
20eb0 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b     int iUseFlag;
20ec0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64         /* Mem ad
20ed0 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c  dress holding fl
20ee0 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ag indicating th
20ef0 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20  at at least.    
20f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f10 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f      ** one row o
20f20 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74  f the input to t
20f30 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61  he aggregator ha
20f40 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20  s been.         
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
20f60 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  * processed */. 
20f70 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61     int iAbortFla
20f80 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64  g;     /* Mem ad
20f90 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73  dress which caus
20fa0 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69  es query abort i
20fb0 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20  f positive */.  
20fc0 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72    int groupBySor
20fd0 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f  t;    /* Rows co
20fe0 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69  me from source i
20ff0 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
21000 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54 68 65   */...    /* The
21010 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
21020 62 6c 65 73 20 68 6f 6c 64 20 61 64 64 72 65 73  bles hold addres
21030 73 65 73 20 6f 72 20 6c 61 62 65 6c 73 20 66 6f  ses or labels fo
21040 72 20 70 61 72 74 73 20 6f 66 20 74 68 65 0a 20  r parts of the. 
21050 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
21060 63 68 69 6e 65 20 70 72 6f 67 72 61 6d 20 77 65  chine program we
21070 20 61 72 65 20 70 75 74 74 69 6e 67 20 74 6f 67   are putting tog
21080 65 74 68 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ether */.    int
21090 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20   addrOutputRow; 
210a0 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
210b0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
210c0 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c   outputs a resul
210d0 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  t row */.    int
210e0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
210f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61       /* Return a
21100 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
21110 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f  for output subro
21120 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 69 6e 74  utine */.    int
21130 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20   addrSetAbort;  
21140 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
21150 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72  abort flag and r
21160 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  eturn */.    int
21170 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c   addrInitializeL
21180 6f 6f 70 3b 20 2f 2a 20 53 74 61 72 74 20 6f 66  oop; /* Start of
21190 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69   code that initi
211a0 61 6c 69 7a 65 73 20 74 68 65 20 69 6e 70 75 74  alizes the input
211b0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74   loop */.    int
211c0 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20   addrTopOfLoop; 
211d0 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
211e0 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
211f0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
21200 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
21210 45 6e 64 20 6f 66 20 61 6c 6c 20 70 72 6f 63 65  End of all proce
21220 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  ssing */.    int
21230 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b   addrSortingIdx;
21240 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 4f       /* The OP_O
21250 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72  penEphemeral for
21260 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
21270 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ex */.    int ad
21280 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 20 20  drReset;        
21290 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
212a0 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68  for resetting th
212b0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f  e accumulator */
212c0 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65  .    int regRese
212d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
212e0 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
212f0 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65  egister for rese
21300 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  t subroutine */.
21310 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
21320 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
21330 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
21340 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
21350 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
21360 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
21370 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
21380 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
21390 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
213a0 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
213b0 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
213c0 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
213d0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
213e0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
213f0 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
21400 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
21410 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
21420 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
21430 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
21440 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73  NC.pAggInfo = &s
21450 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67  AggInfo;.    sAg
21460 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
21470 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20  lumn = pGroupBy 
21480 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ? pGroupBy->nExp
21490 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67  r+1 : 0;.    sAg
214a0 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d  gInfo.pGroupBy =
214b0 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73   pGroupBy;.    s
214c0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
214d0 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
214e0 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
214f0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
21500 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64  gList(&sNC, pOrd
21510 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
21520 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
21530 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
21540 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e  zeAggregates(&sN
21550 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  C, pHaving);.   
21560 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
21570 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73  nAccumulator = s
21580 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
21590 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
215a0 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20  sAggInfo.nFunc; 
215b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
215c0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
215d0 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67  gList(&sNC, sAgg
215e0 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
215f0 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  xpr->pList);.   
21600 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
21610 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
21620 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
21630 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e      /* Processin
21640 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73  g for aggregates
21650 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69   with GROUP BY i
21660 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  s very different
21670 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68   and.    ** much
21680 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68   more complex th
21690 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69  an aggregates wi
216a0 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
216b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
216c0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
216d0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
216e0 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
216f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
21700 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
21710 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
21720 74 20 6a 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t j1;..      /* 
21730 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 74 68  Create labels th
21740 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 6e 65  at we will be ne
21750 65 64 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  eding.      */. 
21760 20 20 20 20 20 61 64 64 72 49 6e 69 74 69 61 6c       addrInitial
21770 69 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  izeLoop = sqlite
21780 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
21790 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
217a0 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50  there is a GROUP
217b0 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69   BY clause we mi
217c0 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69  ght need a sorti
217d0 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20  ng index to.    
217e0 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69    ** implement i
217f0 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61  t.  Allocate tha
21800 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  t sorting index 
21810 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e  now.  If it turn
21820 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  s out.      ** t
21830 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  hat we do not ne
21840 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c  ed it after all,
21850 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72   the OpenEphemer
21860 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20  al instruction. 
21870 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
21880 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
21890 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a   Noop.  .      *
218a0 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f  /.      sAggInfo
218b0 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50  .sortingIdx = pP
218c0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
218d0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
218e0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
218f0 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
21900 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72  pBy);.      addr
21910 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c  SortingIdx = sql
21920 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
21930 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
21940 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  al, .          s
21950 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
21960 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f  dx, sAggInfo.nSo
21970 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20  rtingColumn, .  
21980 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72          0, (char
21990 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
219a0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
219b0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
219c0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
219d0 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
219e0 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
219f0 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
21a00 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
21a10 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
21a20 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62  >nMem;.      iAb
21a30 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  ortFlag = ++pPar
21a40 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
21a50 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iAMem = pParse->
21a60 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
21a70 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
21a80 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
21a90 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70  .      iBMem = p
21aa0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
21ab0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
21ac0 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
21ad0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
21ae0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21af0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
21b00 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
21b10 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
21b20 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72  ((v, "clear abor
21b30 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
21b40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21b50 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
21b60 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 0, iUseFlag);.
21b70 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
21b80 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
21b90 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74  accumulator empt
21ba0 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  y"));.      sqli
21bb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21bc0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
21bd0 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29  rInitializeLoop)
21be0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
21bf0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
21c00 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
21c10 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
21c20 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
21c30 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75  ** set.  This su
21c40 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c  broutine first l
21c50 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65  ooks at the iUse
21c60 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c  Flag.  If iUseFl
21c70 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c  ag.      ** is l
21c80 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
21c90 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73  l to zero, the s
21ca0 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  ubroutine is a n
21cb0 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20  o-op.  If.      
21cc0 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ** the processin
21cd0 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  g calls for the 
21ce0 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20  query to abort, 
21cf0 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a  this subroutine.
21d00 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65        ** increme
21d10 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c  nts the iAbortFl
21d20 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ag memory locati
21d30 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  on before return
21d40 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ing in.      ** 
21d50 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20  order to signal 
21d60 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62  the caller to ab
21d70 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ort..      */.  
21d80 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74      addrSetAbort
21d90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
21da0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
21db0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21dc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
21dd0 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c  ger, 1, iAbortFl
21de0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
21df0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20  omment((v, "set 
21e00 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
21e10 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f       regOutputRo
21e20 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  w = ++pParse->nM
21e30 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
21e40 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
21e50 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
21e60 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61  putRow);.      a
21e70 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
21e80 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
21e90 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
21ea0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21eb0 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
21ec0 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
21ed0 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20  putRow+2);.     
21ee0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
21ef0 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74   "Groupby result
21f00 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79   generator entry
21f10 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20   point"));.     
21f20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21f30 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
21f40 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
21f50 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
21f60 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
21f70 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
21f80 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67       if( pHaving
21f90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
21fa0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
21fb0 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
21fc0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
21fd0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
21fe0 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
21ff0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
22000 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
22010 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70  >pEList, 0, 0, p
22020 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
22040 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
22050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22060 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
22070 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62  Row+1, addrSetAb
22080 6f 72 74 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  ort, aff);.     
22090 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
220a0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
220b0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
220c0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
220d0 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70  t((v, "end group
220e0 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
220f0 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
22100 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
22110 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
22120 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75  l reset the grou
22130 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72  p-by accumulator
22140 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22150 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
22160 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
22170 64 72 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67  dr(v);.      reg
22180 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  Reset = ++pParse
22190 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
221a0 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
221b0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
221c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
221d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
221e0 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65  _Return, regRese
221f0 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65  t);..      /* Be
22200 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20  gin a loop that 
22210 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c  will extract all
22220 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20   source rows in 
22230 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a  GROUP BY order..
22240 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
22250 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20  ght involve two 
22260 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77  separate loops w
22270 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69  ith an OP_Sort i
22280 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20  n between, or.  
22290 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
222a0 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70  be a single loop
222b0 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
222c0 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69  dex to extract i
222d0 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20  nformation.     
222e0 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74   ** in the right
222f0 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20   order to begin 
22300 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  with..      */. 
22310 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22320 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
22330 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
22340 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
22350 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22360 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
22370 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
22380 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
22390 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
223a0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
223b0 74 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f  t, pWhere, &pGro
223c0 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  upBy, 0);.      
223d0 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
223e0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
223f0 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75  .      if( pGrou
22400 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBy==0 ){.      
22410 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
22420 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
22430 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
22440 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
22450 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
22460 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
22470 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
22480 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
22490 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
224a0 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
224b0 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
224c0 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
224d0 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
224e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
224f0 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
22500 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67  oupBy;.        g
22510 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
22520 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22530 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
22540 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
22550 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
22560 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
22570 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
22580 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
22590 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
225a0 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
225b0 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
225c0 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
225d0 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
225e0 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
225f0 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
22600 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
22610 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
22620 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
22630 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
22640 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
22650 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
22660 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  l;.        int n
22670 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20  GroupBy;..      
22680 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
22690 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
226a0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
226b0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
226c0 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b  Col = nGroupBy +
226d0 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   1;.        j = 
226e0 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20  nGroupBy+1;.    
226f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
22700 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
22710 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
22720 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43   if( sAggInfo.aC
22730 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c  ol[i].iSorterCol
22740 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
22750 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20        nCol++;.  
22760 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
22770 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22780 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
22790 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
227a0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
227b0 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
227c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
227d0 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
227e0 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42  , pGroupBy, regB
227f0 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ase, 0);.       
22800 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22810 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
22820 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  e, sAggInfo.sort
22830 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e  ingIdx,regBase+n
22840 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
22850 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
22860 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
22870 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
22880 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
22890 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
228a0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
228b0 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  = &sAggInfo.aCol
228c0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
228d0 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
228e0 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
228f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
22900 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20  = j + regBase;. 
22910 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
22920 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
22930 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
22940 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
22950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22960 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c       pCol->pTab,
22970 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pCol->iColumn, 
22980 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31  pCol->iTable, r1
22990 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
229a0 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a    if( r1!=r2 ){.
229b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
229c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
229d0 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c  v, OP_SCopy, r2,
229e0 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
229f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22a00 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
22a10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22a20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73     regRecord = s
22a30 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
22a40 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
22a50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22a60 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
22a70 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e  cord, regBase, n
22a80 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Col, regRecord);
22a90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22aa0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22ab0 5f 49 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67  _IdxInsert, sAgg
22ac0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
22ad0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
22ae0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
22af0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
22b00 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
22b10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
22b20 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
22b30 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
22b40 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
22b50 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
22b60 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
22b70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22b80 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41  2(v, OP_Sort, sA
22b90 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
22ba0 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  x, addrEnd);.   
22bb0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
22bc0 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73  ((v, "GROUP BY s
22bd0 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20  ort"));.        
22be0 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74  sAggInfo.useSort
22bf0 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20  ingIdx = 1;.    
22c00 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76    }..      /* Ev
22c10 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65  aluate the curre
22c20 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
22c30 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62  s and store in b
22c40 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20  0, b1, b2....   
22c50 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d     ** (b0 is mem
22c60 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d  ory location iBM
22c70 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65  em+0, b1 is iBMe
22c80 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  m+1, and so fort
22c90 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  h).      ** Then
22ca0 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72   compare the cur
22cb0 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
22cc0 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  rms against the 
22cd0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20  GROUP BY terms. 
22ce0 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
22cf0 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75   previous row cu
22d00 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
22d10 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a  n a0, a1, a2....
22d20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
22d30 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73  ddrTopOfLoop = s
22d40 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
22d50 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
22d60 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75  for(j=0; j<pGrou
22d70 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  pBy->nExpr; j++)
22d80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72  {.        if( gr
22d90 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
22da0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22db0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
22dc0 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e  olumn, sAggInfo.
22dd0 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a 2c 20 69  sortingIdx, j, i
22de0 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
22df0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22e00 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
22e10 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
22e20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22e30 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
22e40 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
22e50 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  r, iBMem+j);.   
22e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
22e70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22e80 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
22e90 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d  pare, iAMem, iBM
22ea0 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
22eb0 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
22ed0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
22ee0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
22ef0 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
22f00 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
22f10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22f20 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
22f30 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20  _Jump, j1+1, 0, 
22f40 6a 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  j1+1);..      /*
22f50 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
22f60 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65  hat runs wheneve
22f70 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
22f80 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a  hanges..      **
22f90 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20   Changes in the 
22fa0 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74  GROUP BY are det
22fb0 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65  ected by the pre
22fc0 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20  vious code.     
22fd0 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74   ** block.  If t
22fe0 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61  here were no cha
22ff0 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b  nges, this block
23000 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   is skipped..   
23010 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
23020 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20  his code copies 
23030 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79  current group by
23040 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c   terms in b0,b1,
23050 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  b2,....      ** 
23060 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32  over to a0,a1,a2
23070 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73  .  It then calls
23080 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
23090 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
230a0 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61  and resets the a
230b0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
230c0 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69  ator registers i
230d0 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20  n preparation.  
230e0 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e      ** for the n
230f0 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74  ext GROUP BY bat
23100 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
23110 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
23120 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  deMove(pParse, i
23130 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72  BMem, iAMem, pGr
23140 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20  oupBy->nExpr);. 
23150 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23160 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
23170 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
23180 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
23190 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
231a0 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
231b0 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20  one row"));.    
231c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
231d0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
231e0 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64   iAbortFlag, add
231f0 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62  rEnd);.      Vdb
23200 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68  eComment((v, "ch
23210 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29  eck abort flag")
23220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23230 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
23240 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
23250 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
23260 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
23270 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d  (v, "reset accum
23280 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
23290 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
232a0 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
232b0 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20  lators based on 
232c0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20  the content of. 
232d0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72       ** the curr
232e0 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f  ent row.      */
232f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
23300 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
23310 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41  );.      updateA
23320 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
23330 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
23340 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23350 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
23360 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61  eger, 1, iUseFla
23370 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
23380 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
23390 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75  ate data in accu
233a0 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
233b0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
233c0 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20   loop.      */. 
233d0 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
233e0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
233f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23400 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 41  2(v, OP_Next, sA
23410 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
23420 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70  x, addrTopOfLoop
23430 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
23440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
23450 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
23460 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23470 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
23480 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49  (v, addrSortingI
23490 64 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  dx, 1);.      }.
234a0 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  .      /* Output
234b0 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f   the final row o
234c0 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  f result.      *
234d0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
234e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
234f0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
23500 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
23510 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
23520 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
23530 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b  ut final row"));
23540 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a  .      .    } /*
23550 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 20   endif pGroupBy 
23560 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
23570 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d      ExprList *pM
23580 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20  inMax = 0;.     
23590 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20   ExprList *pDel 
235a0 3d 20 30 3b 0a 20 20 20 20 20 20 75 38 20 66 6c  = 0;.      u8 fl
235b0 61 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68  ag;..      /* Ch
235c0 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79  eck if the query
235d0 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
235e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
235f0 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
23600 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69    **   SELECT mi
23610 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  n(x) FROM ....  
23620 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
23630 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  max(x) FROM ....
23640 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
23650 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  * If it is, then
23660 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e   ask the code in
23670 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65   where.c to atte
23680 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75  mpt to sort resu
23690 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  lts.      ** as 
236a0 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20  if there was an 
236b0 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20  "ORDER ON x" or 
236c0 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43  "ORDER ON x DESC
236d0 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20  " clause. .     
236e0 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69   ** If where.c i
236f0 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63  s able to produc
23700 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64  e results sorted
23710 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20   in this order, 
23720 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 64  then.      ** ad
23730 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62  d vdbe code to b
23740 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
23750 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20  processing loop 
23760 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20  after the .     
23770 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74   ** first iterat
23780 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66  ion (since the f
23790 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
237a0 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20  f the loop is . 
237b0 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
237c0 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ed to operate on
237d0 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68   the row with th
237e0 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78  e minimum or max
237f0 69 6d 75 6d 20 0a 20 20 20 20 20 20 2a 2a 20 76  imum .      ** v
23800 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f  alue of x, the o
23810 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64  nly row required
23820 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  )..      **.    
23830 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66    ** A special f
23840 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73  lag must be pass
23850 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
23860 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69  reBegin() to sli
23870 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6d  ghtly.      ** m
23880 6f 64 69 66 79 20 62 65 68 61 76 69 6f 75 72 20  odify behaviour 
23890 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
238a0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
238b0 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  + If the query i
238c0 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28  s a "SELECT min(
238d0 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  x)", then the lo
238e0 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20  op coded by.    
238f0 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63    **     where.c
23900 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72   should not iter
23910 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c  ate over any val
23920 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ues with a NULL 
23930 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 20  value.      **  
23940 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20     for x..      
23950 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  **.      **   + 
23960 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f  The optimizer co
23970 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74  de in where.c (t
23980 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65  he thing that de
23990 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20  cides which.    
239a0 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f    **     index o
239b0 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65  r indices to use
239c0 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61  ) should place a
239d0 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72   different prior
239e0 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a  ity on .      **
239f0 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20       satisfying 
23a00 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63  the 'ORDER BY' c
23a10 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f  lause than it do
23a20 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65  es in other case
23a30 73 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  s..      **     
23a40 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e  Refer to code an
23a50 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68  d comments in wh
23a60 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c  ere.c for detail
23a70 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
23a80 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51    flag = minMaxQ
23a90 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 29 3b  uery(pParse, p);
23aa0 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20  .      if( flag 
23ab0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 20  ){.        pDel 
23ac0 3d 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69  = pMinMax = sqli
23ad0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
23ae0 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  b, p->pEList->a[
23af0 30 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29  0].pExpr->pList)
23b00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
23b10 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61  inMax && !db->ma
23b20 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
23b30 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
23b40 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
23b50 3d 20 28 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f  = ((flag==WHERE_
23b60 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3f 30 3a 31  ORDERBY_MIN)?0:1
23b70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69  );.          pMi
23b80 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  nMax->a[0].pExpr
23b90 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
23ba0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23bb0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68    }..      /* Th
23bc0 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20  is case runs if 
23bd0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61  the aggregate ha
23be0 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
23bf0 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ause.  The.     
23c00 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69   ** processing i
23c10 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73  s much simpler s
23c20 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e  ince there is on
23c30 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a  ly a single row.
23c40 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70        ** of outp
23c50 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ut..      */.   
23c60 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
23c70 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
23c80 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 57  gInfo);.      pW
23c90 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
23ca0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
23cb0 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
23cc0 65 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 66 6c 61  e, &pMinMax, fla
23cd0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  g);.      if( pW
23ce0 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
23cf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
23d00 73 74 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a  stDelete(pDel);.
23d10 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
23d20 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
23d30 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
23d40 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
23d50 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
23d60 20 20 20 69 66 28 20 21 70 4d 69 6e 4d 61 78 20     if( !pMinMax 
23d70 26 26 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  && flag ){.     
23d80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23d90 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
23da0 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65   0, pWInfo->iBre
23db0 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ak);.        Vdb
23dc0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
23dd0 28 29 20 62 79 20 69 6e 64 65 78 22 2c 28 66 6c  () by index",(fl
23de0 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag==WHERE_ORDERB
23df0 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78  Y_MIN?"min":"max
23e00 22 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ")));.      }.  
23e10 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
23e20 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
23e30 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
23e40 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
23e50 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
23e60 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
23e70 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e        if( pHavin
23e80 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
23e90 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
23ea0 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
23eb0 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45   addrEnd, SQLITE
23ec0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
23ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65      }.      sele
23ee0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
23ef0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
23f00 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a  , 0, 0, 0, -1, .
23f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
23f30 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20 61  rEnd, addrEnd, a
23f40 66 66 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ff);..      sqli
23f50 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
23f60 65 28 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  e(pDel);.    }. 
23f70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
23f80 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
23f90 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d  drEnd);.    .  }
23fa0 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67   /* endif aggreg
23fb0 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ate query */..  
23fc0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
23fd0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
23fe0 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20  e, then we need 
23ff0 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75  to sort the resu
24000 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e  lts.  ** and sen
24010 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61  d them to the ca
24020 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e  llback one by on
24030 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
24040 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65  rderBy ){.    ge
24050 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
24060 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c  Parse, p, v, pEL
24070 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73  ist->nExpr, pDes
24080 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
24090 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
240a0 51 55 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68  QUERY.  /* If th
240b0 69 73 20 77 61 73 20 61 20 73 75 62 71 75 65 72  is was a subquer
240c0 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63  y, we have now c
240d0 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73 75 62  onverted the sub
240e0 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a  query into a.  *
240f0 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
24100 65 2e 20 20 53 6f 20 73 65 74 20 74 68 65 20 53  e.  So set the S
24110 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f  rcList_item.isPo
24120 70 75 6c 61 74 65 64 20 66 6c 61 67 20 74 6f 20  pulated flag to 
24130 70 72 65 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69  prevent.  ** thi
24140 73 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20  s subquery from 
24150 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20  being evaluated 
24160 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72  again and to for
24170 63 65 20 74 68 65 20 75 73 65 20 6f 66 0a 20 20  ce the use of.  
24180 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
24190 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
241a0 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  f( pParent ){.  
241b0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
241c0 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61  t->pSrc->nSrc>pa
241d0 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61  rentTab );.    a
241e0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
241f0 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61  pSrc->a[parentTa
24200 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b  b].pSelect==p );
24210 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53  .    pParent->pS
24220 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
24230 2e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31  .isPopulated = 1
24240 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
24250 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
24260 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
24270 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
24280 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
24290 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
242a0 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75  he SELECT was su
242b0 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64  ccessfully coded
242c0 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75  .   Set the retu
242d0 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a  rn code to 0.  *
242e0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f  * to indicate no
242f0 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
24300 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  rc = 0;..  /* Co
24310 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
24320 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
24330 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
24340 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
24350 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
24360 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
24370 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
24380 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  end:..  /* Ident
24390 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
243a0 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75   if we will be u
243b0 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63  sing them in a c
243c0 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20  allback.  This. 
243d0 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70   ** step is skip
243e0 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ped if the outpu
243f0 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f  t is going to so
24400 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61  me other destina
24410 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
24420 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
24430 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  & pDest->eDest==
24440 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
24450 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
24460 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
24470 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
24480 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
24490 33 5f 66 72 65 65 28 73 41 67 67 49 6e 66 6f 2e  3_free(sAggInfo.
244a0 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
244b0 5f 66 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61  _free(sAggInfo.a
244c0 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  Func);.  return 
244d0 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  rc;.}..#if defin
244e0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
244f0 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./*.************
24500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24540 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ***.** The follo
24550 77 69 6e 67 20 63 6f 64 65 20 69 73 20 75 73 65  wing code is use
24560 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
24570 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
24580 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74  .  The code.** t
24590 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73  hat follows does
245a0 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e   not appear in n
245b0 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a  ormal builds..**
245c0 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
245d0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 70  es are used to p
245e0 72 69 6e 74 20 6f 75 74 20 74 68 65 20 63 6f 6e  rint out the con
245f0 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70  tent of all or p
24600 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72  art of a .** par
24610 73 65 20 73 74 72 75 63 74 75 72 65 73 20 73 75  se structures su
24620 63 68 20 61 73 20 53 65 6c 65 63 74 20 6f 72 20  ch as Select or 
24630 45 78 70 72 2e 20 20 53 75 63 68 20 70 72 69 6e  Expr.  Such prin
24640 74 6f 75 74 73 20 61 72 65 20 75 73 65 66 75 6c  touts are useful
24650 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67 20  .** for helping 
24660 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 77 68  to understand wh
24670 61 74 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  at is happening 
24680 69 6e 73 69 64 65 20 74 68 65 20 63 6f 64 65 20  inside the code 
24690 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72  generator.** dur
246a0 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 69 6f  ing the executio
246b0 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c  n of complex SEL
246c0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
246d0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
246e0 69 6e 65 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c  ine are not call
246f0 65 64 20 61 6e 79 77 68 65 72 65 20 66 72 6f 6d  ed anywhere from
24700 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d   within the norm
24710 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e  al.** code base.
24720 20 20 54 68 65 6e 20 61 72 65 20 69 6e 74 65 6e    Then are inten
24730 64 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ded to be called
24740 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
24750 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20   debugger.** or 
24760 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 22  from temporary "
24770 70 72 69 6e 74 66 22 20 73 74 61 74 65 6d 65 6e  printf" statemen
24780 74 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20  ts inserted for 
24790 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f  debugging..*/.vo
247a0 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45  id sqlite3PrintE
247b0 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  xpr(Expr *p){.  
247c0 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26  if( p->token.z &
247d0 26 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29  & p->token.n>0 )
247e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
247f0 75 67 50 72 69 6e 74 66 28 22 28 25 2e 2a 73 22  ugPrintf("(%.*s"
24800 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d  , p->token.n, p-
24810 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c  >token.z);.  }el
24820 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
24830 65 62 75 67 50 72 69 6e 74 66 28 22 28 25 64 22  ebugPrintf("(%d"
24840 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20  , p->op);.  }.  
24850 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a  if( p->pLeft ){.
24860 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24870 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20  Printf(" ");.   
24880 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
24890 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d  r(p->pLeft);.  }
248a0 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74  .  if( p->pRight
248b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
248c0 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b  ebugPrintf(" ");
248d0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
248e0 74 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 29  tExpr(p->pRight)
248f0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
24900 65 62 75 67 50 72 69 6e 74 66 28 22 29 22 29 3b  ebugPrintf(")");
24910 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
24920 72 69 6e 74 45 78 70 72 4c 69 73 74 28 45 78 70  rintExprList(Exp
24930 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
24940 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
24950 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
24960 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  r; i++){.    sql
24970 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 4c  ite3PrintExpr(pL
24980 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
24990 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73  ;.    if( i<pLis
249a0 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20  t->nExpr-1 ){.  
249b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
249c0 50 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20  Printf(", ");.  
249d0 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73    }.  }.}.void s
249e0 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63  qlite3PrintSelec
249f0 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  t(Select *p, int
24a00 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69   indent){.  sqli
24a10 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24a20 25 2a 73 53 45 4c 45 43 54 28 25 70 29 20 22 2c  %*sSELECT(%p) ",
24a30 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b   indent, "", p);
24a40 0a 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45  .  sqlite3PrintE
24a50 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73  xprList(p->pELis
24a60 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t);.  sqlite3Deb
24a70 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
24a80 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29 7b    if( p->pSrc ){
24a90 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65 66  .    char *zPref
24aa0 69 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  ix;.    int i;. 
24ab0 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 46 52     zPrefix = "FR
24ac0 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  OM";.    for(i=0
24ad0 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  ; i<p->pSrc->nSr
24ae0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
24af0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
24b00 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
24b10 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
24b20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24b30 69 6e 74 66 28 22 25 2a 73 20 22 2c 20 69 6e 64  intf("%*s ", ind
24b40 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b  ent+6, zPrefix);
24b50 0a 20 20 20 20 20 20 7a 50 72 65 66 69 78 20 3d  .      zPrefix =
24b60 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20 70   "";.      if( p
24b70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
24b80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24b90 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 5c 6e  DebugPrintf("(\n
24ba0 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ");.        sqli
24bb0 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28 70  te3PrintSelect(p
24bc0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Item->pSelect, i
24bd0 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20  ndent+10);.     
24be0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24bf0 72 69 6e 74 66 28 22 25 2a 73 29 22 2c 20 69 6e  rintf("%*s)", in
24c00 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20  dent+8, "");.   
24c10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74     }else if( pIt
24c20 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  em->zName ){.   
24c30 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24c40 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20 70 49  gPrintf("%s", pI
24c50 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
24c60 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
24c70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20  Item->pTab ){.  
24c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
24c90 75 67 50 72 69 6e 74 66 28 22 28 74 61 62 6c 65  ugPrintf("(table
24ca0 3a 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70  : %s)", pItem->p
24cb0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
24cc0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
24cd0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
24ce0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
24cf0 65 62 75 67 50 72 69 6e 74 66 28 22 20 41 53 20  ebugPrintf(" AS 
24d00 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  %s", pItem->zAli
24d10 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  as);.      }.   
24d20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70 53 72 63     if( i<p->pSrc
24d30 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20 20  ->nSrc-1 ){.    
24d40 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24d50 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20  Printf(",");.   
24d60 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
24d70 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
24d80 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n");.    }.  }. 
24d90 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29   if( p->pWhere )
24da0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
24db0 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 57 48  ugPrintf("%*s WH
24dc0 45 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22  ERE ", indent, "
24dd0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
24de0 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 57 68 65  rintExpr(p->pWhe
24df0 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
24e00 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
24e10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
24e20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
24e30 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24e40 74 66 28 22 25 2a 73 20 47 52 4f 55 50 20 42 59  tf("%*s GROUP BY
24e50 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b   ", indent, "");
24e60 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
24e70 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  tExprList(p->pGr
24e80 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  oupBy);.    sqli
24e90 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24ea0 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
24eb0 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  p->pHaving ){.  
24ec0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24ed0 69 6e 74 66 28 22 25 2a 73 20 48 41 56 49 4e 47  intf("%*s HAVING
24ee0 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b   ", indent, "");
24ef0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
24f00 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
24f10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
24f20 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
24f30 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
24f40 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
24f50 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24f60 28 22 25 2a 73 20 4f 52 44 45 52 20 42 59 20 22  ("%*s ORDER BY "
24f70 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
24f80 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
24f90 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65  xprList(p->pOrde
24fa0 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rBy);.    sqlite
24fb0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
24fc0 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64  ");.  }.}./* End
24fd0 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
24fe0 65 20 64 65 62 75 67 20 70 72 69 6e 74 69 6e 67  e debug printing
24ff0 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   code.**********
25000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25040 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ***/.#endif /* d
25050 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
25060 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  ST) || defined(S
25070 51 4c 49 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a  QLITE_DEBUG) */.