/ Hex Artifact Content
Login

Artifact 183a68a0af4ce20c8ebe684dd1581ce898c9f48f:


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 38  select.c,v 1.448
0200: 20 32 30 30 38 2f 30 37 2f 30 38 20 31 37 3a 34   2008/07/08 17:4
0210: 33 3a 35 37 20 64 61 6e 69 65 6c 6b 31 39 37 37  3:57 danielk1977
0220: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0230: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0240: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  .../*.** Delete 
0250: 61 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  all the content 
0260: 6f 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75  of a Select stru
0270: 63 74 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74  cture but do not
0280: 20 64 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74   deallocate.** t
0290: 68 65 20 73 65 6c 65 63 74 20 73 74 72 75 63 74  he select struct
02a0: 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73  ure itself..*/.s
02b0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
02c0: 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70  Select(Select *p
02d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
02e0: 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45  ListDelete(p->pE
02f0: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
0300: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  SrcListDelete(p-
0310: 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  >pSrc);.  sqlite
0320: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
0330: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
0340: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0350: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
0370: 65 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  e(p->pHaving);. 
0380: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0390: 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72  Delete(p->pOrder
03a0: 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  By);.  sqlite3Se
03b0: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50  lectDelete(p->pP
03c0: 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  rior);.  sqlite3
03d0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
03e0: 69 6d 69 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  imit);.  sqlite3
03f0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4f  ExprDelete(p->pO
0400: 66 66 73 65 74 29 3b 0a 7d 0a 0a 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 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
13050 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
13060 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65  (v);.  iContinue
13070 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
13080 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
13090 2a 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69  * Suppress dupli
130a0 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c  cates for UNION,
130b0 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54   EXCEPT, and INT
130c0 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69  ERSECT .  */.  i
130d0 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20  f( regPrev ){.  
130e0 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20    int j1, j2;.  
130f0 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
13100 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
13110 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 0a  fNot, regPrev);.
13120 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33      j2 = sqlite3
13130 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13140 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69  _Compare, pIn->i
13150 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  Mem, regPrev+1, 
13160 70 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20  pIn->nMem,.     
13170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13180 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
13190 70 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79 70 65  pKeyInfo, p4type
131a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
131b0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
131c0 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74  ump, j2+2, iCont
131d0 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20  inue, j2+2);.   
131e0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
131f0 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
13200 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
13210 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 6e  Copy(pParse, pIn
13220 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b  ->iMem, regPrev+
13230 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20  1, pIn->nMem);. 
13240 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13250 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
13260 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b  er, 1, regPrev);
13270 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
13280 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
13290 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
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 63 6c       compound cl
19670 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74  ause made up ent
19680 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67  irely of non-agg
19690 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20  regate queries, 
196a0 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74  and .**        t
196b0 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a  he parent query:
196c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
196d0 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  * is not itself 
196e0 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
196f0 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20  nd select,.**   
19700 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
19710 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
19720 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20  DISTINCT query, 
19730 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
19740 2a 20 68 61 73 20 6e 6f 20 6f 74 68 65 72 20 74  * has no other t
19750 61 62 6c 65 73 20 6f 72 20 73 75 62 2d 73 65 6c  ables or sub-sel
19760 65 63 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ects in the FROM
19770 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
19780 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e 74        The parent
19790 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d   and sub-query m
197a0 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45  ay contain WHERE
197b0 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63   clauses. Subjec
197c0 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72  t to.**        r
197d0 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29 20  ules (11), (13) 
197e0 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d  and (14), they m
197f0 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ay also contain 
19800 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20  ORDER BY,.**    
19810 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46      LIMIT and OF
19820 46 53 45 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  FSET clauses..**
19830 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68  .**  (18)  If th
19840 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
19850 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
19860 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73  , then all terms
19870 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   of the.**      
19880 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73    ORDER by claus
19890 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  e of the parent 
198a0 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72  must be simple r
198b0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a  eferences to .**
198c0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
198d0 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
198e0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ..**.** In this 
198f0 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
19900 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
19910 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
19920 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
19930 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
19940 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
19950 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
19960 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
19970 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
19980 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75  egates and subqu
19990 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65  eryIsAgg is true
199a0 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
199b0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
199c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
199d0 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
199e0 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
199f0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
19a00 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
19a10 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
19a20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
19a30 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
19a40 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
19a50 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
19a60 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
19a70 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
19a80 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
19a90 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
19aa0 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
19ab0 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
19ac0 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
19ad0 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
19ae0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
19af0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
19b00 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
19b10 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
19b20 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
19b30 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
19b40 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
19b50 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
19b60 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
19b70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
19b80 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
19b90 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
19ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
19bb0 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
19bc0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
19bd0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
19be0 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
19bf0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
19c00 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
19c10 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
19c20 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ions */.){.  con
19c30 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41  st char *zSavedA
19c40 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
19c50 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
19c60 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61  t;.  Select *pPa
19c70 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  rent;.  Select *
19c80 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  pSub;       /* T
19c90 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f  he inner query o
19ca0 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a  r "subquery" */.
19cb0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b    Select *pSub1;
19cc0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
19cd0 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73   to the rightmos
19ce0 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d  t select in sub-
19cf0 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
19d00 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
19d10 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
19d20 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
19d30 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
19d40 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
19d50 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
19d60 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
19d70 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
19d80 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
19d90 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
19da0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
19db0 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
19dc0 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
19dd0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
19de0 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
19df0 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
19e00 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
19e10 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
19e20 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
19e30 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
19e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19e50 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
19e60 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
19e70 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75  rcList_item *pSu
19e80 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20  bitem;   /* The 
19e90 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  subquery */.  sq
19ea0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
19eb0 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68  se->db;..  /* Ch
19ec0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
19ed0 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
19ee0 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
19ef0 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
19f00 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
19f10 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
19f20 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
19f30 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
19f40 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
19f50 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69  >nSrc );.  pSubi
19f60 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
19f70 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74  From];.  iParent
19f80 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75   = pSubitem->iCu
19f90 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70  rsor;.  pSub = p
19fa0 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
19fb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
19fc0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41  !=0 );.  if( isA
19fd0 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73  gg && subqueryIs
19fe0 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Agg ) return 0; 
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a000 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1a010 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62  1)  */.  if( sub
1a020 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53  queryIsAgg && pS
1a030 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74  rc->nSrc>1 ) ret
1a040 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1a050 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1a060 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63  2)  */.  pSubSrc
1a070 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
1a080 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
1a090 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74   );.  /* Prior t
1a0a0 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c  o version 3.1.2,
1a0b0 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1a0c0 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65  OFFSET had to be
1a0d0 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74   simple constant
1a0e0 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69  s,.  ** not arbi
1a0f0 74 72 61 72 79 20 65 78 70 72 65 73 73 73 69 6f  trary expresssio
1a100 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73  ns, we allowed s
1a110 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66  ome combining of
1a120 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1a130 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74  T.  ** because t
1a140 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d  hey could be com
1a150 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  puted at compile
1a160 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e  -time.  But when
1a170 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1a180 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72  T.  ** became ar
1a190 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
1a1a0 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72  ons, we were for
1a1b0 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72  ced to add restr
1a1c0 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a  ictions (13).  *
1a1d0 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20  * and (14). */. 
1a1e0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1a1f0 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29  t && p->pLimit )
1a200 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1a210 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1a220 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20  iction (13) */. 
1a230 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73   if( pSub->pOffs
1a240 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  et ) return 0;  
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a260 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1a270 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20  iction (14) */. 
1a280 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f   if( p->pRightmo
1a290 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d  st && pSub->pLim
1a2a0 69 74 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  it && pSub->pOrd
1a2b0 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  erBy ){.    retu
1a2c0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2f0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1a300 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (15) */.  }.  if
1a310 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d  ( pSubSrc->nSrc=
1a320 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
1a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a340 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1a350 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66  ion (7)  */.  if
1a360 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73 74 69  ( (pSub->isDisti
1a370 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69  nct || pSub->pLi
1a380 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 20 26  mit) .         &
1a390 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  & (pSrc->nSrc>1 
1a3a0 7c 7c 20 69 73 41 67 67 29 20 29 7b 20 20 20 20  || isAgg) ){    
1a3b0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1a3c0 74 69 6f 6e 73 20 28 34 29 28 35 29 28 38 29 28  tions (4)(5)(8)(
1a3d0 39 29 20 2a 2f 0a 20 20 20 20 20 72 65 74 75 72  9) */.     retur
1a3e0 6e 20 30 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a  n 0;       .  }.
1a3f0 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74 69    if( p->isDisti
1a400 6e 63 74 20 26 26 20 73 75 62 71 75 65 72 79 49  nct && subqueryI
1a410 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
1a420 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1a430 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a  riction (6)  */.
1a440 20 20 69 66 28 20 28 70 2d 3e 64 69 73 61 6c 6c    if( (p->disall
1a450 6f 77 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e  owOrderBy || p->
1a460 70 4f 72 64 65 72 42 79 29 20 26 26 20 70 53 75  pOrderBy) && pSu
1a470 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
1a480 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1a4c0 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20  iction (11) */. 
1a4d0 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26   }.  if( isAgg &
1a4e0 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
1a4f0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1a500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a510 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20  estriction (16) 
1a520 2a 2f 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63  */..  /* Restric
1a530 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20  tion 3:  If the 
1a540 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f  subquery is a jo
1a550 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
1a560 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20  e subquery is . 
1a570 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20   ** not used as 
1a580 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1a590 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f  d of an outer jo
1a5a0 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66  in.  Examples of
1a5b0 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69   why this.  ** i
1a5c0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
1a5d0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1a5e0 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
1a5f0 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
1a600 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
1a610 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
1a620 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
1a630 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1a640 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
1a650 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
1a660 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
1a670 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
1a680 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
1a690 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
1a6a0 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20 28  Src->nSrc>1 && (
1a6b0 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
1a6c0 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
1a6d0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1a6e0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
1a6f0 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66  triction 12:  If
1a700 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1a710 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1a720 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
1a730 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61  er.  ** join, ma
1a740 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
1a750 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
1a760 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41  E clause..  ** A
1a770 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  n examples of wh
1a780 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c  y this is not al
1a790 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
1a7a0 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
1a7b0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c   OUTER JOIN (SEL
1a7c0 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
1a7d0 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a  ERE t2.x>0).  **
1a7e0 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
1a7f0 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
1a800 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
1a810 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
1a820 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1a830 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78  N t2) WHERE t2.x
1a840 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74  >0.  **.  ** But
1a850 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74   the t2.x>0 test
1a860 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
1a870 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20  l on a NULL row 
1a880 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a  of t2, which.  *
1a890 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f  * effectively co
1a8a0 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52  nverts the OUTER
1a8b0 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e   JOIN into an IN
1a8c0 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20  NER JOIN..  */. 
1a8d0 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e   if( (pSubitem->
1a8e0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
1a8f0 54 45 52 29 21 3d 30 20 26 26 20 70 53 75 62 2d  TER)!=0 && pSub-
1a900 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20  >pWhere!=0 ){.  
1a910 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1a920 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
1a930 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73 75 62  n 17: If the sub
1a940 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
1a950 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65  ound SELECT, the
1a960 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75  n it must.  ** u
1a970 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f  se only the UNIO
1a980 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20  N ALL operator. 
1a990 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  And none of the 
1a9a0 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75  simple select qu
1a9b0 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  eries.  ** that 
1a9c0 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70  make up the comp
1a9d0 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20  ound SELECT are 
1a9e0 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67  allowed to be ag
1a9f0 67 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69  gregate or disti
1aa00 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  nct.  ** queries
1aa10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
1aa20 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  b->pPrior ){.   
1aa30 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 7c   if( p->pPrior |
1aa40 7c 20 69 73 41 67 67 20 7c 7c 20 70 2d 3e 69 73  | isAgg || p->is
1aa50 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 72 63  Distinct || pSrc
1aa60 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20  ->nSrc!=1 ){.   
1aa70 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1aa80 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31   }.    for(pSub1
1aa90 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53  =pSub; pSub1; pS
1aaa0 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f  ub1=pSub1->pPrio
1aab0 72 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53  r){.      if( pS
1aac0 75 62 31 2d 3e 69 73 41 67 67 20 7c 7c 20 70 53  ub1->isAgg || pS
1aad0 75 62 31 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  ub1->isDistinct 
1aae0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
1aaf0 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
1ab00 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
1ab10 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1ab20 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
1ab30 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72   }..    /* Restr
1ab40 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20  iction 18. */.  
1ab50 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1ab60 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  y ){.      int i
1ab70 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  i;.      for(ii=
1ab80 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42  0; ii<p->pOrderB
1ab90 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  y->nExpr; ii++){
1aba0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
1abb0 45 78 70 72 20 3d 20 70 2d 3e 70 4f 72 64 65 72  Expr = p->pOrder
1abc0 42 79 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 3b  By->a[ii].pExpr;
1abd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
1abe0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
1abf0 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  N || pExpr->iTab
1ac00 6c 65 21 3d 69 50 61 72 65 6e 74 20 29 7b 20 0a  le!=iParent ){ .
1ac10 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1ac20 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1ac30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ac40 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
1ac50 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74  Context = pSubit
1ac60 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c  em->zName;.  sql
1ac70 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1ac80 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
1ac90 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ECT, 0, 0, 0);. 
1aca0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1acb0 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
1acc0 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a  thContext;..  /*
1acd0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1ace0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1acf0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1ad00 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62  , then it must b
1ad10 65 0a 20 20 2a 2a 20 61 20 55 4e 49 4f 4e 20 41  e.  ** a UNION A
1ad20 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e  LL and the paren
1ad30 74 20 71 75 65 72 79 20 6d 75 73 74 20 62 65 20  t query must be 
1ad40 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a  of the form:.  *
1ad50 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1ad60 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52  T <expr-list> FR
1ad70 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29  OM (<sub-query>)
1ad80 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20   <where-clause> 
1ad90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  .  **.  ** follo
1ada0 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52  wed by any ORDER
1adb0 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f   BY, LIMIT and/o
1adc0 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  r OFFSET clauses
1add0 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a  . This block.  *
1ade0 2a 20 63 72 65 61 74 65 73 20 4e 20 63 6f 70 69  * creates N copi
1adf0 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
1ae00 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
1ae10 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
1ae20 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
1ae30 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
1ae40 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
1ae50 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
1ae60 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
1ae70 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
1ae80 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
1ae90 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
1aea0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1aeb0 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
1aec0 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
1aed0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
1aee0 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  b-query..  */.  
1aef0 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70  for(pSub=pSub->p
1af00 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75  Prior; pSub; pSu
1af10 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
1af20 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
1af30 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  w;.    ExprList 
1af40 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
1af50 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70  OrderBy;.    Exp
1af60 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r *pLimit = p->p
1af70 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20  Limit;.    Expr 
1af80 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  *pOffset = p->pO
1af90 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63  ffset;.    Selec
1afa0 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
1afb0 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f  Prior;.    p->pO
1afc0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1afd0 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
1afe0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
1aff0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
1b000 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  0;.    pNew = sq
1b010 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
1b020 62 2c 20 70 29 3b 0a 20 20 20 20 70 4e 65 77 2d  b, p);.    pNew-
1b030 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
1b040 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
1b050 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 70  = pNew;.    p->p
1b060 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
1b070 42 79 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20  By;.    p->op = 
1b080 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70  TK_ALL;.    p->p
1b090 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
1b0a0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
1b0b0 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73  it;.    p->pOffs
1b0c0 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
1b0d0 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20    p->pRightmost 
1b0e0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  = 0;.    pNew->p
1b0f0 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20  Rightmost = 0;. 
1b100 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
1b110 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1b120 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65   it means flatte
1b130 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
1b140 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69  d for the.  ** i
1b150 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66  From-th entry of
1b160 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1b170 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
1b180 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62  ery..  */.  pSub
1b190 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69   = pSub1 = pSubi
1b1a0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
1b1b0 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
1b1c0 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
1b1d0 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
1b1e0 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
1b1f0 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
1b200 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e  bSrc = pSubSrc->
1b210 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f  nSrc;.    int jo
1b220 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  intype = 0;.    
1b230 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
1b240 70 53 72 63 3b 0a 20 20 20 20 70 53 72 63 20 3d  pSrc;.    pSrc =
1b250 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 0a   pParent->pSrc;.
1b260 0a 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c  .    /* Move all
1b270 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
1b280 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
1b290 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
1b2a0 20 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63     ** the FROM c
1b2b0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
1b2c0 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
1b2d0 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
1b2e0 6d 65 6d 62 65 72 0a 20 20 20 20 2a 2a 20 74 68  member.    ** th
1b2f0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
1b300 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  for the original
1b310 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f   outer query FRO
1b320 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 20  M element in.   
1b330 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
1b340 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
1b350 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
1b360 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
1b370 20 63 6f 64 65 0a 20 20 20 20 2a 2a 20 77 69 6c   code.    ** wil
1b380 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
1b390 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
1b3a0 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
1b3b0 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
1b3c0 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
1b3d0 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
1b3e0 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
1b3f0 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
1b400 65 72 79 20 46 52 4f 4d 0a 20 20 20 20 2a 2a 20  ery FROM.    ** 
1b410 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20  elements we are 
1b420 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a  now copying in..
1b430 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1b440 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 53 75  Src ){.      pSu
1b450 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  bitem = &pSrc->a
1b460 5b 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 6e  [iFrom];.      n
1b470 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
1b480 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 20 20 6a 6f  ->nSrc;.      jo
1b490 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65  intype = pSubite
1b4a0 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
1b4b0 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
1b4c0 54 61 62 6c 65 28 70 53 75 62 69 74 65 6d 2d 3e  Table(pSubitem->
1b4d0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c  pTab);.      sql
1b4e0 69 74 65 33 5f 66 72 65 65 28 70 53 75 62 69 74  ite3_free(pSubit
1b4f0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
1b500 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1b510 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  ee(pSubitem->zNa
1b520 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
1b530 65 33 5f 66 72 65 65 28 70 53 75 62 69 74 65 6d  e3_free(pSubitem
1b540 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20  ->zAlias);.     
1b550 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
1b560 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 75 62 69  = 0;.      pSubi
1b570 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
1b580 20 30 3b 0a 20 20 20 20 20 20 70 53 75 62 69 74   0;.      pSubit
1b590 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  em->zName = 0;. 
1b5a0 20 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a       pSubitem->z
1b5b0 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 7d  Alias = 0;.    }
1b5c0 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63  .    if( nSubSrc
1b5d0 21 3d 31 20 7c 7c 20 21 70 53 72 63 20 29 7b 0a  !=1 || !pSrc ){.
1b5e0 20 20 20 20 20 20 69 6e 74 20 65 78 74 72 61 20        int extra 
1b5f0 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20  = nSubSrc - 1;. 
1b600 20 20 20 20 20 66 6f 72 28 69 3d 28 70 53 72 63       for(i=(pSrc
1b610 3f 31 3a 30 29 3b 20 69 3c 6e 53 75 62 53 72 63  ?1:0); i<nSubSrc
1b620 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1b630 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
1b640 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
1b650 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pSrc, 0, 0);.   
1b660 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30       if( pSrc==0
1b670 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1b680 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 30 3b  arent->pSrc = 0;
1b690 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1b6a0 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
1b6b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1b6c0 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
1b6d0 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  c;.      for(i=p
1b6e0 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65  Src->nSrc-1; i-e
1b6f0 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d  xtra>=iFrom; i--
1b700 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d  ){.        pSrc-
1b710 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b  >a[i] = pSrc->a[
1b720 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20  i-extra];.      
1b730 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
1b740 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
1b750 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63  i++){.      pSrc
1b760 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
1b770 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
1b780 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
1b790 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
1b7a0 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
1b7b0 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
1b7c0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
1b7d0 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
1b7e0 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
1b7f0 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
1b800 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
1b810 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
1b820 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
1b830 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1b840 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
1b850 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1b860 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
1b870 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1b880 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
1b890 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
1b8a0 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
1b8b0 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
1b8c0 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
1b8d0 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
1b8f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
1b900 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
1b910 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
1b920 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
1b930 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
1b940 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
1b950 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1b960 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
1b970 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
1b980 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
1b990 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
1b9a0 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
1b9b0 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
1b9c0 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
1b9d0 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
1b9e0 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
1b9f0 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
1ba00 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
1ba10 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
1ba20 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
1ba30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1ba40 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1ba50 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1ba60 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
1ba70 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1ba80 65 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d  e==0 && (pExpr =
1ba90 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1baa0 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29  pr)->span.z!=0 )
1bab0 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
1bac0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 0a 20  >a[i].zName = . 
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1bae0 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
1baf0 62 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d  b, (char*)pExpr-
1bb00 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  >span.z, pExpr->
1bb10 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d  span.n);.      }
1bb20 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74  .    }.    subst
1bb30 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
1bb40 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50  rent->pEList, iP
1bb50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1bb60 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69 73  ist);.    if( is
1bb70 41 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75 62  Agg ){.      sub
1bb80 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1bb90 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
1bba0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1bbb0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
1bbc0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
1bbd0 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
1bbe0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1bbf0 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
1bc00 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
1bc10 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73  erBy ){.      as
1bc20 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1bc30 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
1bc40 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72      pParent->pOr
1bc50 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f  derBy = pSub->pO
1bc60 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53  rderBy;.      pS
1bc70 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
1bc80 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1bc90 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1bca0 79 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  y ){.      subst
1bcb0 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
1bcc0 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rent->pOrderBy, 
1bcd0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1bce0 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
1bcf0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
1bd00 72 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65  re ){.      pWhe
1bd10 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
1bd20 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57  Dup(db, pSub->pW
1bd30 68 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  here);.    }else
1bd40 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d  {.      pWhere =
1bd50 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1bd60 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
1bd70 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1bd80 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1bd90 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  g==0 );.      pP
1bda0 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
1bdb0 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1bdc0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1bdd0 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
1bde0 3b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  ;.      substExp
1bdf0 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
1be00 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
1be10 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1be20 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1be30 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
1be40 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72  ExprAnd(db, pPar
1be50 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20  ent->pHaving, . 
1be60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be80 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1be90 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  db, pSub->pHavin
1bea0 67 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  g));.      asser
1beb0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f  t( pParent->pGro
1bec0 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
1bed0 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
1bee0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
1bef0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62  ListDup(db, pSub
1bf00 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
1bf10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75   }else{.      su
1bf20 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
1bf30 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69 50 61  ent->pWhere, iPa
1bf40 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1bf50 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
1bf60 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  nt->pWhere = sql
1bf70 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
1bf80 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c  pParent->pWhere,
1bf90 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a   pWhere);.    }.
1bfa0 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c    .    /* The fl
1bfb0 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
1bfc0 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
1bfd0 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
1bfe0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1bff0 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
1c000 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nct. .    */.   
1c010 20 70 50 61 72 65 6e 74 2d 3e 69 73 44 69 73 74   pParent->isDist
1c020 69 6e 63 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e  inct = pParent->
1c030 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53  isDistinct || pS
1c040 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a  ub->isDistinct;.
1c050 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a    .    /*.    **
1c060 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
1c070 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d   (SELECT ... LIM
1c080 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c  IT a OFFSET b) L
1c090 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b  IMIT x OFFSET y;
1c0a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
1c0b0 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f  ne is tempted to
1c0c0 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e   try to add a an
1c0d0 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  d b to combine t
1c0e0 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20  he limits.  But 
1c0f0 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73  this.    ** does
1c100 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74   not work if eit
1c110 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  her limit is neg
1c120 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ative..    */.  
1c130 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1c140 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  it ){.      pPar
1c150 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53  ent->pLimit = pS
1c160 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->pLimit;.    
1c170 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d    pSub->pLimit =
1c180 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
1c190 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
1c1a0 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
1c1b0 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
1c1c0 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
1c1d0 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
1c1e0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1c1f0 65 6c 65 74 65 28 70 53 75 62 31 29 3b 0a 0a 20  elete(pSub1);.. 
1c200 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
1c210 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1c220 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
1c230 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45  * Analyze the SE
1c240 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
1c250 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
1c260 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69  ment to see if i
1c270 74 0a 2a 2a 20 69 73 20 61 20 6d 69 6e 28 29 20  t.** is a min() 
1c280 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20  or max() query. 
1c290 52 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  Return WHERE_ORD
1c2a0 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52  ERBY_MIN or WHER
1c2b0 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20 69 66  E_ORDERBY_MAX if
1c2c0 20 0a 2a 2a 20 69 74 20 69 73 2c 20 6f 72 20 30   .** it is, or 0
1c2d0 20 6f 74 68 65 72 77 69 73 65 2e 20 41 74 20 70   otherwise. At p
1c2e0 72 65 73 65 6e 74 2c 20 61 20 71 75 65 72 79 20  resent, a query 
1c2f0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  is considered to
1c300 20 62 65 0a 2a 2a 20 61 20 6d 69 6e 28 29 2f 6d   be.** a min()/m
1c310 61 78 28 29 20 71 75 65 72 79 20 69 66 3a 0a 2a  ax() query if:.*
1c320 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65 72 65 20  *.**   1. There 
1c330 69 73 20 61 20 73 69 6e 67 6c 65 20 6f 62 6a 65  is a single obje
1c340 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ct in the FROM c
1c350 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32  lause..**.**   2
1c360 2e 20 54 68 65 72 65 20 69 73 20 61 20 73 69 6e  . There is a sin
1c370 67 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  gle expression i
1c380 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
1c390 2c 20 61 6e 64 20 69 74 20 69 73 0a 2a 2a 20 20  , and it is.**  
1c3a0 20 20 20 20 65 69 74 68 65 72 20 6d 69 6e 28 78      either min(x
1c3b0 29 20 6f 72 20 6d 61 78 28 78 29 2c 20 77 68 65  ) or max(x), whe
1c3c0 72 65 20 78 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re x is a column
1c3d0 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2f 0a 73   reference..*/.s
1c3e0 74 61 74 69 63 20 69 6e 74 20 6d 69 6e 4d 61 78  tatic int minMax
1c3f0 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61  Query(Parse *pPa
1c400 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
1c410 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
1c420 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1c430 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
1c440 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e  .  if( pEList->n
1c450 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
1c460 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
1c470 4f 52 4d 41 4c 3b 0a 20 20 70 45 78 70 72 20 3d  ORMAL;.  pExpr =
1c480 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
1c490 78 70 72 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  xpr;.  pEList = 
1c4a0 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
1c4b0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
1c4c0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 7c  K_AGG_FUNCTION |
1c4d0 7c 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  | pEList==0 || p
1c4e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
1c4f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1c500 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ( pEList->a[0].p
1c510 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
1c520 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
1c530 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
1c540 4f 52 4d 41 4c 3b 0a 20 20 69 66 28 20 70 45 78  ORMAL;.  if( pEx
1c550 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29  pr->token.n!=3 )
1c560 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   return WHERE_OR
1c570 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
1c580 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
1c590 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78 70 72  Cmp((char*)pExpr
1c5a0 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c  ->token.z,"min",
1c5b0 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  3)==0 ){.    ret
1c5c0 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
1c5d0 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  Y_MIN;.  }else i
1c5e0 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
1c5f0 6d 70 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d  mp((char*)pExpr-
1c600 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33  >token.z,"max",3
1c610 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
1c620 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
1c630 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _MAX;.  }.  retu
1c640 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
1c650 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a  _NORMAL;.}../*.*
1c660 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1c670 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61 6d 65  esolves any name
1c680 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 72 65  s used in the re
1c690 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 0a  sult set of the.
1c6a0 2a 2a 20 73 75 70 70 6c 69 65 64 20 53 45 4c 45  ** supplied SELE
1c6b0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66  CT statement. If
1c6c0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1c6d0 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 73 6f  ement being reso
1c6e0 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20 73 75 62  lved.** is a sub
1c6f0 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 70 4f  -select, then pO
1c700 75 74 65 72 4e 43 20 69 73 20 61 20 70 6f 69 6e  uterNC is a poin
1c710 74 65 72 20 74 6f 20 74 68 65 20 4e 61 6d 65 43  ter to the NameC
1c720 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20 74 68  ontext .** of th
1c730 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54 2e  e parent SELECT.
1c740 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
1c750 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a 20 20  electResolve(.  
1c760 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1c770 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1c780 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
1c790 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1c7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c7b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1c7c0 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
1c7d0 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
1c7e0 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54 68 65  pOuterNC  /* The
1c7f0 20 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f 6e 74   outer name cont
1c800 65 78 74 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ext. May be NULL
1c810 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  . */.){.  ExprLi
1c820 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
1c830 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 73       /* Result s
1c840 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  et. */.  int i; 
1c850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c860 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20      /* For-loop 
1c870 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 69 6e  variable used in
1c880 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
1c890 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
1c8a0 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20  t sNC;          
1c8b0 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63   /* Local name-c
1c8c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
1c8d0 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
1c8e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67 72         /* The gr
1c8f0 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
1c900 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 72  ..  /* If this r
1c910 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20 62  outine has run b
1c920 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 69 6d  efore, return im
1c930 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20  mediately. */.  
1c940 69 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65  if( p->isResolve
1c950 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
1c960 20 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20 20   !pOuterNC );.  
1c970 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c980 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73 52  OK;.  }.  p->isR
1c990 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20 20  esolved = 1;..  
1c9a0 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61 76 65  /* If there have
1c9b0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 72   already been er
1c9c0 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  rors, do nothing
1c9d0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73  . */.  if( pPars
1c9e0 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20  e->nErr>0 ){.   
1c9f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1ca00 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
1ca10 50 72 65 70 61 72 65 20 74 68 65 20 73 65 6c 65  Prepare the sele
1ca20 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ct statement. Th
1ca30 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c  is call will all
1ca40 6f 63 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  ocate all cursor
1ca50 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20  s.  ** required 
1ca60 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 74 61  to handle the ta
1ca70 62 6c 65 73 20 61 6e 64 20 73 75 62 71 75 65 72  bles and subquer
1ca80 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
1ca90 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  clause..  */.  i
1caa0 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d  f( prepSelectStm
1cab0 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  t(pParse, p) ){.
1cac0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1cad0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
1cae0 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 65  /* Resolve the e
1caf0 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
1cb00 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
1cb10 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65 73  ET clauses. Thes
1cb20 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61  e.  ** are not a
1cb30 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72 20  llowed to refer 
1cb40 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f  to any names, so
1cb50 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20 4e   pass an empty N
1cb60 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f  ameContext..  */
1cb70 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
1cb80 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
1cb90 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
1cba0 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 73 71  pParse;.  if( sq
1cbb0 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
1cbc0 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
1cbd0 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20 20  Limit) ||.      
1cbe0 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
1cbf0 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  veNames(&sNC, p-
1cc00 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20  >pOffset) ){.   
1cc10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1cc20 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
1cc30 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c  Set up the local
1cc40 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f   name-context to
1cc50 20 70 61 73 73 20 74 6f 20 45 78 70 72 52 65 73   pass to ExprRes
1cc60 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a 20  olveNames() to. 
1cc70 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65 20   ** resolve the 
1cc80 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 2e  expression-list.
1cc90 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f  .  */.  sNC.allo
1cca0 77 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43 2e  wAgg = 1;.  sNC.
1ccb0 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pSrcList = p->pS
1ccc0 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20  rc;.  sNC.pNext 
1ccd0 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20 2f  = pOuterNC;..  /
1cce0 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20  * Resolve names 
1ccf0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1cd00 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  t. */.  pEList =
1cd10 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
1cd20 28 20 21 70 45 4c 69 73 74 20 29 20 72 65 74 75  ( !pEList ) retu
1cd30 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1cd40 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
1cd50 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1cd60 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20  ){.    Expr *pX 
1cd70 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
1cd80 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71  Expr;.    if( sq
1cd90 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
1cda0 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 58 29 20  Names(&sNC, pX) 
1cdb0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1cdc0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1cdd0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1cde0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 67   there are no ag
1cdf0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1ce00 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d  s in the result-
1ce10 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55  set, and no GROU
1ce20 50 20 42 59 20 0a 20 20 2a 2a 20 65 78 70 72 65  P BY .  ** expre
1ce30 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c  ssion, do not al
1ce40 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73 20 69  low aggregates i
1ce50 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74 68  n any of the oth
1ce60 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  er expressions..
1ce70 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21    */.  assert( !
1ce80 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20 70 47  p->isAgg );.  pG
1ce90 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
1cea0 75 70 42 79 3b 0a 20 20 69 66 28 20 70 47 72 6f  upBy;.  if( pGro
1ceb0 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73 41  upBy || sNC.hasA
1cec0 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73 41  gg ){.    p->isA
1ced0 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  gg = 1;.  }else{
1cee0 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67  .    sNC.allowAg
1cef0 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
1cf00 20 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c 61   If a HAVING cla
1cf10 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20  use is present, 
1cf20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
1cf30 62 65 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  be a GROUP BY cl
1cf40 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ause..  */.  if(
1cf50 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20 21   p->pHaving && !
1cf60 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
1cf70 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1cf80 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50  pParse, "a GROUP
1cf90 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65   BY clause is re
1cfa0 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 48 41  quired before HA
1cfb0 56 49 4e 47 22 29 3b 0a 20 20 20 20 72 65 74 75  VING");.    retu
1cfc0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1cfd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74  .  }..  /* Add t
1cfe0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
1cff0 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d 63  st to the name-c
1d000 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70 61  ontext before pa
1d010 72 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6f  rsing the.  ** o
1d020 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73  ther expressions
1d030 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   in the SELECT s
1d040 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69  tatement. This i
1d050 73 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 65  s so that.  ** e
1d060 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
1d070 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 28  e WHERE clause (
1d080 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72 20  etc.) can refer 
1d090 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62  to expressions b
1d0a0 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73 20 69  y.  ** aliases i
1d0b0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
1d0c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e 6f  ..  **.  ** Mino
1d0d0 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69 73  r point: If this
1d0e0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
1d0f0 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
1d100 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 72  n will be.  ** r
1d110 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20  e-evaluated for 
1d120 65 61 63 68 20 72 65 66 65 72 65 6e 63 65 20 74  each reference t
1d130 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43  o it..  */.  sNC
1d140 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c  .pEList = p->pEL
1d150 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ist;.  if( sqlit
1d160 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
1d170 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65  es(&sNC, p->pWhe
1d180 72 65 29 20 7c 7c 0a 20 20 20 20 20 73 71 6c 69  re) ||.     sqli
1d190 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
1d1a0 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61  mes(&sNC, p->pHa
1d1b0 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 72 65 74  ving) ){.    ret
1d1c0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1d1d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
1d1e0 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
1d1f0 69 66 28 20 70 72 6f 63 65 73 73 4f 72 64 65 72  if( processOrder
1d200 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
1d210 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
1d220 31 2c 20 26 73 4e 43 2e 68 61 73 41 67 67 29 20  1, &sNC.hasAgg) 
1d230 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d240 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1d250 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 72    }.  }.  if( pr
1d260 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42  ocessOrderGroupB
1d270 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 47 72  y(pParse, p, pGr
1d280 6f 75 70 42 79 2c 20 30 2c 20 26 73 4e 43 2e 68  oupBy, 0, &sNC.h
1d290 61 73 41 67 67 29 20 29 7b 0a 20 20 20 20 72 65  asAgg) ){.    re
1d2a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1d2b0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  R;.  }..  if( pP
1d2c0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1d2d0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
1d2e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1d2f0 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  M;.  }..  /* Mak
1d300 65 20 73 75 72 65 20 74 68 65 20 47 52 4f 55 50  e sure the GROUP
1d310 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20   BY clause does 
1d320 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67 72  not contain aggr
1d330 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
1d340 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 47 72 6f  .  */.  if( pGro
1d350 75 70 42 79 20 29 7b 0a 20 20 20 20 73 74 72 75  upBy ){.    stru
1d360 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1d370 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 20 20   *pItem;.  .    
1d380 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
1d390 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47  GroupBy->a; i<pG
1d3a0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
1d3b0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1d3c0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1d3d0 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e 70  roperty(pItem->p
1d3e0 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29 7b  Expr, EP_Agg) ){
1d3f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d400 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1d410 20 22 61 67 67 72 65 67 61 74 65 20 66 75 6e 63   "aggregate func
1d420 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c  tions are not al
1d430 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20 20  lowed in ".     
1d440 20 20 20 20 20 20 20 22 74 68 65 20 47 52 4f 55         "the GROU
1d450 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20  P BY clause");. 
1d460 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1d470 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1d480 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1d490 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6f   /* If this is o
1d4a0 6e 65 20 53 45 4c 45 43 54 20 6f 66 20 61 20 63  ne SELECT of a c
1d4b0 6f 6d 70 6f 75 6e 64 2c 20 62 65 20 73 75 72 65  ompound, be sure
1d4c0 20 74 6f 20 72 65 73 6f 6c 76 65 20 6e 61 6d 65   to resolve name
1d4d0 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 74  s.  ** in the ot
1d4e0 68 65 72 20 53 45 4c 45 43 54 73 2e 0a 20 20 2a  her SELECTs..  *
1d4f0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
1d500 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
1d510 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
1d520 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  olve(pParse, p->
1d530 70 50 72 69 6f 72 2c 20 70 4f 75 74 65 72 4e 43  pPrior, pOuterNC
1d540 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1d550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d560 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1d570 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
1d580 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
1d590 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
1d5a0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
1d5b0 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
1d5c0 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
1d5d0 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
1d5e0 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
1d5f0 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
1d600 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
1d610 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70  .** routine simp
1d620 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  ly stores NULLs 
1d630 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
1d640 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f  memory cells..*/
1d650 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
1d660 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
1d670 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
1d680 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
1d690 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1d6a0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1d6b0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
1d6c0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
1d6d0 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66  c;.  if( pAggInf
1d6e0 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66  o->nFunc+pAggInf
1d6f0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  o->nColumn==0 ){
1d700 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1d710 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
1d720 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
1d730 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
1d740 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d750 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67  OP_Null, 0, pAgg
1d760 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
1d770 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70  em);.  }.  for(p
1d780 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  Func=pAggInfo->a
1d790 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67  Func, i=0; i<pAg
1d7a0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
1d7b0 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20  +, pFunc++){.   
1d7c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d7d0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1d7e0 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a  , pFunc->iMem);.
1d7f0 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69      if( pFunc->i
1d800 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
1d810 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
1d820 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20  pFunc->pExpr;.  
1d830 20 20 20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73      if( pE->pLis
1d840 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 4c 69 73  t==0 || pE->pLis
1d850 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
1d860 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1d870 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1d880 44 49 53 54 49 4e 43 54 20 69 6e 20 61 67 67 72  DISTINCT in aggr
1d890 65 67 61 74 65 20 6d 75 73 74 20 62 65 20 66 6f  egate must be fo
1d8a0 6c 6c 6f 77 65 64 20 22 0a 20 20 20 20 20 20 20  llowed ".       
1d8b0 20 20 20 20 22 62 79 20 61 6e 20 65 78 70 72 65      "by an expre
1d8c0 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20  ssion");.       
1d8d0 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
1d8e0 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  t = -1;.      }e
1d8f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79  lse{.        Key
1d900 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
1d910 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
1d920 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d  List(pParse, pE-
1d930 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  >pList);.       
1d940 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d950 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
1d960 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69  emeral, pFunc->i
1d970 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  Distinct, 0, 0,.
1d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d990 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
1d9a0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
1d9b0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
1d9c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d9d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
1d9e0 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
1d9f0 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
1da00 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
1da10 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
1da20 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
1da30 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1da40 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
1da50 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
1da60 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
1da70 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
1da80 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1da90 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
1daa0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
1dab0 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
1dac0 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
1dad0 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
1dae0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
1daf0 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
1db00 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
1db10 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74  pF->pExpr->pList
1db20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1db30 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67  eAddOp4(v, OP_Ag
1db40 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d  gFinal, pF->iMem
1db50 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  , pList ? pList-
1db60 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20  >nExpr : 0, 0,. 
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db80 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
1db90 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
1dba0 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  F);.  }.}../*.**
1dbb0 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75   Update the accu
1dbc0 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63  mulator memory c
1dbd0 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72  ells for an aggr
1dbe0 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a  egate based on.*
1dbf0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  * the current cu
1dc00 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
1dc10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
1dc20 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
1dc30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
1dc40 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1dc50 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1dc60 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1dc70 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1dc80 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
1dc90 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1dca0 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
1dcb0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
1dcc0 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  ode = 1;.  for(i
1dcd0 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
1dce0 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
1dcf0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
1dd00 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
1dd10 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
1dd20 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  rNext = 0;.    i
1dd30 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45  nt regAgg;.    E
1dd40 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
1dd50 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73   pF->pExpr->pLis
1dd60 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  t;.    if( pList
1dd70 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   ){.      nArg =
1dd80 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
1dd90 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71       regAgg = sq
1dda0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
1ddb0 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b  e(pParse, nArg);
1ddc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1ddd0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
1dde0 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65  Parse, pList, re
1ddf0 67 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 7d 65  gAgg, 0);.    }e
1de00 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  lse{.      nArg 
1de10 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67  = 0;.      regAg
1de20 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
1de30 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e   if( pF->iDistin
1de40 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ct>=0 ){.      a
1de50 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
1de60 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1de70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1de80 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20   nArg==1 );.    
1de90 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
1dea0 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74  Parse, pF->iDist
1deb0 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20  inct, addrNext, 
1dec0 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20  1, regAgg);.    
1ded0 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46  }.    if( pF->pF
1dee0 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71  unc->needCollSeq
1def0 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
1df00 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
1df10 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
1df20 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1df30 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
1df40 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
1df50 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73  t!=0 );  /* pLis
1df60 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e  t!=0 if pF->pFun
1df70 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 69  c->needCollSeq i
1df80 73 20 74 72 75 65 20 2a 2f 0a 20 20 20 20 20 20  s true */.      
1df90 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
1dfa0 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20  List->a; !pColl 
1dfb0 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20  && j<nArg; j++, 
1dfc0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1dfd0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1dfe0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1dff0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
1e000 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1e010 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
1e020 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1e030 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
1e040 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
1e050 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e060 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
1e070 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
1e080 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
1e090 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
1e0a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1e0b0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
1e0c0 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c  Step, 0, regAgg,
1e0d0 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20   pF->iMem,.     
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0f0 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
1e100 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
1e110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1e120 68 61 6e 67 65 50 35 28 76 2c 20 6e 41 72 67 29  hangeP5(v, nArg)
1e130 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1e140 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
1e150 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
1e160 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
1e170 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1e180 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1e190 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20  regAgg, nArg);. 
1e1a0 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20     if( addrNext 
1e1b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1e1c0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1e1d0 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  (v, addrNext);. 
1e1e0 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
1e1f0 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d  =0, pC=pAggInfo-
1e200 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66  >aCol; i<pAggInf
1e210 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b  o->nAccumulator;
1e220 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20   i++, pC++){.   
1e230 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e240 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78  (pParse, pC->pEx
1e250 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20  pr, pC->iMem);. 
1e260 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64   }.  pAggInfo->d
1e270 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d  irectMode = 0;.}
1e280 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68  ..#if 0./*.** Th
1e290 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1e2a0 73 65 64 20 77 68 65 6e 20 61 20 53 45 4c 45 43  sed when a SELEC
1e2b0 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75  T statement is u
1e2c0 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a  sed to create a.
1e2d0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
1e2e0 6c 65 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67  le for iterating
1e2f0 20 74 68 72 6f 75 67 68 20 77 68 65 6e 20 72 75   through when ru
1e300 6e 6e 69 6e 67 20 61 6e 20 49 4e 53 54 45 41 44  nning an INSTEAD
1e310 20 4f 46 0a 2a 2a 20 55 50 44 41 54 45 20 6f 72   OF.** UPDATE or
1e320 20 49 4e 53 54 45 41 44 20 4f 46 20 44 45 4c 45   INSTEAD OF DELE
1e330 54 45 20 74 72 69 67 67 65 72 2e 20 0a 2a 2a 0a  TE trigger. .**.
1e340 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  ** If possible, 
1e350 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1e360 6d 65 6e 74 20 69 73 20 6d 6f 64 69 66 69 65 64  ment is modified
1e370 20 73 6f 20 74 68 61 74 20 4e 55 4c 4c 20 76 61   so that NULL va
1e380 6c 75 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  lues.** are stor
1e390 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ed in the tempor
1e3a0 61 72 79 20 74 61 62 6c 65 20 66 6f 72 20 61 6c  ary table for al
1e3b0 6c 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68  l columns for wh
1e3c0 69 63 68 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72  ich the .** corr
1e3d0 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
1e3e0 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69   argument mask i
1e3f0 73 20 6e 6f 74 20 73 65 74 2e 20 49 66 20 6d 61  s not set. If ma
1e400 73 6b 20 74 61 6b 65 73 20 74 68 65 0a 2a 2a 20  sk takes the.** 
1e410 73 70 65 63 69 61 6c 20 76 61 6c 75 65 20 30 78  special value 0x
1e420 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 61  ffffffff, then a
1e430 6c 6c 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70  ll columns are p
1e440 6f 70 75 6c 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  opulated..*/.voi
1e450 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4d  d sqlite3SelectM
1e460 61 73 6b 28 50 61 72 73 65 20 2a 70 50 61 72 73  ask(Parse *pPars
1e470 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 75 33  e, Select *p, u3
1e480 32 20 6d 61 73 6b 29 7b 0a 20 20 69 66 28 20 70  2 mask){.  if( p
1e490 20 26 26 20 21 70 2d 3e 70 50 72 69 6f 72 20 26   && !p->pPrior &
1e4a0 26 20 21 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  & !p->isDistinct
1e4b0 20 26 26 20 6d 61 73 6b 21 3d 30 78 66 66 66 66   && mask!=0xffff
1e4c0 66 66 66 66 20 29 7b 0a 20 20 20 20 45 78 70 72  ffff ){.    Expr
1e4d0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
1e4e0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c    int i;.    sql
1e4f0 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
1e500 65 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b  e(pParse, p, 0);
1e510 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  .    pEList = p-
1e520 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72  >pEList;.    for
1e530 28 69 3d 30 3b 20 70 45 4c 69 73 74 20 26 26 20  (i=0; pEList && 
1e540 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  i<pEList->nExpr 
1e550 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20  && i<32; i++){. 
1e560 20 20 20 20 20 69 66 28 20 21 28 6d 61 73 6b 26       if( !(mask&
1e570 28 28 75 33 32 29 31 3c 3c 69 29 29 20 29 7b 0a  ((u32)1<<i)) ){.
1e580 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1e590 78 70 72 44 65 6c 65 74 65 28 70 45 4c 69 73 74  xprDelete(pEList
1e5a0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1e5b0 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61         pEList->a
1e5c0 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69  [i].pExpr = sqli
1e5d0 74 65 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e  te3Expr(pParse->
1e5e0 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20  db, TK_NULL, 0, 
1e5f0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
1e600 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
1e610 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
1e620 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67  e code for the g
1e630 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74  iven SELECT stat
1e640 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
1e650 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
1e660 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69  tributed in vari
1e670 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69  ous ways dependi
1e680 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e  ng on the.** con
1e690 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53 65 6c  tents of the Sel
1e6a0 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
1e6b0 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
1e6c0 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74 0a 2a  argument pDest.*
1e6d0 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  * as follows:.**
1e6e0 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d 3e 65  .**     pDest->e
1e6f0 44 65 73 74 20 20 20 20 52 65 73 75 6c 74 0a 2a  Dest    Result.*
1e700 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *     ----------
1e710 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
1e720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e740 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c  -.**     SRT_Cal
1e750 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20  lback    Invoke 
1e760 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  the callback for
1e770 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65   each row of the
1e780 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20   result..**.**  
1e790 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20     SRT_Mem      
1e7a0 20 20 20 53 74 6f 72 65 20 66 69 72 73 74 20 72     Store first r
1e7b0 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20  esult in memory 
1e7c0 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61 72  cell pDest->iPar
1e7d0 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
1e7e0 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f 72  Set         Stor
1e7f0 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79  e results as key
1e800 73 20 6f 66 20 74 61 62 6c 65 20 70 44 65 73 74  s of table pDest
1e810 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20  ->iParm. .**    
1e820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e830 20 41 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e   Apply the affin
1e840 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66 69 6e  ity pDest->affin
1e850 69 74 79 20 62 65 66 6f 72 65 20 73 74 6f 72 69  ity before stori
1e860 6e 67 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  ng them..**.**  
1e870 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20     SRT_Union    
1e880 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
1e890 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74   as a key in a t
1e8a0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70  emporary table p
1e8b0 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a  Dest->iParm..**.
1e8c0 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70  **     SRT_Excep
1e8d0 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65  t      Remove re
1e8e0 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74  sults from the t
1e8f0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70  emporary table p
1e900 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a  Dest->iParm..**.
1e910 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65  **     SRT_Table
1e920 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
1e930 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72  ults in temporar
1e940 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
1e950 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
1e960 52 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43  RT_EphemTab    C
1e970 72 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61  reate an tempora
1e980 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
1e990 69 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a  iParm and store.
1e9a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1e9b0 20 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c         the resul
1e9c0 74 20 74 68 65 72 65 2e 20 54 68 65 20 63 75 72  t there. The cur
1e9d0 73 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e  sor is left open
1e9e0 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20   after.**       
1e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1ea00 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  turning..**.**  
1ea10 20 20 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65     SRT_Coroutine
1ea20 20 20 20 49 6e 76 6f 6b 65 20 61 20 63 6f 2d 72     Invoke a co-r
1ea30 6f 75 74 69 6e 65 20 74 6f 20 63 6f 6d 70 75 74  outine to comput
1ea40 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  e a single row o
1ea50 66 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  f .**           
1ea60 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65            the re
1ea70 73 75 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  sult.**.**     S
1ea80 52 54 5f 45 78 69 73 74 73 20 20 20 20 20 20 53  RT_Exists      S
1ea90 74 6f 72 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f  tore a 1 in memo
1eaa0 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69  ry cell pDest->i
1eab0 50 61 72 6d 20 69 66 20 74 68 65 20 72 65 73 75  Parm if the resu
1eac0 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
1ead0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69 73            set is
1eae0 20 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a   not empty..**.*
1eaf0 2a 20 20 20 20 20 53 52 54 5f 44 69 73 63 61 72  *     SRT_Discar
1eb00 64 20 20 20 20 20 54 68 72 6f 77 20 74 68 65 20  d     Throw the 
1eb10 72 65 73 75 6c 74 73 20 61 77 61 79 2e 0a 2a 2a  results away..**
1eb20 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65 6c 65  .** See the sele
1eb30 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75  ctInnerLoop() fu
1eb40 6e 63 74 69 6f 6e 20 66 6f 72 20 61 20 63 61 6e  nction for a can
1eb50 6f 6e 69 63 61 6c 20 6c 69 73 74 69 6e 67 20 6f  onical listing o
1eb60 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 77 65  f the .** allowe
1eb70 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73  d values of eDes
1eb80 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e  t and their mean
1eb90 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ings..**.** This
1eba0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1ebb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1ebc0 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65  rrors.  If any e
1ebd0 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63  rrors are.** enc
1ebe0 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61  ountered, then a
1ebf0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
1ec00 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
1ec10 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  eft in.** pParse
1ec20 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
1ec30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
1ec40 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20  es NOT free the 
1ec50 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
1ec60 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65   passed in.  The
1ec70 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  .** calling func
1ec80 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f  tion needs to do
1ec90 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   that..**.** The
1eca0 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74   pParent, parent
1ecb0 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e  Tab, and *pParen
1ecc0 74 41 67 67 20 66 69 65 6c 64 73 20 61 72 65 20  tAgg fields are 
1ecd0 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69  filled in if thi
1ece0 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61  s.** SELECT is a
1ecf0 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73   subquery.  This
1ed00 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79   routine may try
1ed10 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73   to combine this
1ed20 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20   SELECT.** with 
1ed30 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f  its parent to fo
1ed40 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  rm a single flat
1ed50 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64   query.  In so d
1ed60 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a  oing, it might.*
1ed70 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 72  * change the par
1ed80 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61  ent query from a
1ed90 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74   non-aggregate t
1eda0 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  o an aggregate q
1edb0 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61  uery..** For tha
1edc0 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50  t reason, the pP
1edd0 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73  arentAgg flag is
1ede0 20 70 61 73 73 65 64 20 61 73 20 61 20 70 6f 69   passed as a poi
1edf0 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63  nter, so it.** c
1ee00 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  an be changed..*
1ee10 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
1ee20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
1ee30 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 61 72   the pParent par
1ee40 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  ameter..**.**   
1ee50 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1ee60 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78  1 JOIN (SELECT x
1ee70 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  , count(*) FROM 
1ee80 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20  t2) JOIN t3;.** 
1ee90 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
1eea0 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
1eeb0 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
1eec0 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a  ___/        /.**
1eed0 20 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20       \          
1eee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
1ef10 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
1ef20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
1ef30 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
1ef40 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a  ___________/.**.
1ef50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ef60 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  is called for th
1ef70 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 66 69  e outer query fi
1ef80 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20  rst.   For that 
1ef90 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74  call,.** pParent
1efa0 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20   will be NULL.  
1efb0 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65  During the proce
1efc0 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74  ssing of the out
1efd0 65 72 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a  er query, this .
1efe0 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
1eff0 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
1f000 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73   to handle the s
1f010 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68  ubquery.  For th
1f020 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63  e recursive.** c
1f030 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c  all, pParent wil
1f040 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f  l point to the o
1f050 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 63  uter query.  Bec
1f060 61 75 73 65 20 74 68 65 20 73 75 62 71 75 65 72  ause the subquer
1f070 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f  y is.** the seco
1f080 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20  nd element in a 
1f090 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20  three-way join, 
1f0a0 74 68 65 20 70 61 72 65 6e 74 54 61 62 20 70 61  the parentTab pa
1f0b0 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20  rameter will.** 
1f0c0 62 65 20 31 20 28 74 68 65 20 32 6e 64 20 76 61  be 1 (the 2nd va
1f0d0 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78  lue of a 0-index
1f0e0 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e  ed array.).*/.in
1f0f0 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  t sqlite3Select(
1f100 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1f110 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
1f120 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
1f130 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
1f140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f150 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1f160 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
1f170 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
1f180 20 2a 70 44 65 73 74 2c 20 20 20 20 20 2f 2a 20   *pDest,     /* 
1f190 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
1f1a0 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
1f1b0 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
1f1c0 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a  Parent,       /*
1f1d0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
1f1e0 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69  for which this i
1f1f0 73 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f  s a sub-query */
1f200 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62  .  int parentTab
1f210 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ,         /* Ind
1f220 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70  ex in pParent->p
1f230 53 72 63 20 6f 66 20 74 68 69 73 20 71 75 65 72  Src of this quer
1f240 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72  y */.  int *pPar
1f250 65 6e 74 41 67 67 2c 20 20 20 20 20 20 20 2f 2a  entAgg,       /*
1f260 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74   True if pParent
1f270 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
1f280 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63  functions */.  c
1f290 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
1f2a0 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73        /* If eDes
1f2b0 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  t is SRT_Union, 
1f2c0 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
1f2d0 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
1f2e0 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
1f2f0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1f300 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ers */.  WhereIn
1f310 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
1f320 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73  /* Return from s
1f330 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1f340 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  () */.  Vdbe *v;
1f350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f360 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
1f370 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
1f380 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1f390 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20  t isAgg;        
1f3a0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1f3b0 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
1f3c0 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
1f3d0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1f3e0 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
1f3f0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
1f400 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
1f410 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
1f420 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1f430 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
1f440 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
1f450 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
1f460 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1f470 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
1f480 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
1f490 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
1f4a0 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
1f4b0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
1f4c0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
1f4d0 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
1f4e0 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
1f4f0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
1f500 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
1f510 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
1f520 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
1f530 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
1f540 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  NULL */.  int is
1f550 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
1f560 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1f570 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
1f580 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
1f590 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20   int distinct;  
1f5a0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1f5b0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
1f5c0 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a  distinct set */.
1f5d0 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
1f5e0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1f5f0 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
1f600 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
1f610 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74  /.  int addrSort
1f620 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64  Index;     /* Ad
1f630 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f  dress of an OP_O
1f640 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
1f650 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67  truction */.  Ag
1f660 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20  gInfo sAggInfo; 
1f670 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1f680 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72  ion used by aggr
1f690 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f  egate queries */
1f6a0 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20  .  int iEnd;    
1f6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1f6c0 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20  ress of the end 
1f6d0 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
1f6e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
1f6f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f700 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1f710 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70  ion */..  db = p
1f720 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1f730 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   p==0 || db->mal
1f740 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
1f750 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
1f760 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
1f770 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1f780 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1f790 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
1f7a0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
1f7b0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
1f7c0 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
1f7d0 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 70  sAggInfo));..  p
1f7e0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1f7f0 64 65 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e  derBy;.  if( Ign
1f800 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
1f810 65 73 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70  est) ){.    p->p
1f820 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20  OrderBy = 0;..  
1f830 20 20 2f 2a 20 49 6e 20 74 68 65 73 65 20 63 61    /* In these ca
1f840 73 65 73 20 74 68 65 20 44 49 53 54 49 4e 43 54  ses the DISTINCT
1f850 20 6f 70 65 72 61 74 6f 72 20 6d 61 6b 65 73 20   operator makes 
1f860 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 74 6f  no difference to
1f870 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75   the.    ** resu
1f880 6c 74 73 2c 20 73 6f 20 72 65 6d 6f 76 65 20 69  lts, so remove i
1f890 74 20 69 66 20 69 74 20 77 65 72 65 20 73 70 65  t if it were spe
1f8a0 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  cified..    */. 
1f8b0 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d     assert(pDest-
1f8c0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73  >eDest==SRT_Exis
1f8d0 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ts || pDest->eDe
1f8e0 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c  st==SRT_Union ||
1f8f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65   .           pDe
1f900 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
1f910 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e  xcept || pDest->
1f920 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
1f930 72 64 29 3b 0a 20 20 20 20 70 2d 3e 69 73 44 69  rd);.    p->isDi
1f940 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 7d 0a  stinct = 0;.  }.
1f950 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
1f960 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
1f970 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20  e, p, 0) ){.    
1f980 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1f990 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72  .  }.  p->pOrder
1f9a0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a  By = pOrderBy;..
1f9b0 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c  .  /* Make local
1f9c0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
1f9d0 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68  arameters for th
1f9e0 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  is query..  */. 
1f9f0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
1fa00 53 72 63 3b 0a 20 20 69 73 41 67 67 20 3d 20 70  Src;.  isAgg = p
1fa10 2d 3e 69 73 41 67 67 3b 0a 20 20 70 45 4c 69 73  ->isAgg;.  pELis
1fa20 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
1fa30 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
1fa40 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1fa50 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f  ;..  /* .  ** Do
1fa60 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70   not even attemp
1fa70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  t to generate an
1fa80 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76  y code if we hav
1fa90 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20  e already seen. 
1faa0 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72   ** errors befor
1fab0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  e this routine s
1fac0 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tarts..  */.  if
1fad0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  ( pParse->nErr>0
1fae0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
1faf0 6e 64 3b 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20  nd;..  /* ORDER 
1fb00 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f  BY is ignored fo
1fb10 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69  r some destinati
1fb20 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
1fb30 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
1fb40 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70  (pDest) ){.    p
1fb50 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
1fb60 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
1fb70 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
1fb80 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
1fb90 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1fba0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
1fbb0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
1fbc0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1fbd0 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
1fbe0 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
1fbf0 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23  OM clause.  */.#
1fc00 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1fc10 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1fc20 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1fc30 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1fc40 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
1fc50 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
1fc60 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
1fc70 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
1fc80 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
1fc90 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
1fca0 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
1fcb0 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
1fcc0 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d  ct *pSub = pItem
1fcd0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
1fce0 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 20 20 20  nt isAggSub;.   
1fcf0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
1fd00 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20  Item->zName;..  
1fd10 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c    if( pSub==0 ||
1fd20 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61   pItem->isPopula
1fd30 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ted ) continue;.
1fd40 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 21 3d 30      if( zName!=0
1fd50 20 29 7b 20 20 20 2f 2a 20 41 6e 20 73 71 6c 20   ){   /* An sql 
1fd60 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 63 6f  view */.      co
1fd70 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
1fd80 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
1fd90 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1fda0 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  xt;.      pParse
1fdb0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
1fdc0 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 72 63   zName;.      rc
1fdd0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
1fde0 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
1fdf0 70 53 75 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  pSub, 0);.      
1fe00 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
1fe10 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
1fe20 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  hContext;.      
1fe30 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1fe40 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
1fe50 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
1fe60 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
1fe70 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74  nt Parse.nHeight
1fe80 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f   by the height o
1fe90 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78  f the largest ex
1fea0 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
1feb0 74 72 65 65 20 72 65 66 65 72 65 64 20 74 6f 20  tree refered to 
1fec0 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
1fed0 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
1fee0 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
1fef0 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
1ff00 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
1ff10 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
1ff20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
1ff30 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
1ff40 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
1ff50 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
1ff60 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
1ff70 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
1ff80 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
1ff90 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
1ffa0 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
1ffb0 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
1ffc0 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
1ffd0 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
1ffe0 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
1fff0 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ght(p);..    /* 
20000 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
20010 74 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  the subquery can
20020 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
20030 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f  o the parent. */
20040 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20  .    isAggSub = 
20050 70 53 75 62 2d 3e 69 73 41 67 67 3b 0a 20 20 20  pSub->isAgg;.   
20060 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71   if( flattenSubq
20070 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
20080 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53  i, isAgg, isAggS
20090 75 62 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ub) ){.      if(
200a0 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20   isAggSub ){.   
200b0 20 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d 20       p->isAgg = 
200c0 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  isAgg = 1;.     
200d0 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b   }.      i = -1;
200e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
200f0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
20100 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
20110 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
20120 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
20130 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
20140 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  t(pParse, pSub, 
20150 26 64 65 73 74 2c 20 70 2c 20 69 2c 20 26 69 73  &dest, p, i, &is
20160 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  Agg, 0);.    }. 
20170 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
20180 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
20190 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
201a0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
201b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
201c0 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73  se->nHeight -= s
201d0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
201e0 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70  Height(p);.    p
201f0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
20200 63 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f  c;.    if( !Igno
20210 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
20220 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72  st) ){.      pOr
20230 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
20240 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rBy;.    }.  }. 
20250 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
20260 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57  ist;.#endif.  pW
20270 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
20280 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
20290 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48  ->pGroupBy;.  pH
202a0 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
202b0 6e 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74  ng;.  isDistinct
202c0 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
202d0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
202e0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
202f0 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74  SELECT.  /* If t
20300 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
20310 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
20320 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
20330 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
20340 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
20350 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  or ){.    if( p-
20360 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29  >pRightmost==0 )
20370 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  {.      Select *
20380 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d  pLoop, *pRight =
20390 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e   0;.      int cn
203a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
203b0 20 6d 78 53 65 6c 65 63 74 3b 0a 20 20 20 20 20   mxSelect;.     
203c0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
203d0 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
203e0 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29  ->pPrior, cnt++)
203f0 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
20400 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b  >pRightmost = p;
20410 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
20420 70 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a  pNext = pRight;.
20430 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
20440 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a   pLoop;.      }.
20450 20 20 20 20 20 20 6d 78 53 65 6c 65 63 74 20 3d        mxSelect =
20460 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
20470 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
20480 44 5f 53 45 4c 45 43 54 5d 3b 0a 20 20 20 20 20  D_SELECT];.     
20490 20 69 66 28 20 6d 78 53 65 6c 65 63 74 20 26 26   if( mxSelect &&
204a0 20 63 6e 74 3e 6d 78 53 65 6c 65 63 74 20 29 7b   cnt>mxSelect ){
204b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
204c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
204d0 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73   "too many terms
204e0 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c   in compound SEL
204f0 45 43 54 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ECT");.        r
20500 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
20510 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
20520 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  n multiSelect(pP
20530 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 2c 20  arse, p, pDest, 
20540 61 66 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  aff);.  }.#endif
20550 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e  ..  /* If writin
20560 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67  g to memory or g
20570 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a  enerating a set.
20580 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67    ** only a sing
20590 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65  le column may be
205a0 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69   output..  */.#i
205b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
205c0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
205d0 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
205e0 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
205f0 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70  pParse, pDest, p
20600 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
20610 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
20620 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  _end;.  }.#endif
20630 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62  ..  /* If possib
20640 6c 65 2c 20 72 65 77 72 69 74 65 20 74 68 65 20  le, rewrite the 
20650 71 75 65 72 79 20 74 6f 20 75 73 65 20 47 52 4f  query to use GRO
20660 55 50 20 42 59 20 69 6e 73 74 65 61 64 20 6f 66  UP BY instead of
20670 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a 20   DISTINCT..  ** 
20680 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73 65  GROUP BY may use
20690 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53 54 49   an index, DISTI
206a0 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73 2e 0a  NCT never does..
206b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73    */.  if( p->is
206c0 44 69 73 74 69 6e 63 74 20 26 26 20 21 70 2d 3e  Distinct && !p->
206d0 69 73 41 67 67 20 26 26 20 21 70 2d 3e 70 47 72  isAgg && !p->pGr
206e0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 70 2d 3e  oupBy ){.    p->
206f0 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
20700 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
20710 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
20720 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
20730 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 2d  pGroupBy;.    p-
20740 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  >isDistinct = 0;
20750 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20  .    isDistinct 
20760 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
20770 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
20780 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
20790 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67  hen this sorting
207a0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68  .  ** index migh
207b0 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75  t end up being u
207c0 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74  nused if the dat
207d0 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65  a can be .  ** e
207e0 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d  xtracted in pre-
207f0 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49  sorted order.  I
20800 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
20810 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  se, then the.  *
20820 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  * OP_OpenEphemer
20830 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  al instruction w
20840 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74  ill be changed t
20850 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63  o an OP_Noop onc
20860 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65  e.  ** we figure
20870 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f   out that the so
20880 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e  rting index is n
20890 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20  ot needed.  The 
208a0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20  addrSortIndex.  
208b0 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  ** variable is u
208c0 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74  sed to facilitat
208d0 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  e that change.. 
208e0 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
208f0 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
20900 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
20910 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
20920 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
20930 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
20940 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  );.    pOrderBy-
20950 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  >iECursor = pPar
20960 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
20970 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
20980 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64  2] = addrSortInd
20990 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  ex =.      sqlit
209a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
209b0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
209c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72               pOr
209e0 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
209f0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
20a00 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  +2, 0,.         
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
20a30 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
20a40 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b  NDOFF);.  }else{
20a50 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64  .    addrSortInd
20a60 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
20a70 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
20a80 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
20a90 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
20aa0 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
20ab0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
20ac0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
20ad0 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
20ae0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20af0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
20b00 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e  hemeral, pDest->
20b10 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  iParm, pEList->n
20b20 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
20b30 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
20b40 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
20b50 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
20b60 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75  abel(v);.  compu
20b70 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
20b80 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64  (pParse, p, iEnd
20b90 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20  );..  /* Open a 
20ba0 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
20bb0 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
20bc0 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
20bd0 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
20be0 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
20bf0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61  *pKeyInfo;.    a
20c00 73 73 65 72 74 28 20 69 73 41 67 67 20 7c 7c 20  ssert( isAgg || 
20c10 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20 20  pGroupBy );.    
20c20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  distinct = pPars
20c30 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70  e->nTab++;.    p
20c40 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
20c50 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
20c60 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29  arse, p->pEList)
20c70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
20c80 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
20c90 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 69 73  enEphemeral, dis
20ca0 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cc0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
20cd0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
20ce0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
20cf0 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74  se{.    distinct
20d00 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
20d10 20 41 67 67 72 65 67 61 74 65 20 61 6e 64 20 6e   Aggregate and n
20d20 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
20d30 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65 64  ries are handled
20d40 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a   differently */.
20d50 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20    if( !isAgg && 
20d60 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
20d70 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
20d80 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65  is for non-aggre
20d90 67 61 74 65 20 71 75 65 72 69 65 73 0a 20 20 20  gate queries.   
20da0 20 2a 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   ** Begin the da
20db0 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 20 20  tabase scan.    
20dc0 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  */.    pWInfo = 
20dd0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
20de0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
20df0 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f 72  st, pWhere, &pOr
20e00 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 69  derBy, 0);.    i
20e10 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
20e20 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
20e30 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69  .    /* If sorti
20e40 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61  ng index that wa
20e50 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
20e60 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  rior OP_OpenEphe
20e70 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e  meral .    ** in
20e80 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20  struction ended 
20e90 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65  up not being nee
20ea0 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65  ded, then change
20eb0 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
20ec0 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74  meral.    ** int
20ed0 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20  o an OP_Noop..  
20ee0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64    */.    if( add
20ef0 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26  rSortIndex>=0 &&
20f00 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
20f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20f20 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
20f30 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20   addrSortIndex, 
20f40 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  1);.      p->add
20f50 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d  rOpenEphm[2] = -
20f60 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
20f70 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   Use the standar
20f80 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20  d inner loop.   
20f90 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 21   */.    assert(!
20fa0 69 73 44 69 73 74 69 6e 63 74 29 3b 0a 20 20 20  isDistinct);.   
20fb0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
20fc0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69  (pParse, p, pELi
20fd0 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
20fe0 42 79 2c 20 2d 31 2c 20 70 44 65 73 74 2c 0a 20  By, -1, pDest,. 
20ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21000 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74     pWInfo->iCont
21010 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  inue, pWInfo->iB
21020 72 65 61 6b 2c 20 61 66 66 29 3b 0a 0a 20 20 20  reak, aff);..   
21030 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
21040 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
21050 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
21060 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
21070 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
21080 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
21090 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  processing for a
210a0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
210b0 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
210c0 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e  ext sNC;    /* N
210d0 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
210e0 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
210f0 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
21100 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65   */.    int iAMe
21110 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
21120 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
21130 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72   for storing cur
21140 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f  rent GROUP BY */
21150 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20  .    int iBMem; 
21160 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
21170 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
21180 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50  r previous GROUP
21190 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
211a0 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  UseFlag;       /
211b0 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f  * Mem address ho
211c0 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63  lding flag indic
211d0 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65  ating that at le
211e0 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ast.            
211f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
21200 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e  ne row of the in
21210 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  put to the aggre
21220 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20  gator has been. 
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21240 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
21250 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sed */.    int i
21260 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f  AbortFlag;     /
21270 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68  * Mem address wh
21280 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79  ich causes query
21290 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69   abort if positi
212a0 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72  ve */.    int gr
212b0 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a  oupBySort;    /*
212c0 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20   Rows come from 
212d0 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20  source in GROUP 
212e0 42 59 20 6f 72 64 65 72 20 2a 2f 0a 0a 0a 20 20  BY order */...  
212f0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
21300 6e 67 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  ng variables hol
21310 64 20 61 64 64 72 65 73 73 65 73 20 6f 72 20 6c  d addresses or l
21320 61 62 65 6c 73 20 66 6f 72 20 70 61 72 74 73 20  abels for parts 
21330 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 69  of the.    ** vi
21340 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 70 72  rtual machine pr
21350 6f 67 72 61 6d 20 77 65 20 61 72 65 20 70 75 74  ogram we are put
21360 74 69 6e 67 20 74 6f 67 65 74 68 65 72 20 2a 2f  ting together */
21370 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74  .    int addrOut
21380 70 75 74 52 6f 77 3b 20 20 20 20 20 20 2f 2a 20  putRow;      /* 
21390 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
213a0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
213b0 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
213c0 0a 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70  .    int regOutp
213d0 75 74 52 6f 77 3b 20 20 20 20 20 20 20 2f 2a 20  utRow;       /* 
213e0 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
213f0 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70  egister for outp
21400 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ut subroutine */
21410 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74  .    int addrSet
21420 41 62 6f 72 74 3b 20 20 20 20 20 20 20 2f 2a 20  Abort;       /* 
21430 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c  Set the abort fl
21440 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  ag and return */
21450 0a 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 69  .    int addrIni
21460 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b 20 2f 2a 20  tializeLoop; /* 
21470 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20 74 68  Start of code th
21480 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  at initializes t
21490 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
214a0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70  .    int addrTop
214b0 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a 20  OfLoop;      /* 
214c0 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
214d0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74   loop */.    int
214e0 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20   addrEnd;       
214f0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61       /* End of a
21500 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  ll processing */
21510 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72  .    int addrSor
21520 74 69 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a 20  tingIdx;     /* 
21530 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
21540 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
21550 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
21560 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b    int addrReset;
21570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
21580 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65  routine for rese
21590 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  tting the accumu
215a0 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74  lator */.    int
215b0 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20   regReset;      
215c0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61       /* Return a
215d0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
215e0 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75  for reset subrou
215f0 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 61 64 64  tine */..    add
21600 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
21610 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
21620 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
21630 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
21640 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
21650 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
21660 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
21670 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
21680 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
21690 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
216a0 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
216b0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
216c0 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
216d0 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
216e0 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
216f0 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
21700 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
21710 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
21720 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
21730 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
21740 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53  .    sAggInfo.nS
21750 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70  ortingColumn = p
21760 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70  GroupBy ? pGroup
21770 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b  By->nExpr+1 : 0;
21780 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47  .    sAggInfo.pG
21790 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
217a0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  y;.    sqlite3Ex
217b0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
217c0 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a  (&sNC, pEList);.
217d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
217e0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
217f0 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  NC, pOrderBy);. 
21800 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
21810 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
21820 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
21830 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69  ates(&sNC, pHavi
21840 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ng);.    }.    s
21850 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c  AggInfo.nAccumul
21860 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e  ator = sAggInfo.
21870 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72  nColumn;.    for
21880 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
21890 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  .nFunc; i++){.  
218a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
218b0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
218c0 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  NC, sAggInfo.aFu
218d0 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 4c 69  nc[i].pExpr->pLi
218e0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
218f0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
21900 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
21910 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50  t_end;..    /* P
21920 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
21930 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52  gregates with GR
21940 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64  OUP BY is very d
21950 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20  ifferent and.   
21960 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f   ** much more co
21970 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65  mplex than aggre
21980 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20  gates without a 
21990 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f  GROUP BY..    */
219a0 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
219b0 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e  y ){.      KeyIn
219c0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f  fo *pKeyInfo;  /
219d0 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61  * Keying informa
219e0 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f  tion for the gro
219f0 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
21a00 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 0a 0a 20        int j1;.. 
21a10 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6c       /* Create l
21a20 61 62 65 6c 73 20 74 68 61 74 20 77 65 20 77 69  abels that we wi
21a30 6c 6c 20 62 65 20 6e 65 65 64 69 6e 67 0a 20 20  ll be needing.  
21a40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
21a50 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 20  rInitializeLoop 
21a60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
21a70 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
21a80 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
21a90 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
21aa0 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64  se we might need
21ab0 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
21ac0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   to.      ** imp
21ad0 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f  lement it.  Allo
21ae0 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e  cate that sortin
21af0 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66  g index now.  If
21b00 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20   it turns out.  
21b10 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
21b20 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66  o not need it af
21b30 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65  ter all, the Ope
21b40 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
21b50 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  uction.      ** 
21b60 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
21b70 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20  d into a Noop.  
21b80 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21b90 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
21ba0 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
21bb0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79  ab++;.      pKey
21bc0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
21bd0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
21be0 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  e, pGroupBy);.  
21bf0 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49      addrSortingI
21c00 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dx = sqlite3Vdbe
21c10 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
21c20 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20  nEphemeral, .   
21c30 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
21c40 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67  sortingIdx, sAgg
21c50 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
21c60 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  umn, .          
21c70 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  0, (char*)pKeyIn
21c80 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
21c90 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20  ANDOFF);..      
21ca0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
21cb0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
21cc0 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
21cd0 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
21ce0 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
21cf0 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b      iUseFlag = +
21d00 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
21d10 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
21d20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
21d30 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20  ;.      iAMem = 
21d40 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
21d50 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
21d60 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
21d70 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
21d80 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  BMem = pParse->n
21d90 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
21da0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
21db0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
21dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21dd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
21de0 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74  teger, 0, iAbort
21df0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
21e00 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c  eComment((v, "cl
21e10 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29  ear abort flag")
21e20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21e30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21e40 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73  _Integer, 0, iUs
21e50 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
21e60 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
21e70 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61  ndicate accumula
21e80 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20  tor empty"));.  
21e90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21ea0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
21eb0 2c 20 30 2c 20 61 64 64 72 49 6e 69 74 69 61 6c  , 0, addrInitial
21ec0 69 7a 65 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20 20  izeLoop);..     
21ed0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
21ee0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
21ef0 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20  utputs a single 
21f00 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
21f10 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20  t.      ** set. 
21f20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   This subroutine
21f30 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20   first looks at 
21f40 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49  the iUseFlag.  I
21f50 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20  f iUseFlag.     
21f60 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e   ** is less than
21f70 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
21f80 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  o, the subroutin
21f90 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
21fa0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70  f.      ** the p
21fb0 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20  rocessing calls 
21fc0 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f  for the query to
21fd0 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62   abort, this sub
21fe0 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
21ff0 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
22000 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72  iAbortFlag memor
22010 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72  y location befor
22020 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20  e returning in. 
22030 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f       ** order to
22040 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c   signal the call
22050 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20  er to abort..   
22060 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
22070 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74  SetAbort = sqlit
22080 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
22090 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
220a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
220b0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
220c0 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
220d0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
220e0 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c  v, "set abort fl
220f0 61 67 22 29 29 3b 0a 20 20 20 20 20 20 72 65 67  ag"));.      reg
22100 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50  OutputRow = ++pP
22110 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
22120 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22130 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
22140 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
22150 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
22160 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
22170 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
22180 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22190 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
221a0 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c  IfPos, iUseFlag,
221b0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32   addrOutputRow+2
221c0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
221d0 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62  ment((v, "Groupb
221e0 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
221f0 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29  or entry point")
22200 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22210 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
22220 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
22230 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69  utRow);.      fi
22240 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
22250 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
22260 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
22270 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
22280 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
22290 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
222a0 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70  Having, addrOutp
222b0 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f  utRow+1, SQLITE_
222c0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
222d0 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63     }.      selec
222e0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
222f0 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
22300 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
22310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22320 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c         distinct,
22330 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
22350 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
22360 64 64 72 53 65 74 41 62 6f 72 74 2c 20 61 66 66  ddrSetAbort, aff
22370 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22380 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
22390 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
223a0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
223b0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
223c0 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c  nd groupby resul
223d0 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a  t generator"));.
223e0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
223f0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
22400 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20  that will reset 
22410 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63  the group-by acc
22420 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a  umulator.      *
22430 2f 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65  /.      addrRese
22440 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
22450 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
22460 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20       regReset = 
22470 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
22480 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
22490 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
224a0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
224b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
224c0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
224d0 20 72 65 67 52 65 73 65 74 29 3b 0a 0a 20 20 20   regReset);..   
224e0 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
224f0 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
22500 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
22510 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
22520 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
22530 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
22540 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
22550 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
22560 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
22570 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
22580 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
22590 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
225a0 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
225b0 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
225c0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
225d0 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
225e0 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
225f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
22600 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
22610 61 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69 74  abel(v, addrInit
22620 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20  ializeLoop);.   
22630 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22640 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
22650 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
22660 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57  Reset);.      pW
22670 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
22680 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
22690 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
226a0 65 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30 29  e, &pGroupBy, 0)
226b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
226c0 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
226d0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69  ect_end;.      i
226e0 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  f( pGroupBy==0 )
226f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
22700 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62   optimizer is ab
22710 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f  le to deliver ro
22720 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f  ws in group by o
22730 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20  rder so.        
22740 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76  ** we do not hav
22750 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20  e to sort.  The 
22760 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
22770 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
22780 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
22790 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
227a0 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
227b0 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
227c0 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
227d0 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20         pGroupBy 
227e0 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
227f0 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
22800 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
22810 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
22820 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
22830 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
22840 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
22850 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
22860 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
22870 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
22880 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
22890 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
228a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
228b0 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
228c0 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
228d0 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
228e0 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
228f0 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
22900 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
22910 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65       int regBase
22920 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  ;.        int re
22930 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20  gRecord;.       
22940 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
22950 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b     int nGroupBy;
22960 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  ..        groupB
22970 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  ySort = 1;.     
22980 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47     nGroupBy = pG
22990 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
229a0 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47         nCol = nG
229b0 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20  roupBy + 1;.    
229c0 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
229d0 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +1;.        for(
229e0 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
229f0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
22a00 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67           if( sAg
22a10 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53  gInfo.aCol[i].iS
22a20 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
22a30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  {.            nC
22a40 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ol++;.          
22a50 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
22a60 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
22a70 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73       regBase = s
22a80 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
22a90 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29  ge(pParse, nCol)
22aa0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
22ab0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
22ac0 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
22ad0 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b  By, regBase, 0);
22ae0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22af0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22b00 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49  _Sequence, sAggI
22b10 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72  nfo.sortingIdx,r
22b20 65 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29  egBase+nGroupBy)
22b30 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
22b40 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20  roupBy+1;.      
22b50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
22b60 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
22b70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
22b80 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
22b90 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49  l *pCol = &sAggI
22ba0 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  nfo.aCol[i];.   
22bb0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
22bc0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  >iSorterColumn>=
22bd0 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
22be0 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65   int r1 = j + re
22bf0 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  gBase;.         
22c00 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
22c10 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
22c20 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20  lumn(pParse, .  
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
22c50 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69  l->pTab, pCol->i
22c60 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54  Column, pCol->iT
22c70 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20  able, r1, 0);.  
22c80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31            if( r1
22c90 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20  !=r2 ){.        
22ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22cb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
22cc0 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20  opy, r2, r1);.  
22cd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22ce0 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
22cf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22d00 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65   }.        regRe
22d10 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
22d20 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
22d30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
22d40 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
22d50 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
22d60 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67  gBase, nCol, reg
22d70 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
22d80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22d90 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
22da0 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
22db0 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f  tingIdx, regReco
22dc0 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
22dd0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
22de0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
22df0 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
22e00 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
22e10 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
22e20 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  egBase, nCol);. 
22e30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
22e40 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
22e50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22e60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22e70 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
22e80 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
22e90 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
22ea0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
22eb0 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a  OUP BY sort"));.
22ec0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
22ed0 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
22ee0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
22ef0 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
22f00 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
22f10 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74   BY terms and st
22f20 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62  ore in b0, b1, b
22f30 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62  2....      ** (b
22f40 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  0 is memory loca
22f50 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31  tion iBMem+0, b1
22f60 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64   is iBMem+1, and
22f70 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20   so forth).     
22f80 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65   ** Then compare
22f90 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
22fa0 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69  UP BY terms agai
22fb0 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  nst the GROUP BY
22fc0 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20   terms.      ** 
22fd0 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
22fe0 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  s row currently 
22ff0 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31  stored in a0, a1
23000 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  , a2....      */
23010 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66  .      addrTopOf
23020 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
23030 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
23040 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
23050 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
23060 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
23070 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
23080 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
23090 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
230a0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
230b0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
230c0 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b  dx, j, iBMem+j);
230d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
230e0 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
230f0 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  fo.directMode = 
23100 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  1;.          sql
23110 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
23120 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
23130 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d  [j].pExpr, iBMem
23140 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +j);.        }. 
23150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
23160 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
23170 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41  , OP_Compare, iA
23180 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f  Mem, iBMem, pGro
23190 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  upBy->nExpr,.   
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231b0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
231c0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
231d0 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20  FO);.      j1 = 
231e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
231f0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
23200 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23210 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
23220 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a  1+1, 0, j1+1);..
23230 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
23240 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
23250 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
23260 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
23270 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73        ** Changes
23280 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
23290 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
232a0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
232b0 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  de.      ** bloc
232c0 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  k.  If there wer
232d0 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68  e no changes, th
232e0 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70  is block is skip
232f0 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ped..      **.  
23300 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
23310 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20   copies current 
23320 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69  group by terms i
23330 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20  n b0,b1,b2,.... 
23340 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20       ** over to 
23350 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68  a0,a1,a2.  It th
23360 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74  en calls the out
23370 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  put subroutine. 
23380 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
23390 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ts the aggregate
233a0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
233b0 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72  isters in prepar
233c0 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66  ation.      ** f
233d0 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55  or the next GROU
233e0 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20  P BY batch..    
233f0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
23400 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
23410 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41  Parse, iBMem, iA
23420 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
23430 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
23440 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23450 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
23460 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
23470 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
23480 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
23490 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22  "output one row"
234a0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
234b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
234c0 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46  P_IfPos, iAbortF
234d0 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  lag, addrEnd);. 
234e0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
234f0 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72  ((v, "check abor
23500 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
23510 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23520 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
23530 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
23540 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
23550 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73  Comment((v, "res
23560 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
23570 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
23580 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
23590 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
235a0 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
235b0 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
235c0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
235d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
235e0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
235f0 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20  re(v, j1);.     
23600 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
23610 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
23620 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
23630 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23640 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
23650 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
23660 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
23670 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61  , "indicate data
23680 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22   in accumulator"
23690 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  ));..      /* En
236a0 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  d of the loop.  
236b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
236c0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
236d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
236e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
236f0 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
23700 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
23710 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
23720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23730 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
23740 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
23750 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
23760 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
23770 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a  SortingIdx, 1);.
23780 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
23790 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
237a0 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
237b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
237c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
237d0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
237e0 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
237f0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
23800 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
23810 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c  v, "output final
23820 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 0a   row"));.      .
23830 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
23840 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20 65  GroupBy */.    e
23850 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72  lse {.      Expr
23860 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20  List *pMinMax = 
23870 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  0;.      ExprLis
23880 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 20  t *pDel = 0;.   
23890 20 20 20 75 38 20 66 6c 61 67 3b 0a 0a 20 20 20     u8 flag;..   
238a0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
238b0 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f  he query is of o
238c0 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
238d0 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20  ing forms:.     
238e0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 53   **.      **   S
238f0 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f  ELECT min(x) FRO
23900 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 20  M ....      **  
23910 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46   SELECT max(x) F
23920 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ROM ....      **
23930 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20  .      ** If it 
23940 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65  is, then ask the
23950 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
23960 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73   to attempt to s
23970 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20  ort results.    
23980 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65    ** as if there
23990 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f   was an "ORDER O
239a0 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f  N x" or "ORDER O
239b0 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65  N x DESC" clause
239c0 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 77  . .      ** If w
239d0 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74  here.c is able t
239e0 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74  o produce result
239f0 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73  s sorted in this
23a00 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20   order, then.   
23a10 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63     ** add vdbe c
23a20 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ode to break out
23a30 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69   of the processi
23a40 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68  ng loop after th
23a50 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 72 73  e .      ** firs
23a60 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e  t iteration (sin
23a70 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65  ce the first ite
23a80 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
23a90 6f 70 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  op is .      ** 
23aa0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70  guaranteed to op
23ab0 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77  erate on the row
23ac0 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75   with the minimu
23ad0 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20  m or maximum .  
23ae0 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
23af0 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20  x, the only row 
23b00 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20  required)..     
23b10 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 20 73   **.      ** A s
23b20 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74  pecial flag must
23b30 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71   be passed to sq
23b40 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
23b50 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20  ) to slightly.  
23b60 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65      ** modify be
23b70 68 61 76 69 6f 75 72 20 61 73 20 66 6f 6c 6c 6f  haviour as follo
23b80 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ws:.      **.   
23b90 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65     **   + If the
23ba0 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c   query is a "SEL
23bb0 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65  ECT min(x)", the
23bc0 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64  n the loop coded
23bd0 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   by.      **    
23be0 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20   where.c should 
23bf0 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72  not iterate over
23c00 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68   any values with
23c10 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20   a NULL value.  
23c20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78      **     for x
23c30 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
23c40 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69   **   + The opti
23c50 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68  mizer code in wh
23c60 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67  ere.c (the thing
23c70 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68   that decides wh
23c80 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ich.      **    
23c90 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65   index or indice
23ca0 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64  s to use) should
23cb0 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65   place a differe
23cc0 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a  nt priority on .
23cd0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74        **     sat
23ce0 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44  isfying the 'ORD
23cf0 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68  ER BY' clause th
23d00 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74  an it does in ot
23d10 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20  her cases..     
23d20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f   **     Refer to
23d30 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e   code and commen
23d40 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f  ts in where.c fo
23d50 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20  r details..     
23d60 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 20 3d   */.      flag =
23d70 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61   minMaxQuery(pPa
23d80 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69  rse, p);.      i
23d90 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  f( flag ){.     
23da0 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61     pDel = pMinMa
23db0 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  x = sqlite3ExprL
23dc0 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
23dd0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
23de0 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
23df0 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26    if( pMinMax &&
23e00 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
23e10 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
23e20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f  pMinMax->a[0].so
23e30 72 74 4f 72 64 65 72 20 3d 20 28 28 66 6c 61 67  rtOrder = ((flag
23e40 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  ==WHERE_ORDERBY_
23e50 4d 49 4e 29 3f 30 3a 31 29 3b 0a 20 20 20 20 20  MIN)?0:1);.     
23e60 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
23e70 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54  0].pExpr->op = T
23e80 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
23e90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
23ea0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
23eb0 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72  runs if the aggr
23ec0 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f  egate has no GRO
23ed0 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  UP BY clause.  T
23ee0 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  he.      ** proc
23ef0 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73  essing is much s
23f00 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65  impler since the
23f10 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e  re is only a sin
23f20 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 2a 2a  gle row.      **
23f30 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20   of output..    
23f40 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 74    */.      reset
23f50 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
23f60 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
23f70 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
23f80 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
23f90 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
23fa0 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4d 69 6e  t, pWhere, &pMin
23fb0 4d 61 78 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20  Max, flag);.    
23fc0 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
23fd0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23fe0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
23ff0 28 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  (pDel);.        
24000 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
24010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75  .      }.      u
24020 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
24030 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
24040 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  fo);.      if( !
24050 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c 61 67 20  pMinMax && flag 
24060 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
24070 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
24080 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e  OP_Goto, 0, pWIn
24090 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20 20 20  fo->iBreak);.   
240a0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
240b0 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e  ((v, "%s() by in
240c0 64 65 78 22 2c 28 66 6c 61 67 3d 3d 57 48 45 52  dex",(flag==WHER
240d0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d  E_ORDERBY_MIN?"m
240e0 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20  in":"max")));.  
240f0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
24100 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
24110 66 6f 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  fo);.      final
24120 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
24130 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
24140 6f 29 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72  o);.      pOrder
24150 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  By = 0;.      if
24160 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
24170 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24180 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
24190 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64  pHaving, addrEnd
241a0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
241b0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULL);.      }.  
241c0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
241d0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
241e0 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  ->pEList, 0, 0, 
241f0 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20  0, -1, .        
24200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
24210 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64  est, addrEnd, ad
24220 64 72 45 6e 64 2c 20 61 66 66 29 3b 0a 0a 20 20  drEnd, aff);..  
24230 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
24240 69 73 74 44 65 6c 65 74 65 28 70 44 65 6c 29 3b  istDelete(pDel);
24250 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
24260 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
24270 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  el(v, addrEnd);.
24280 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69      .  } /* endi
24290 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  f aggregate quer
242a0 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  y */..  /* If th
242b0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
242c0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
242d0 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
242e0 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
242f0 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
24300 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
24310 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
24320 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
24330 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  {.    generateSo
24340 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
24350 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  , v, pEList->nEx
24360 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a  pr, pDest);.  }.
24370 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24380 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
24390 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
243a0 20 73 75 62 71 75 65 72 79 2c 20 77 65 20 68 61   subquery, we ha
243b0 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64  ve now converted
243c0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
243d0 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  to a.  ** tempor
243e0 61 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20 73  ary table.  So s
243f0 65 74 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69  et the SrcList_i
24400 74 65 6d 2e 69 73 50 6f 70 75 6c 61 74 65 64 20  tem.isPopulated 
24410 66 6c 61 67 20 74 6f 20 70 72 65 76 65 6e 74 0a  flag to prevent.
24420 20 20 2a 2a 20 74 68 69 73 20 73 75 62 71 75 65    ** this subque
24430 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20 65 76  ry from being ev
24440 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20 61 6e  aluated again an
24450 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 75  d to force the u
24460 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 74  se of.  ** the t
24470 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a  emporary table..
24480 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65    */.  if( pPare
24490 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nt ){.    assert
244a0 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d  ( pParent->pSrc-
244b0 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54 61 62 20  >nSrc>parentTab 
244c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
244d0 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b  Parent->pSrc->a[
244e0 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65  parentTab].pSele
244f0 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 50 61  ct==p );.    pPa
24500 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61  rent->pSrc->a[pa
24510 72 65 6e 74 54 61 62 5d 2e 69 73 50 6f 70 75 6c  rentTab].isPopul
24520 61 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 23 65  ated = 1;.  }.#e
24530 6e 64 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  ndif..  /* Jump 
24540 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69  here to skip thi
24550 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  s query.  */.  s
24560 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
24570 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b  eLabel(v, iEnd);
24580 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ..  /* The SELEC
24590 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  T was successful
245a0 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20  ly coded.   Set 
245b0 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
245c0 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  to 0.  ** to ind
245d0 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e  icate no errors.
245e0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a  .  */.  rc = 0;.
245f0 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
24600 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
24610 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
24620 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
24630 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
24640 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
24650 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
24660 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20 20  .select_end:..  
24670 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
24680 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77  mn names if we w
24690 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65  ill be using the
246a0 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e  m in a callback.
246b0 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70    This.  ** step
246c0 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
246d0 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69  he output is goi
246e0 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72  ng to some other
246f0 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20   destination..  
24700 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
24710 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d  ITE_OK && pDest-
24720 3e 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c  >eDest==SRT_Call
24730 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65  back ){.    gene
24740 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
24750 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
24760 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
24770 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
24780 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20  AggInfo.aCol);. 
24790 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 41   sqlite3_free(sA
247a0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20  ggInfo.aFunc);. 
247b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
247c0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
247d0 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a  E_DEBUG)./*.****
247e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
247f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
24830 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
24840 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
24850 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
24860 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63  ing only.  The c
24870 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66 6f 6c 6c  ode.** that foll
24880 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  ows does not app
24890 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20 62 75  ear in normal bu
248a0 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  ilds..**.** Thes
248b0 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
248c0 73 65 64 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  sed to print out
248d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
248e0 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f 66 20 61  all or part of a
248f0 20 0a 2a 2a 20 70 61 72 73 65 20 73 74 72 75 63   .** parse struc
24900 74 75 72 65 73 20 73 75 63 68 20 61 73 20 53 65  tures such as Se
24910 6c 65 63 74 20 6f 72 20 45 78 70 72 2e 20 20 53  lect or Expr.  S
24920 75 63 68 20 70 72 69 6e 74 6f 75 74 73 20 61 72  uch printouts ar
24930 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  e useful.** for 
24940 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e 64 65 72  helping to under
24950 73 74 61 6e 64 20 77 68 61 74 20 69 73 20 68 61  stand what is ha
24960 70 70 65 6e 69 6e 67 20 69 6e 73 69 64 65 20 74  ppening inside t
24970 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
24980 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20  r.** during the 
24990 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 6f 6d  execution of com
249a0 70 6c 65 78 20 53 45 4c 45 43 54 20 73 74 61 74  plex SELECT stat
249b0 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ements..**.** Th
249c0 65 73 65 20 72 6f 75 74 69 6e 65 20 61 72 65 20  ese routine are 
249d0 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e 79 77 68  not called anywh
249e0 65 72 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ere from within 
249f0 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 63 6f  the normal.** co
24a00 64 65 20 62 61 73 65 2e 20 20 54 68 65 6e 20 61  de base.  Then a
24a10 72 65 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  re intended to b
24a20 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  e called from wi
24a30 74 68 69 6e 20 74 68 65 20 64 65 62 75 67 67 65  thin the debugge
24a40 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20 74 65 6d  r.** or from tem
24a50 70 6f 72 61 72 79 20 22 70 72 69 6e 74 66 22 20  porary "printf" 
24a60 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 65 72  statements inser
24a70 74 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ted for debuggin
24a80 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  g..*/.void sqlit
24a90 65 33 50 72 69 6e 74 45 78 70 72 28 45 78 70 72  e3PrintExpr(Expr
24aa0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74   *p){.  if( p->t
24ab0 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d 3e 74 6f 6b  oken.z && p->tok
24ac0 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71  en.n>0 ){.    sq
24ad0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24ae0 28 22 28 25 2e 2a 73 22 2c 20 70 2d 3e 74 6f 6b  ("(%.*s", p->tok
24af0 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a  en.n, p->token.z
24b00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24b10 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24b20 74 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f 70 29  tf("(%d", p->op)
24b30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
24b40 4c 65 66 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Left ){.    sqli
24b50 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24b60 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
24b70 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 4c 65  PrintExpr(p->pLe
24b80 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ft);.  }.  if( p
24b90 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
24ba0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24bb0 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c  tf(" ");.    sql
24bc0 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
24bd0 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20  >pRight);.  }.  
24be0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24bf0 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69 64 20  tf(")");.}.void 
24c00 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
24c10 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
24c20 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
24c30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
24c40 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
24c50 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
24c60 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69  tExpr(pList->a[i
24c70 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
24c80 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ( i<pList->nExpr
24c90 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  -1 ){.      sqli
24ca0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24cb0 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , ");.    }.  }.
24cc0 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72  }.void sqlite3Pr
24cd0 69 6e 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74  intSelect(Select
24ce0 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29   *p, int indent)
24cf0 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  {.  sqlite3Debug
24d00 50 72 69 6e 74 66 28 22 25 2a 73 53 45 4c 45 43  Printf("%*sSELEC
24d10 54 28 25 70 29 20 22 2c 20 69 6e 64 65 6e 74 2c  T(%p) ", indent,
24d20 20 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74   "", p);.  sqlit
24d30 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28  e3PrintExprList(
24d40 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71  p->pEList);.  sq
24d50 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24d60 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20 70 2d  ("\n");.  if( p-
24d70 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 63 68 61  >pSrc ){.    cha
24d80 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20 20 20  r *zPrefix;.    
24d90 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72 65 66  int i;.    zPref
24da0 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20 20 20  ix = "FROM";.   
24db0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70   for(i=0; i<p->p
24dc0 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
24dd0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
24de0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
24df0 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b  m = &p->pSrc->a[
24e00 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  i];.      sqlite
24e10 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
24e20 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c 20 7a  s ", indent+6, z
24e30 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20 7a  Prefix);.      z
24e40 50 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20  Prefix = "";.   
24e50 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
24e60 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
24e70 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24e80 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20 20 20  ntf("(\n");.    
24e90 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
24ea0 53 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e 70 53  Select(pItem->pS
24eb0 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b 31 30  elect, indent+10
24ec0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
24ed0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
24ee0 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38 2c 20  *s)", indent+8, 
24ef0 22 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  "");.      }else
24f00 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   if( pItem->zNam
24f10 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
24f20 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24f30 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  "%s", pItem->zNa
24f40 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
24f50 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54     if( pItem->pT
24f60 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ab ){.        sq
24f70 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24f80 28 22 28 74 61 62 6c 65 3a 20 25 73 29 22 2c 20  ("(table: %s)", 
24f90 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
24fa0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
24fb0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
24fc0 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lias ){.        
24fd0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24fe0 74 66 28 22 20 41 53 20 25 73 22 2c 20 70 49 74  tf(" AS %s", pIt
24ff0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
25000 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
25010 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 2d 31  <p->pSrc->nSrc-1
25020 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
25030 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25040 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ,");.      }.   
25050 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
25060 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
25070 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
25080 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71  pWhere ){.    sq
25090 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
250a0 28 22 25 2a 73 20 57 48 45 52 45 20 22 2c 20 69  ("%*s WHERE ", i
250b0 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20  ndent, "");.    
250c0 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
250d0 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  (p->pWhere);.   
250e0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
250f0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
25100 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
25110 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
25120 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
25130 47 52 4f 55 50 20 42 59 20 22 2c 20 69 6e 64 65  GROUP BY ", inde
25140 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
25150 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
25160 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  t(p->pGroupBy);.
25170 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
25180 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
25190 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69  }.  if( p->pHavi
251a0 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ng ){.    sqlite
251b0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
251c0 73 20 48 41 56 49 4e 47 20 22 2c 20 69 6e 64 65  s HAVING ", inde
251d0 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
251e0 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
251f0 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73  >pHaving);.    s
25200 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25210 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  f("\n");.  }.  i
25220 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
25230 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
25240 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 4f 52  ugPrintf("%*s OR
25250 44 45 52 20 42 59 20 22 2c 20 69 6e 64 65 6e 74  DER BY ", indent
25260 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  , "");.    sqlit
25270 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28  e3PrintExprList(
25280 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
25290 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
252a0 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a  intf("\n");.  }.
252b0 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  }./* End of the 
252c0 73 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20  structure debug 
252d0 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a  printing code.**
252e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
252f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e  ***********/.#en
25330 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
25340 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64  QLITE_TEST) || d
25350 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
25360 42 55 47 29 20 2a 2f 0a                          BUG) */.