/ Hex Artifact Content
Login

Artifact e27de53be426254e1b75690c9c99482bb1431b79:


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 33 37  select.c,v 1.437
0200: 20 32 30 30 38 2f 30 36 2f 32 36 20 31 38 3a 30   2008/06/26 18:0
0210: 34 3a 30 33 20 64 61 6e 69 65 6c 6b 31 39 37 37  4:03 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 69 6e 74 20  et: {.      int 
5300: 61 64 64 72 32 3b 0a 0a 20 20 20 20 20 20 61 73  addr2;..      as
5310: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
5320: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66   );.      p->aff
5330: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 43  inity = sqlite3C
5340: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
5350: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
5360: 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69  r, pDest->affini
5370: 74 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ty);.      if( p
5380: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
5390: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
53a0: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
53b0: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
53c0: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
53d0: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
53e0: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
53f0: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
5400: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
5410: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
5420: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
5430: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
5440: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
5450: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
5460: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
5470: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
5480: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
5490: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
54a0: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
54b0: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b  , p, regResult);
54c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
54d0: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
54e0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
54f0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
5500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5510: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
5520: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
5530: 20 31 2c 20 72 31 2c 20 26 70 2d 3e 61 66 66 69   1, r1, &p->affi
5540: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
5550: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
5560: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
5570: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
5580: 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  lt, 1);.        
5590: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
55a0: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
55b0: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
55c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
55d0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
55e0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
55f0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5600: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
5610: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
5620: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
5630: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
5640: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
5650: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
5660: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
5670: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5680: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
5690: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
56a0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
56b0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
56c0: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
56d0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
56e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
56f0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
5700: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
5710: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
5720: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
5730: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
5740: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
5750: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
5760: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
5770: 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
5780: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
5790: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
57a0: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
57b0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
57c0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  mn==1 );.      i
57d0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
57e0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
57f0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
5800: 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65  rderBy, p, regRe
5810: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  sult);.      }el
5820: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5830: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
5840: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
5850: 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  t, iParm, 1);.  
5860: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
5870: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
5880: 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
5890: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
58a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
58b0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
58c0: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
58d0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
58e0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20  */..    /* Send 
58f0: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  the data to the 
5900: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
5910: 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75  n or to a subrou
5920: 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20  tine.  In the.  
5930: 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73    ** case of a s
5940: 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73  ubroutine, the s
5950: 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66  ubroutine itself
5960: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
5970: 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69  for.    ** poppi
5980: 6e 67 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d  ng the data from
5990: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
59a0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
59b0: 43 6f 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63  Coroutine:.    c
59c0: 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b  ase SRT_Callback
59d0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  : {.      if( pO
59e0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
59f0: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
5a00: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
5a10: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
5a20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5a30: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5a40: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5a50: 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20  lumn, r1);.     
5a60: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
5a70: 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  r(pParse, pOrder
5a80: 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20  By, p, r1);.    
5a90: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5aa0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5ab0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , r1);.      }el
5ac0: 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  se if( eDest==SR
5ad0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
5ae0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5af0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
5b00: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61  ield, pDest->iPa
5b10: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
5b20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5b30: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5b40: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67  P_ResultRow, reg
5b50: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29  Result, nColumn)
5b60: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5b70: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
5b80: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
5b90: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
5ba0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  umn);.      }.  
5bb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5bc0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
5bd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
5be0: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
5bf0: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
5c00: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
5c10: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
5c20: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
5c30: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
5c40: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
5c50: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
5c60: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
5c70: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
5c80: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
5c90: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
5ca0: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
5cb0: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
5cc0: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
5cd0: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
5ce0: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
5cf0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
5d00: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
5d10: 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a  =SRT_Discard );.
5d20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5d30: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
5d40: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
5d50: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
5d60: 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
5d70: 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
5d80: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
5d90: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
5da0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5db0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
5dc0: 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d  mm, p->iLimit, -
5dd0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
5de0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5df0: 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  IfZero, p->iLimi
5e00: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a  t, iBreak);.  }.
5e10: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
5e20: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
5e30: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65  t, generate a Ke
5e40: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5e50: 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20  that records.** 
5e60: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
5e70: 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20  quence for each 
5e80: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
5e90: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  at expression li
5ea0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
5eb0: 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20   ExprList is an 
5ec0: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
5ed0: 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e  P BY clause then
5ee0: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a   the resulting.*
5ef0: 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  * KeyInfo struct
5f00: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
5f10: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
5f20: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e  ing a virtual in
5f30: 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  dex to.** implem
5f40: 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e  ent that clause.
5f50: 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73    If the ExprLis
5f60: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
5f70: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a  set of a SELECT.
5f80: 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49  ** then the KeyI
5f90: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
5fa0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
5fb0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
5fc0: 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78  virtual.** index
5fd0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
5fe0: 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a  DISTINCT test..*
5ff0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
6000: 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
6010: 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
6020: 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  in from malloc. 
6030: 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
6040: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
6050: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69  onsible for seei
6060: 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
6070: 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
6080: 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20  ally.** freed.  
6090: 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  Add the KeyInfo 
60a0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65  structure to the
60b0: 20 50 34 20 66 69 65 6c 64 20 6f 66 20 61 6e 20   P4 field of an 
60c0: 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20  opcode using.** 
60d0: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
60e0: 46 46 20 69 73 20 74 68 65 20 75 73 75 61 6c 20  FF is the usual 
60f0: 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77  way of dealing w
6100: 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61  ith this..*/.sta
6110: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79  tic KeyInfo *key
6120: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
6130: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6140: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
6150: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
6160: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
6170: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79  int nExpr;.  Key
6180: 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73  Info *pInfo;.  s
6190: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
61a0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
61b0: 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20  t i;..  nExpr = 
61c0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
61d0: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  pInfo = sqlite3D
61e0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
61f0: 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b  sizeof(*pInfo) +
6200: 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43   nExpr*(sizeof(C
6210: 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20  ollSeq*)+1) );. 
6220: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
6230: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
6240: 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66  der = (u8*)&pInf
6250: 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b  o->aColl[nExpr];
6260: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65  .    pInfo->nFie
6270: 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20  ld = nExpr;.    
6280: 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43  pInfo->enc = ENC
6290: 28 64 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  (db);.    for(i=
62a0: 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
62b0: 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c  a; i<nExpr; i++,
62c0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
62d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
62e0: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
62f0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
6300: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
6310: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  >pExpr);.      i
6320: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
6330: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d       pColl = db-
6340: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
6350: 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d    }.      pInfo-
6360: 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c  >aColl[i] = pCol
6370: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
6380: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
6390: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
63a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
63b0: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a  turn pInfo;.}...
63c0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
63d0: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
63e0: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
63f0: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
6400: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
6410: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
6420: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
6430: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
6440: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
6450: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
6460: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
6470: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
6480: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
6490: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
64a0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
64b0: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
64c0: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
64d0: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
64e0: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
64f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
6500: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
6510: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
6520: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
6530: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6540: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20   */.  Vdbe *v,  
6550: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
6560: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
6570: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
6580: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f   nColumn,      /
6590: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
65a0: 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  mns of data */. 
65b0: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
65c0: 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  st /* Write the 
65d0: 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68  sorted results h
65e0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
65f0: 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  brk = sqlite3Vdb
6600: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
6610: 20 69 6e 74 20 63 6f 6e 74 20 3d 20 73 71 6c 69   int cont = sqli
6620: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
6630: 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  (v);.  int addr;
6640: 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69  .  int iTab;.  i
6650: 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30  nt pseudoTab = 0
6660: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
6670: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
6680: 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65  erBy;..  int eDe
6690: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
66a0: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
66b0: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a   pDest->iParm;..
66c0: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
66d0: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20  int regRowid;.. 
66e0: 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79   iTab = pOrderBy
66f0: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66  ->iECursor;.  if
6700: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
6710: 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d  lback || eDest==
6720: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
6730: 0a 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d  .    pseudoTab =
6740: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
6750: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6760: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74  AddOp2(v, OP_Set
6770: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 6e  NumColumns, 0, n
6780: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c  Column);.    sql
6790: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
67a0: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
67b0: 20 70 73 65 75 64 6f 54 61 62 2c 20 65 44 65 73   pseudoTab, eDes
67c0: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 29  t==SRT_Callback)
67d0: 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 31  ;.  }.  addr = 1
67e0: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
67f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  dOp2(v, OP_Sort,
6800: 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63   iTab, brk);.  c
6810: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
6820: 63 6f 6e 74 29 3b 0a 20 20 72 65 67 52 6f 77 20  cont);.  regRow 
6830: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
6840: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72  Reg(pParse);.  r
6850: 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  egRowid = sqlite
6860: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
6870: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
6880: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
6890: 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72  olumn, iTab, pOr
68a0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31  derBy->nExpr + 1
68b0: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73 77 69  , regRow);.  swi
68c0: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
68d0: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
68e0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
68f0: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
6900: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6910: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
6920: 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  d, iParm, regRow
6930: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
6940: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6950: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
6960: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
6970: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
6980: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
6990: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
69a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
69b0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
69c0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
69d0: 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  Y.    case SRT_S
69e0: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
69f0: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
6a00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6a10: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
6a20: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
6a30: 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c  ow, 1, regRowid,
6a40: 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31   &p->affinity, 1
6a50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6a60: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
6a70: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
6a80: 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20  regRow, 1);.    
6a90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6aa0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
6ab0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
6ac0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65  owid);.      bre
6ad0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6ae0: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
6af0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
6b00: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
6b10: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
6b20: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
6b30: 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ow, iParm, 1);. 
6b40: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
6b50: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
6b60: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
6b70: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
6b80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6b90: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 52  ndif.    case SR
6ba0: 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20  T_Callback:.    
6bb0: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
6bc0: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ne: {.      int 
6bd0: 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
6be0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6bf0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
6c00: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
6c10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6c20: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 73  v, OP_Insert, ps
6c30: 65 75 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c  eudoTab, regRow,
6c40: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
6c50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
6c60: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
6c70: 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52      assert( regR
6c80: 6f 77 21 3d 70 44 65 73 74 2d 3e 69 4d 65 6d 2b  ow!=pDest->iMem+
6c90: 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i );.        sql
6ca0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6cb0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65  , OP_Column, pse
6cc0: 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74  udoTab, i, pDest
6cd0: 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 20  ->iMem+i);.     
6ce0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44 65   }.      if( eDe
6cf0: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
6d00: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6d10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6d20: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
6d30: 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c  Dest->iMem, nCol
6d40: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  umn);.        sq
6d50: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
6d60: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
6d70: 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d  rse, pDest->iMem
6d80: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
6d90: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
6da0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
6db0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6dc0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6dd0: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
6de0: 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  ->iParm);.      
6df0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
6e00: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
6e10: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  : {.      /* Do 
6e20: 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20  nothing */.     
6e30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6e40: 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
6e50: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
6e60: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c  , regRow);.  sql
6e70: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
6e80: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
6e90: 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  wid);..  /* Jump
6ea0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
6eb0: 68 65 20 6c 6f 6f 70 20 77 68 65 6e 20 74 68 65  he loop when the
6ec0: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
6ed0: 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  d.  */.  if( p->
6ee0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
6ef0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6f00: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d  v, OP_AddImm, p-
6f10: 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20  >iLimit, -1);.  
6f20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6f30: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op2(v, OP_IfZero
6f40: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 62 72 6b  , p->iLimit, brk
6f50: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
6f60: 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
6f70: 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
6f80: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
6f90: 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73  el(v, cont);.  s
6fa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6fb0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
6fc0: 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  b, addr);.  sqli
6fd0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
6fe0: 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 69  bel(v, brk);.  i
6ff0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
7000: 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d  llback || eDest=
7010: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
7020: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
7030: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
7040: 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  ose, pseudoTab, 
7050: 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a  0);.  }..}../*.*
7060: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
7070: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  er to a string c
7080: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64  ontaining the 'd
7090: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27  eclaration type'
70a0: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
70b0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65  ssion pExpr. The
70c0: 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74   string may be t
70d0: 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63  reated as static
70e0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
70f0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  **.** The declar
7100: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
7110: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
7120: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
7130: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  acted from the.*
7140: 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  * original CREAT
7150: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
7160: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
7170: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
7180: 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74   The.** declarat
7190: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
71a0: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
71b0: 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77  TEGER. Exactly w
71c0: 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hen an expressio
71d0: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  n.** is consider
71e0: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  ed a column can 
71f0: 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68  be complex in th
7200: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75  e presence of su
7210: 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a  bqueries. The.**
7220: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
7230: 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66  ession in all of
7240: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
7250: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
7260: 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   is .** consider
7270: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74  ed a column by t
7280: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
7290: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c  .**   SELECT col
72a0: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
72b0: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
72c0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
72d0: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
72e0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   col FROM tbl);.
72f0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20  **   SELECT abc 
7300: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c  FROM (SELECT col
7310: 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c   AS abc FROM tbl
7320: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  );.** .** The de
7330: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
7340: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
7350: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  n other than a c
7360: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  olumn is NULL..*
7370: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
7380: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28  har *columnType(
7390: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
73a0: 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  pNC, .  Expr *pE
73b0: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
73c0: 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a  r **pzOriginDb,.
73d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
73e0: 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f  zOriginTab,.  co
73f0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
7400: 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72  ginCol.){.  char
7410: 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20   const *zType = 
7420: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
7430: 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a  *zOriginDb = 0;.
7440: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
7450: 72 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20  riginTab = 0;.  
7460: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
7470: 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e  ginCol = 0;.  in
7480: 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78 70 72  t j;.  if( pExpr
7490: 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63  ==0 || pNC->pSrc
74a0: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
74b0: 20 30 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   0;..  switch( p
74c0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
74d0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
74e0: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
74f0: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
7500: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
7510: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c  n is a column. L
7520: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
7530: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65  the column is be
7540: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74  ing.      ** ext
7550: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e  racted from in N
7560: 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c  ameContext.pSrcL
7570: 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20  ist. This table 
7580: 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20  may be real.    
7590: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61    ** database ta
75a0: 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72  ble or a subquer
75b0: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
75c0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
75d0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
75e0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
75f0: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
7600: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
7610: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
7620: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
7630: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c  * Select the col
7640: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
7650: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69   from */.      i
7660: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
7670: 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e  >iColumn;  /* In
7680: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
7690: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77   pTab */.      w
76a0: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54  hile( pNC && !pT
76b0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72  ab ){.        Sr
76c0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
76d0: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
76e0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
76f0: 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ;j<pTabList->nSr
7700: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
7710: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78  [j].iCursor!=pEx
7720: 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b  pr->iTable;j++);
7730: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
7740: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b  TabList->nSrc ){
7750: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20  .          pTab 
7760: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
7770: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
7780: 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e   pS = pTabList->
7790: 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[j].pSelect;.  
77a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
77b0: 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43         pNC = pNC
77c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
77d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
77e0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
77f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 49 58 20  .        /* FIX 
7800: 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  ME:.        ** T
7810: 68 69 73 20 63 61 6e 20 6f 63 63 75 72 73 20 69  his can occurs i
7820: 66 20 79 6f 75 20 68 61 76 65 20 73 6f 6d 65 74  f you have somet
7830: 68 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c 45 43  hing like "SELEC
7840: 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69 64 65  T new.x;" inside
7850: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72  .        ** a tr
7860: 69 67 67 65 72 2e 20 20 49 6e 20 6f 74 68 65 72  igger.  In other
7870: 20 77 6f 72 64 73 2c 20 69 66 20 79 6f 75 20 72   words, if you r
7880: 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 70 65  eference the spe
7890: 63 69 61 6c 20 22 6e 65 77 22 0a 20 20 20 20 20  cial "new".     
78a0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74     ** table in t
78b0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
78c0: 20 61 20 73 65 6c 65 63 74 2e 20 20 57 65 20 64   a select.  We d
78d0: 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 67 6f 6f  o not have a goo
78e0: 64 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a  d way.        **
78f0: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61 63 74   to find the act
7900: 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65 2c 20  ual table type, 
7910: 73 6f 20 63 61 6c 6c 20 69 74 20 22 54 45 58 54  so call it "TEXT
7920: 22 2e 20 20 54 68 69 73 20 69 73 20 72 65 61 6c  ".  This is real
7930: 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  ly.        ** so
7940: 6d 65 74 68 69 6e 67 20 6f 66 20 61 20 62 75 67  mething of a bug
7950: 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b  , but I do not k
7960: 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69 78 20 69  now how to fix i
7970: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t..        **.  
7980: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
7990: 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64  de does not prod
79a0: 75 63 65 20 74 68 65 20 63 6f 72 72 65 63 74 20  uce the correct 
79b0: 61 6e 73 77 65 72 20 2d 20 69 74 20 6a 75 73 74  answer - it just
79c0: 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20   prevents.      
79d0: 20 20 2a 2a 20 61 20 73 65 67 66 61 75 6c 74 2e    ** a segfault.
79e0: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 31 32    See ticket #12
79f0: 32 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  29..        */. 
7a00: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
7a10: 54 45 58 54 22 3b 0a 20 20 20 20 20 20 20 20 62  TEXT";.        b
7a20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
7a30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
7a40: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b );.      if( p
7a50: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  S ){.        /* 
7a60: 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61  The "table" is a
7a70: 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65  ctually a sub-se
7a80: 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69  lect or a view i
7a90: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
7aa0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
7ab0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
7ac0: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
7ad0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
7ae0: 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20  e and origin.   
7af0: 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72       ** data for
7b00: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
7b10: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75  column of the su
7b20: 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20  b-select..      
7b30: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
7b40: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
7b50: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
7b60: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
7b70: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
7b80: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
7b90: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
7ba0: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
7bb0: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
7bc0: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
7bd0: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
7be0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
7bf0: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
7c00: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
7c10: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
7c20: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
7c30: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
7c40: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
7c50: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
7c60: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
7c70: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
7c80: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
7c90: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
7ca0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
7cb0: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
7cc0: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a   sNC.pNext = 0;.
7cd0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
7ce0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
7cf0: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
7d00: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
7d10: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
7d20: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
7d30: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
7d40: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
7d50: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
7d60: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
7d70: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
7d80: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
7d90: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20  assert( !pS );. 
7da0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
7db0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
7dc0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
7dd0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
7de0: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
7df0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
7e00: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
7e10: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
7e20: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
7e30: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20  EGER";.         
7e40: 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72   zOriginCol = "r
7e50: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d  owid";.        }
7e60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7e70: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
7e80: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
7e90: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
7ea0: 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  nCol = pTab->aCo
7eb0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
7ec0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7ed0: 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54   zOriginTab = pT
7ee0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
7ef0: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
7f00: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
7f10: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
7f20: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
7f30: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  NC->pParse->db, 
7f40: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
7f50: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
7f60: 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  nDb = pNC->pPars
7f70: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
7f80: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
7f90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7fa0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
7fb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7fc0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
7fd0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
7fe0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
7ff0: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
8000: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
8010: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
8020: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
8030: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
8040: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
8050: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
8060: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
8070: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
8080: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
8090: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
80a0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
80b0: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
80c0: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
80d0: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
80e0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
80f0: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63  ;.      sNC.pSrc
8100: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
8110: 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  .      sNC.pNext
8120: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e   = pNC;.      sN
8130: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
8140: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54  pParse;.      zT
8150: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
8160: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
8170: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
8180: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
8190: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
81a0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
81b0: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69    .  if( pzOrigi
81c0: 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nDb ){.    asser
81d0: 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26  t( pzOriginTab &
81e0: 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b  & pzOriginCol );
81f0: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62  .    *pzOriginDb
8200: 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20   = zOriginDb;.  
8210: 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d    *pzOriginTab =
8220: 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20   zOriginTab;.   
8230: 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20   *pzOriginCol = 
8240: 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a  zOriginCol;.  }.
8250: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
8260: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
8270: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
8280: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
8290: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
82a0: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
82b0: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
82c0: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
82d0: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
82e0: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
82f0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
8300: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
8310: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
8320: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
8330: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
8340: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
8350: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
8360: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
8370: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
8380: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
8390: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
83a0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
83b0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
83c0: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
83d0: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
83e0: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
83f0: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
8400: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
8410: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
8420: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
8430: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
8440: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
8450: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
8460: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
8470: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
8480: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
8490: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
84a0: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
84b0: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
84c0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
84d0: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
84e0: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
84f0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
8500: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
8510: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
8520: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
8530: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
8540: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
8550: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
8560: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
8570: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
8580: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
8590: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
85a0: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
85b0: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
85c0: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
85d0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
85e0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
85f0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8600: 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72  ME_DATABASE, zOr
8610: 69 67 44 62 2c 20 50 34 5f 54 52 41 4e 53 49 45  igDb, P4_TRANSIE
8620: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
8630: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8640: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42  , i, COLNAME_TAB
8650: 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 50 34  LE, zOrigTab, P4
8660: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
8670: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8680: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8690: 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72  NAME_COLUMN, zOr
86a0: 69 67 43 6f 6c 2c 20 50 34 5f 54 52 41 4e 53 49  igCol, P4_TRANSI
86b0: 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ENT);.#else.    
86c0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
86d0: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
86e0: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
86f0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8700: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8710: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
8720: 54 79 70 65 2c 20 50 34 5f 54 52 41 4e 53 49 45  Type, P4_TRANSIE
8730: 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  NT);.  }.#endif 
8740: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
8750: 45 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a  ECLTYPE */.}../*
8760: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
8770: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
8780: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61   the VDBE the na
8790: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  mes of columns.*
87a0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
87b0: 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  set.  This infor
87c0: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
87d0: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a  o provide the.**
87e0: 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20   azCol[] values 
87f0: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
8800: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8810: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
8820: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
8830: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
8840: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
8850: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
8860: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
8870: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
8880: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
8890: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
88a0: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
88b0: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
88c0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
88d0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
88e0: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
88f0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8900: 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73  .  int fullNames
8910: 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23  , shortNames;..#
8920: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8930: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20  IT_EXPLAIN.  /* 
8940: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
8950: 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
8960: 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
8970: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
8980: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
8990: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
89a0: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66  rt( v!=0 );.  if
89b0: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d  ( pParse->colNam
89c0: 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c  esSet || v==0 ||
89d0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
89e0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50  d ) return;.  pP
89f0: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
8a00: 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d  t = 1;.  fullNam
8a10: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
8a20: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
8a30: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f  Names)!=0;.  sho
8a40: 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  rtNames = (db->f
8a50: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
8a60: 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ortColNames)!=0;
8a70: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
8a80: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69  tNumCols(v, pELi
8a90: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f  st->nExpr);.  fo
8aa0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
8ab0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
8ac0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70    Expr *p;.    p
8ad0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
8ae0: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
8af0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
8b00: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
8b10: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
8b20: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
8b30: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
8b40: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Name;.      sqli
8b50: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8b60: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8b70: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  NAME, zName, str
8b80: 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  len(zName));.   
8b90: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8ba0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70   }.    if( p->op
8bb0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
8bc0: 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  TabList ){.     
8bd0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
8be0: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
8bf0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
8c00: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
8c10: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
8c20: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20  abList->nSrc && 
8c30: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
8c40: 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c  Cursor!=p->iTabl
8c50: 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  e; j++){}.      
8c60: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
8c70: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
8c80: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
8c90: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
8ca0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
8cb0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
8cc0: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
8cd0: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
8ce0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
8cf0: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
8d00: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
8d10: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
8d20: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
8d30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8d40: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
8d50: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
8d60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8d70: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
8d80: 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d  !fullNames && p-
8d90: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
8da0: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
8db0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8dc0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8dd0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68  OLNAME_NAME, (ch
8de0: 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  ar*)p->span.z, p
8df0: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
8e00: 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e   }else if( fullN
8e10: 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e  ames || (!shortN
8e20: 61 6d 65 73 20 26 26 20 70 54 61 62 4c 69 73 74  ames && pTabList
8e30: 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20  ->nSrc>1) ){.   
8e40: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
8e50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
8e60: 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20  ar *zTab;. .    
8e70: 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c      zTab = pTabL
8e80: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73  ist->a[j].zAlias
8e90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 75  ;.        if( fu
8ea0: 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d  llNames || zTab=
8eb0: 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62  =0 ) zTab = pTab
8ec0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
8ed0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
8ee0: 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20  g(&zName, zTab, 
8ef0: 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72  ".", zCol, (char
8f00: 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  *)0);.        sq
8f10: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8f20: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8f30: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50  E_NAME, zName, P
8f40: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
8f50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8f60: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8f70: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8f80: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c  NAME_NAME, zCol,
8f90: 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a   strlen(zCol));.
8fa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8fb0: 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20  e if( p->span.z 
8fc0: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
8fd0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8fe0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8ff0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
9000: 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61  E, (char*)p->spa
9010: 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b  n.z, p->span.n);
9020: 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  .      /* sqlite
9030: 33 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61  3VdbeCompressSpa
9040: 63 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a  ce(v, addr); */.
9050: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9060: 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b   char zName[30];
9070: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9080: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
9090: 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29  || pTabList==0 )
90a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
90b0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
90c0: 7a 4e 61 6d 65 29 2c 20 7a 4e 61 6d 65 2c 20 22  zName), zName, "
90d0: 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b  column%d", i+1);
90e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
90f0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
9100: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
9110: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
9120: 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65  }.  }.  generate
9130: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
9140: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
9150: 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  List);.}..#ifnde
9160: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
9170: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
9180: 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  .** Name of the 
9190: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61  connection opera
91a0: 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72  tor, used for er
91b0: 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f  ror messages..*/
91c0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
91d0: 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65  ar *selectOpName
91e0: 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72  (int id){.  char
91f0: 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69   *z;.  switch( i
9200: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  d ){.    case TK
9210: 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20  _ALL:       z = 
9220: 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62  "UNION ALL";   b
9230: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9240: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d  K_INTERSECT: z =
9250: 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20   "INTERSECT";   
9260: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9270: 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20  TK_EXCEPT:    z 
9280: 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20  = "EXCEPT";     
9290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
92a0: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a  ult:           z
92b0: 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20   = "UNION";     
92c0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
92d0: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
92e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
92f0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
9300: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61   */../*.** Forwa
9310: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
9320: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65  /.static int pre
9330: 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73  pSelectStmt(Pars
9340: 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f  e*, Select*);../
9350: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
9360: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
9370: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
9380: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
9390: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
93a0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
93b0: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
93c0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
93d0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
93e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61  rse *pParse, cha
93f0: 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c  r *zTabName, Sel
9400: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
9410: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
9420: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72  int i, j;.  Expr
9430: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
9440: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70  Column *aCol, *p
9450: 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
9460: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9470: 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ..  while( pSele
9480: 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
9490: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
94a0: 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 72  pPrior;.  if( pr
94b0: 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61  epSelectStmt(pPa
94c0: 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b  rse, pSelect) ){
94d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
94e0: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
94f0: 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50  SelectResolve(pP
9500: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
9510: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
9520: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  0;.  }.  pTab = 
9530: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
9540: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
9550: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
9560: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
9570: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
9580: 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
9590: 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54  pTab->zName = zT
95a0: 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 33  abName ? sqlite3
95b0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 54 61  DbStrDup(db, zTa
95c0: 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45  bName) : 0;.  pE
95d0: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
95e0: 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e  pEList;.  pTab->
95f0: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
9600: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
9610: 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pTab->nCol>0 );.
9620: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 61    pTab->aCol = a
9630: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Col = sqlite3DbM
9640: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
9650: 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  zeof(pTab->aCol[
9660: 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b  0])*pTab->nCol);
9670: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
9680: 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e  =aCol; i<pTab->n
9690: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
96a0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 2c 20  ){.    Expr *p, 
96b0: 2a 70 52 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  *pR;.    char *z
96c0: 54 79 70 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Type;.    char *
96d0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e  zName;.    int n
96e0: 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 6c 53 65  Name;.    CollSe
96f0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e  q *pColl;.    in
9700: 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61 6d 65 43  t cnt;.    NameC
9710: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
9720: 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61  .    /* Get an a
9730: 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20  ppropriate name 
9740: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  for the column. 
9750: 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45     */.    p = pE
9760: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
9770: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
9780: 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d  >pRight==0 || p-
9790: 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a  >pRight->token.z
97a0: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74  ==0 || p->pRight
97b0: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20  ->token.z[0]!=0 
97c0: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d  );.    if( (zNam
97d0: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
97e0: 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  .zName)!=0 ){.  
97f0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
9800: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e  lumn contains an
9810: 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72   "AS <name>" phr
9820: 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20  ase, use <name> 
9830: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
9840: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
9850: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
9860: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
9870: 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  se if( p->op==TK
9880: 5f 44 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20  _DOT .          
9890: 20 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52      && (pR=p->pR
98a0: 69 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e  ight)!=0 && pR->
98b0: 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74  token.z && pR->t
98c0: 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  oken.z[0] ){.   
98d0: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
98e0: 73 20 6f 66 20 74 68 65 20 66 72 6f 6d 20 41 2e  s of the from A.
98f0: 42 20 75 73 65 20 42 20 61 73 20 74 68 65 20 6e  B use B as the n
9900: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
9910: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
9920: 6e 74 66 28 64 62 2c 20 22 25 54 22 2c 20 26 70  ntf(db, "%T", &p
9930: 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d  R->token);.    }
9940: 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e  else if( p->span
9950: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
9960: 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55  0] ){.      /* U
9970: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  se the original 
9980: 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  text of the colu
9990: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  mn expression as
99a0: 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   its name */.   
99b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
99c0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
99d0: 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29 3b 0a 20  T", &p->span);. 
99e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
99f0: 2f 2a 20 49 66 20 61 6c 6c 20 65 6c 73 65 20 66  /* If all else f
9a00: 61 69 6c 73 2c 20 6d 61 6b 65 20 75 70 20 61 20  ails, make up a 
9a10: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
9a20: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
9a30: 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e  intf(db, "column
9a40: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d  %d", i+1);.    }
9a50: 0a 20 20 20 20 69 66 28 20 21 7a 4e 61 6d 65 20  .    if( !zName 
9a60: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
9a70: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  led ){.      db-
9a80: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
9a90: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
9aa0: 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  _free(zName);.  
9ab0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
9ac0: 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a 20 20  eTable(pTab);.  
9ad0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9ae0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
9af0: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 0a  equote(zName);..
9b00: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
9b10: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
9b20: 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20   is unique.  If 
9b30: 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  the name is not 
9b40: 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61  unique,.    ** a
9b50: 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20  ppend a integer 
9b60: 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74  to the name so t
9b70: 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75  hat it becomes u
9b80: 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  nique..    */.  
9b90: 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e    nName = strlen
9ba0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
9bb0: 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a  (j=cnt=0; j<i; j
9bc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
9bd0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43  qlite3StrICmp(aC
9be0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  ol[j].zName, zNa
9bf0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
9c00: 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d    zName[nName] =
9c10: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   0;.        zNam
9c20: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
9c30: 74 66 28 64 62 2c 20 22 25 7a 3a 25 64 22 2c 20  tf(db, "%z:%d", 
9c40: 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20  zName, ++cnt);. 
9c50: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
9c60: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
9c70: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
9c80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
9c90: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
9ca0: 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20  me;..    /* Get 
9cb0: 74 68 65 20 74 79 70 65 6e 61 6d 65 2c 20 74 79  the typename, ty
9cc0: 70 65 20 61 66 66 69 6e 69 74 79 2c 20 61 6e 64  pe affinity, and
9cd0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
9ce0: 6e 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20  nce for the.    
9cf0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a  ** column..    *
9d00: 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
9d10: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
9d20: 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  ));.    sNC.pSrc
9d30: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
9d40: 70 53 72 63 3b 0a 20 20 20 20 7a 54 79 70 65 20  pSrc;.    zType 
9d50: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
9d60: 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65  p(db, columnType
9d70: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
9d80: 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a  0));.    pCol->z
9d90: 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20  Type = zType;.  
9da0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
9db0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
9dc0: 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 70  finity(p);.    p
9dd0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
9de0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
9df0: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
9e00: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
9e10: 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->zColl = sqlit
9e20: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
9e30: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
9e40: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
9e50: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65  iPKey = -1;.  re
9e60: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
9e70: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 53 45  .** Prepare a SE
9e80: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
9e90: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79  or processing by
9ea0: 20 64 6f 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   doing the follo
9eb0: 77 69 6e 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a  wing.** things:.
9ec0: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
9ed0: 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
9ee0: 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
9ef0: 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
9f00: 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
9f10: 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
9f20: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
9f30: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
9f40: 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
9f50: 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
9f60: 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
9f70: 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
9f80: 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
9f90: 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
9fa0: 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
9fb0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
9fc0: 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
9fd0: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
9fe0: 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
9ff0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
a000: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
a010: 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
a020: 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
a030: 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
a040: 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
a050: 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
a060: 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
a070: 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
a080: 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
a090: 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
a0a0: 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
a0b0: 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
a0c0: 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
a0d0: 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  resistent repres
a0e0: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
a0f0: 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
a100: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
a110: 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
a120: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
a130: 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e  accomodate the N
a140: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
a150: 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
a160: 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
a170: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
a180: 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
a190: 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20    (4)  Scan the 
a1a0: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
a1b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
a1c0: 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
a1d0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
a1e0: 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
a1f0: 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
a200: 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
a210: 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
a220: 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
a230: 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
a240: 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
a250: 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
a260: 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
a270: 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
a280: 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
a290: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  LE..**.** Return
a2a0: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20   0 on success.  
a2b0: 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72 6f  If there are pro
a2c0: 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20  blems, leave an 
a2d0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
a2e0: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
a2f0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
a300: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
a310: 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72  epSelectStmt(Par
a320: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
a330: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  ct *p){.  int i,
a340: 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63   j, k, rc;.  Src
a350: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
a360: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
a370: 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
a380: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
a390: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
a3a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
a3b0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
a3c0: 70 53 72 63 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  pSrc==0 || db->m
a3d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
a3e0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
a3f0: 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
a400: 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
a410: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  = p->pEList;..  
a420: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72  /* Make sure cur
a430: 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
a440: 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
a450: 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  o all entries in
a460: 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
a470: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
a480: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
a490: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63   */.  sqlite3Src
a4a0: 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
a4b0: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72  s(pParse, p->pSr
a4c0: 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75  c);..  /* Look u
a4d0: 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61  p every table na
a4e0: 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
a4f0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65  clause of the se
a500: 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61  lect.  If.  ** a
a510: 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  n entry of the F
a520: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20  ROM clause is a 
a530: 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64  subquery instead
a540: 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76   of a table or v
a550: 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63  iew,.  ** then c
a560: 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e  reate a transien
a570: 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
a580: 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  e to describe th
a590: 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f  e subquery..  */
a5a0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f  .  for(i=0, pFro
a5b0: 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
a5c0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
a5d0: 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
a5e0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
a5f0: 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
a600: 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20  pTab!=0 ){.     
a610: 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   /* This stateme
a620: 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  nt has already b
a630: 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54  een prepared.  T
a640: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
a650: 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66        ** to go f
a660: 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20  urther. */.     
a670: 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b   assert( i==0 );
a680: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
a690: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
a6a0: 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
a6b0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
a6c0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
a6d0: 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
a6e0: 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
a6f0: 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
a700: 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
a710: 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
a720: 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ct!=0 );.      i
a730: 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  f( pFrom->zAlias
a740: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
a750: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20  From->zAlias =. 
a760: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a770: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c  MPrintf(db, "sql
a780: 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f  ite_subquery_%p_
a790: 22 2c 20 28 76 6f 69 64 2a 29 70 46 72 6f 6d 2d  ", (void*)pFrom-
a7a0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
a7b0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
a7c0: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
a7d0: 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
a7e0: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
a7f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
a800: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
a810: 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a  pParse, pFrom->z
a820: 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d 3e 70 53  Alias, pFrom->pS
a830: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66  elect);.      if
a840: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
a850: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
a860: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
a870: 54 68 65 20 69 73 45 70 68 65 6d 20 66 6c 61 67  The isEphem flag
a880: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
a890: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
a8a0: 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20  ure has been.   
a8b0: 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c     ** dynamicall
a8c0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  y allocated and 
a8d0: 6d 61 79 20 62 65 20 66 72 65 65 64 20 61 74 20  may be freed at 
a8e0: 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74  any time.  In ot
a8f0: 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20  her words,.     
a900: 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20   ** pTab is not 
a910: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65  pointing to a pe
a920: 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73  rsistent table s
a930: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
a940: 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70  fines.      ** p
a950: 61 72 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d  art of the schem
a960: 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62  a. */.      pTab
a970: 2d 3e 69 73 45 70 68 65 6d 20 3d 20 31 3b 0a 23  ->isEphem = 1;.#
a980: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
a990: 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64  .      /* An ord
a9a0: 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76  inary table or v
a9b0: 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  iew name in the 
a9c0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
a9d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
a9e0: 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
a9f0: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
aa00: 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20   = pTab = .     
aa10: 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65     sqlite3Locate
aa20: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 30 2c 70  Table(pParse,0,p
aa30: 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f  From->zName,pFro
aa40: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
aa50: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
aa60: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
aa70: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
aa80: 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
aa90: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
aaa0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
aab0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
aac0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
aad0: 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
aae0: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
aaf0: 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  || IsVirtual(pTa
ab00: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  b) ){.        /*
ab10: 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69   We reach here i
ab20: 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
ab30: 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20  e is a really a 
ab40: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20  view */.        
ab50: 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
ab60: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
ab70: 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
ab80: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
ab90: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
aba0: 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d       /* If pFrom
abb0: 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20  ->pSelect!=0 it 
abc0: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
abd0: 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20  ling with a.    
abe0: 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68      ** view with
abf0: 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  in a view.  The 
ac00: 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72 65  SELECT structure
ac10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
ac20: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  n.        ** cop
ac30: 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65 72  ied by the outer
ac40: 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20   view so we can 
ac50: 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73 74  skip the copy st
ac60: 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20 20  ep here.        
ac70: 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ** in the inner 
ac80: 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  view..        */
ac90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72  .        if( pFr
aca0: 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
acb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f  {.          pFro
acc0: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
acd0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
ace0: 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29  , pTab->pSelect)
acf0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ad00: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
ad10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
ad20: 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
ad30: 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
ad40: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
ad50: 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
ad60: 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  f( sqliteProcess
ad70: 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
ad80: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
ad90: 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
ada0: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
adb0: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
adc0: 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
add0: 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
ade0: 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
adf0: 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
ae00: 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
ae10: 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
ae20: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
ae30: 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
ae40: 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
ae50: 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
ae60: 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
ae70: 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f  e TK_ALL operato
ae80: 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
ae90: 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
aea0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e  the column list.
aeb0: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
aec0: 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
aed0: 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
aee0: 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f  TK_ALL expressio
aef0: 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20  ns and expand.  
af00: 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  ** each one to t
af10: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
af20: 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
af30: 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
af40: 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
af50: 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
af60: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
af70: 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
af80: 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
af90: 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
afa0: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
afb0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
afc0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  {.    Expr *pE =
afd0: 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
afe0: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
aff0: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
b000: 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  eak;.    if( pE-
b010: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
b020: 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d  E->pRight && pE-
b030: 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
b040: 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20  ALL.         && 
b050: 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d  pE->pLeft && pE-
b060: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
b070: 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  D ) break;.  }. 
b080: 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b   rc = 0;.  if( k
b090: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
b0a0: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
b0b0: 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
b0c0: 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
b0d0: 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
b0e0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
b0f0: 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
b100: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
b110: 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
b120: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
b130: 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
b140: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
b150: 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
b160: 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
b170: 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
b180: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
b190: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
b1a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
b1b0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
b1c0: 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
b1d0: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
b1e0: 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
b1f0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
b200: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20 26 26  lColNames)!=0 &&
b210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b220: 20 20 20 20 20 20 20 28 66 6c 61 67 73 20 26 20         (flags & 
b230: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
b240: 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66  ames)==0;..    f
b250: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
b260: 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
b270: 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
b280: 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
b290: 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
b2a0: 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20 20  _ALL &&.        
b2b0: 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44     (pE->op!=TK_D
b2c0: 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
b2d0: 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  ==0 || pE->pRigh
b2e0: 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29  t->op!=TK_ALL) )
b2f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
b300: 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70  s particular exp
b310: 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
b320: 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
b330: 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nded..        */
b340: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
b350: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
b360: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
b370: 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20  ew, a[k].pExpr, 
b380: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
b390: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
b3a0: 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
b3b0: 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
b3c0: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
b3d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b3e0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
b3f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b400: 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
b410: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
b420: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  me = 0;.      }e
b430: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
b440: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
b450: 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
b460: 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
b470: 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
b480: 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
b490: 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
b4a0: 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
b4b0: 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
b4c0: 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
b4d0: 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
b4e0: 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  zTName;         
b4f0: 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
b500: 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
b510: 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
b520: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
b530: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
b540: 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c      zTName = sql
b550: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
b560: 6e 28 64 62 2c 20 26 70 45 2d 3e 70 4c 65 66 74  n(db, &pE->pLeft
b570: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
b580: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b590: 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20     zTName = 0;. 
b5a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b5b0: 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
b5c0: 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
b5d0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
b5e0: 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
b5f0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
b600: 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
b610: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  b;.          cha
b620: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
b630: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
b640: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
b650: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61  ame==0 || zTabNa
b660: 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20  me[0]==0 ){ .   
b670: 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
b680: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
b690: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b6a0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
b6b0: 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d  e && (zTabName==
b6c0: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
b6d0: 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ==0 || .        
b6e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b6f0: 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
b700: 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b  zTabName)!=0) ){
b710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
b720: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
b730: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62   }.          tab
b740: 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  leSeen = 1;.    
b750: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
b760: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
b770: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
b780: 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69  xpr *pExpr, *pRi
b790: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
b7a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
b7b0: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
b7c0: 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  me;..           
b7d0: 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
b7e0: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69  is marked as 'hi
b7f0: 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79  dden' (currently
b800: 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20   only possible. 
b810: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f             ** fo
b820: 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
b830: 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64  ), do not includ
b840: 65 20 69 74 20 69 6e 20 74 68 65 20 65 78 70 61  e it in the expa
b850: 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  nded.           
b860: 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c   ** result-set l
b870: 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ist..           
b880: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
b890: 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75  if( IsHiddenColu
b8a0: 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  mn(&pTab->aCol[j
b8b0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
b8c0: 20 20 20 20 61 73 73 65 72 74 28 49 73 56 69 72      assert(IsVir
b8d0: 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20  tual(pTab));.   
b8e0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
b8f0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
b900: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
b910: 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
b920: 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
b930: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
b940: 65 66 74 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  eft = &pTabList-
b950: 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20  >a[i-1];.       
b960: 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 66         if( (pLef
b970: 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  t[1].jointype & 
b980: 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26  JT_NATURAL)!=0 &
b990: 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
b9a0: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
b9b0: 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 54 61  Index(pLeft->pTa
b9c0: 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  b, zName)>=0 ){.
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9e0: 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20  /* In a NATURAL 
b9f0: 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a  join, omit the j
ba00: 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  oin columns from
ba10: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
ba20: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f        ** table o
ba30: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
ba50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
ba60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ba70: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
ba80: 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 4c  e3IdListIndex(pL
ba90: 65 66 74 5b 31 5d 2e 70 55 73 69 6e 67 2c 20 7a  eft[1].pUsing, z
baa0: 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
bac0: 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20  n a join with a 
bad0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d  USING clause, om
bae0: 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  it columns in th
baf0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
bb00: 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
bb10: 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
bb20: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
bb30: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
bb40: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
bb50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
bb60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bb70: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73        pRight = s
bb80: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
bb90: 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  se, TK_ID, 0, 0,
bba0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
bbb0: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
bbc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
bbd0: 20 20 20 20 73 65 74 51 75 6f 74 65 64 54 6f 6b      setQuotedTok
bbe0: 65 6e 28 70 50 61 72 73 65 2c 20 26 70 52 69 67  en(pParse, &pRig
bbf0: 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65  ht->token, zName
bc00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
bc10: 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 28  f( zTabName && (
bc20: 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61  longNames || pTa
bc30: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29  bList->nSrc>1) )
bc40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
bc50: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
bc60: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
bc70: 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  e, TK_ID, 0, 0, 
bc80: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
bc90: 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
bca0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
bcb0: 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
bcc0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
bcd0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
bce0: 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 51              setQ
bd00: 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61 72 73  uotedToken(pPars
bd10: 65 2c 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  e, &pLeft->token
bd20: 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
bd30: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f             setTo
bd40: 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73 70 61 6e  ken(&pExpr->span
bd50: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
bd60: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
bd70: 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
bd80: 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
bd90: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
bda0: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79    pExpr->span.dy
bdb0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
bdc0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
bdd0: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.z = 0;.       
bde0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
bdf0: 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ken.n = 0;.     
be00: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
be10: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20  token.dyn = 0;. 
be20: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
be30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
be40: 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
be60: 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70  xpr->span = pExp
be70: 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  r->token;.      
be80: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
be90: 70 61 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  pan.dyn = 0;.   
bea0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
beb0: 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
bec0: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
bed0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
bee0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
bef0: 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
bf00: 20 70 45 78 70 72 2c 20 26 70 45 78 70 72 2d 3e   pExpr, &pExpr->
bf10: 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  span);.         
bf20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bf30: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
bf40: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
bf50: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
bf60: 77 2c 20 70 45 78 70 72 2c 20 26 70 52 69 67 68  w, pExpr, &pRigh
bf70: 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  t->token);.     
bf80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bf90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
bfa0: 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
bfb0: 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
bfc0: 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
bfd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
bfe0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
bff0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
c000: 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
c010: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
c020: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
c030: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
c040: 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
c050: 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
c060: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c070: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
c080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c090: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 4e  sqlite3_free(zTN
c0a0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
c0b0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
c0c0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
c0d0: 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
c0e0: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
c0f0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
c100: 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
c110: 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c  pEList && p->pEL
c120: 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  ist->nExpr>db->a
c130: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
c140: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
c150: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c160: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
c170: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72  any columns in r
c180: 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 20  esult set");.   
c190: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
c1a0: 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  OR;.  }.#endif. 
c1b0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
c1c0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 63 20  ailed ){.    rc 
c1d0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
c1e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c1f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73 20  .}../*.** pE is 
c200: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
c210: 65 78 70 72 65 73 73 69 6f 6e 20 77 68 69 63 68  expression which
c220: 20 69 73 20 61 20 73 69 6e 67 6c 65 20 74 65 72   is a single ter
c230: 6d 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59  m in.** ORDER BY
c240: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
c250: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68  use..**.** At th
c260: 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75  e point this rou
c270: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
c280: 77 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 20  we already know 
c290: 74 68 61 74 20 74 68 65 0a 2a 2a 20 4f 52 44 45  that the.** ORDE
c2a0: 52 20 42 59 20 74 65 72 6d 20 69 73 20 6e 6f 74  R BY term is not
c2b0: 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 64 65   an integer inde
c2c0: 78 20 69 6e 74 6f 20 74 68 65 20 72 65 73 75 6c  x into the resul
c2d0: 74 20 73 65 74 2e 20 20 54 68 61 74 0a 2a 2a 20  t set.  That.** 
c2e0: 63 61 73 65 65 20 69 73 20 68 61 6e 64 6c 65 64  casee is handled
c2f0: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
c300: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49  routine..**.** I
c310: 66 20 70 45 20 69 73 20 61 20 77 65 6c 6c 2d 66  f pE is a well-f
c320: 6f 72 6d 65 64 20 65 78 70 72 65 73 73 69 6f 6e  ormed expression
c330: 20 61 6e 64 20 74 68 65 20 53 45 4c 45 43 54 20   and the SELECT 
c340: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20  statement.** is 
c350: 6e 6f 74 20 63 6f 6d 70 6f 75 6e 64 2c 20 74 68  not compound, th
c360: 65 6e 20 72 65 74 75 72 6e 20 30 2e 20 20 54 68  en return 0.  Th
c370: 69 73 20 69 6e 64 69 63 61 74 65 73 20 74 6f 20  is indicates to 
c380: 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 68  the.** caller th
c390: 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f 72  at it should sor
c3a0: 74 20 62 79 20 74 68 65 20 76 61 6c 75 65 20 6f  t by the value o
c3b0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a  f the ORDER BY.*
c3c0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  * expression..**
c3d0: 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
c3e0: 54 20 69 73 20 63 6f 6d 70 6f 75 6e 64 2c 20 74  T is compound, t
c3f0: 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d  hen attempt to m
c400: 61 74 63 68 20 70 45 20 61 67 61 69 6e 73 74 0a  atch pE against.
c410: 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  ** result set co
c420: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6c 65 66  lumns in the lef
c430: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
c440: 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
c450: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 20  .** the index i 
c460: 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  of the matching 
c470: 63 6f 6c 75 6d 6e 2c 20 61 73 20 61 6e 20 69 6e  column, as an in
c480: 64 69 63 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  dication to the 
c490: 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 68 61 74 20  .** caller that 
c4a0: 69 74 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62  it should sort b
c4b0: 79 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  y the i-th colum
c4c0: 6e 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 0a  n.  If there is.
c4d0: 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74  ** no match, ret
c4e0: 75 72 6e 20 2d 31 20 61 6e 64 20 6c 65 61 76 65  urn -1 and leave
c4f0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
c500: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
c510: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68  static int match
c520: 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70  OrderByTermToExp
c530: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
c540: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
c550: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 66  arsing context f
c560: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
c570: 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
c580: 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 54 68 65  Select,   /* The
c590: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c5a0: 74 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  t with the ORDER
c5b0: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
c5c0: 45 78 70 72 20 2a 70 45 2c 20 20 20 20 20 20 20  Expr *pE,       
c5d0: 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
c5e0: 69 63 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ic ORDER BY term
c5f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
c600: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e           /* When
c610: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 69   ORDER BY term i
c620: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  s this */.  int 
c630: 69 73 43 6f 6d 70 6f 75 6e 64 2c 20 20 20 20 2f  isCompound,    /
c640: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
c650: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
c660: 45 43 54 20 2a 2f 0a 20 20 75 38 20 2a 70 48 61  ECT */.  u8 *pHa
c670: 73 41 67 67 20 20 20 20 20 20 20 20 2f 2a 20 54  sAgg        /* T
c680: 72 75 65 20 69 66 20 65 78 70 72 65 73 73 69 6f  rue if expressio
c690: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65  n contains aggre
c6a0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
c6b0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
c6c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
c6d0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
c6e0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
c6f0: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73    /* The columns
c700: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
c710: 65 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  et */.  NameCont
c720: 65 78 74 20 6e 63 3b 20 20 20 20 2f 2a 20 4e 61  ext nc;    /* Na
c730: 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 72  me context for r
c740: 65 73 6f 6c 76 69 6e 67 20 70 45 20 2a 2f 0a 0a  esolving pE */..
c750: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c760: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
c770: 45 2c 20 26 69 29 3d 3d 30 20 29 3b 0a 20 20 70  E, &i)==0 );.  p
c780: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
c790: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 49  >pEList;..  /* I
c7a0: 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20  f the term is a 
c7b0: 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65  simple identifie
c7c0: 72 20 74 68 61 74 20 74 72 79 20 74 6f 20 6d 61  r that try to ma
c7d0: 74 63 68 20 74 68 61 74 20 69 64 65 6e 74 69 66  tch that identif
c7e0: 69 65 72 0a 20 20 2a 2a 20 61 67 61 69 6e 73 74  ier.  ** against
c7f0: 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69   a column name i
c800: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
c810: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 2d  ..  */.  if( pE-
c820: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 28 70  >op==TK_ID || (p
c830: 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  E->op==TK_STRING
c840: 20 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 5b   && pE->token.z[
c850: 30 5d 21 3d 27 5c 27 27 29 20 29 7b 0a 20 20 20  0]!='\'') ){.   
c860: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c870: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 63  Parse->db;.    c
c880: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69  har *zCol = sqli
c890: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
c8a0: 28 64 62 2c 20 26 70 45 2d 3e 74 6f 6b 65 6e 29  (db, &pE->token)
c8b0: 3b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d  ;.    if( zCol==
c8c0: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
c8d0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
c8e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
c8f0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
c900: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20        char *zAs 
c910: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
c920: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Name;.      if( 
c930: 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65  zAs!=0 && sqlite
c940: 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43  3StrICmp(zAs, zC
c950: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
c960: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
c970: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Col);.        re
c980: 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20  turn i+1;.      
c990: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
c9a0: 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a  te3_free(zCol);.
c9b0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76    }..  /* Resolv
c9c0: 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 74  e all names in t
c9d0: 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
c9e0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2f   expression.  */
c9f0: 0a 20 20 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30  .  memset(&nc, 0
ca00: 2c 20 73 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20  , sizeof(nc));. 
ca10: 20 6e 63 2e 70 50 61 72 73 65 20 3d 20 70 50 61   nc.pParse = pPa
ca20: 72 73 65 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69  rse;.  nc.pSrcLi
ca30: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
ca40: 72 63 3b 0a 20 20 6e 63 2e 70 45 4c 69 73 74 20  rc;.  nc.pEList 
ca50: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 61  = pEList;.  nc.a
ca60: 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 6e  llowAgg = 1;.  n
ca70: 63 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66  c.nErr = 0;.  if
ca80: 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
ca90: 6f 6c 76 65 4e 61 6d 65 73 28 26 6e 63 2c 20 70  olveNames(&nc, p
caa0: 45 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  E) ){.    if( is
cab0: 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20  Compound ){.    
cac0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c    sqlite3ErrorCl
cad0: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
cae0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
caf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
cb00: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
cb10: 20 7d 0a 20 20 69 66 28 20 6e 63 2e 68 61 73 41   }.  if( nc.hasA
cb20: 67 67 20 26 26 20 70 48 61 73 41 67 67 20 29 7b  gg && pHasAgg ){
cb30: 0a 20 20 20 20 2a 70 48 61 73 41 67 67 20 3d 20  .    *pHasAgg = 
cb40: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  1;.  }..  /* For
cb50: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
cb60: 43 54 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 74  CT, we need to t
cb70: 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ry to match the 
cb80: 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 65 78  ORDER BY.  ** ex
cb90: 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73 74  pression against
cba0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
cbb0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
cbc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f  .  */.  if( isCo
cbd0: 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 66 6f  mpound ){.    fo
cbe0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
cbf0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
cc00: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
cc10: 78 70 72 43 6f 6d 70 61 72 65 28 70 45 4c 69 73  xprCompare(pELis
cc20: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  t->a[i].pExpr, p
cc30: 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  E) ){.        re
cc40: 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20  turn i+1;.      
cc50: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
cc60: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
cc70: 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52  * Analyze and OR
cc80: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
cc90: 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 73  BY clause in a s
cca0: 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 73 74 61  imple SELECT sta
ccb0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 52 65 74 75 72  tement..** Retur
ccc0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
ccd0: 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a  errors seen..**.
cce0: 2a 2a 20 45 76 65 72 79 20 74 65 72 6d 20 6f 66  ** Every term of
ccf0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   the ORDER BY or
cd00: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
cd10: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e 0a   needs to be an.
cd20: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ** expression.  
cd30: 49 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  If any expressio
cd40: 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  n is an integer 
cd50: 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 0a 2a  constant, then.*
cd60: 2a 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  * that expressio
cd70: 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  n is replaced by
cd80: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
cd90: 6e 67 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ng .** expressio
cda0: 6e 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  n from the resul
cdb0: 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
cdc0: 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65   int processOrde
cdd0: 72 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72 73  rGroupBy(.  Pars
cde0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
cdf0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
ce00: 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72  text.  Leave err
ce10: 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65  or messages here
ce20: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
ce30: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54  elect,      /* T
ce40: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
ce50: 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ent containing t
ce60: 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  he clause */.  E
ce70: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
ce80: 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y,   /* The ORDE
ce90: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
cea0: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72   clause to be pr
ceb0: 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ocessed */.  int
cec0: 20 69 73 4f 72 64 65 72 2c 20 20 20 20 20 20 20   isOrder,       
ced0: 20 20 20 2f 2a 20 31 20 66 6f 72 20 4f 52 44 45     /* 1 for ORDE
cee0: 52 20 42 59 2e 20 20 30 20 66 6f 72 20 47 52 4f  R BY.  0 for GRO
cef0: 55 50 20 42 59 20 2a 2f 0a 20 20 75 38 20 2a 70  UP BY */.  u8 *p
cf00: 48 61 73 41 67 67 20 20 20 20 20 20 20 20 20 20  HasAgg          
cf10: 20 2f 2a 20 53 65 74 20 74 6f 20 54 52 55 45 20   /* Set to TRUE 
cf20: 69 66 20 61 6e 79 20 74 65 72 6d 20 63 6f 6e 74  if any term cont
cf30: 61 69 6e 73 20 61 6e 20 61 67 67 72 65 67 61 74  ains an aggregat
cf40: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
cf50: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
cf60: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
cf70: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
cf80: 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ..  if( pOrderBy
cf90: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ==0 || pParse->d
cfa0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
cfb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66 20  ) return 0;.#if 
cfc0: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
cfd0: 4e 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  N.  if( pOrderBy
cfe0: 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d  ->nExpr>db->aLim
cff0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
d000: 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 63  COLUMN] ){.    c
d010: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
d020: 20 3d 20 69 73 4f 72 64 65 72 20 3f 20 22 4f 52   = isOrder ? "OR
d030: 44 45 52 22 20 3a 20 22 47 52 4f 55 50 22 3b 0a  DER" : "GROUP";.
d040: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d050: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
d060: 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 25   many terms in %
d070: 73 20 42 59 20 63 6c 61 75 73 65 22 2c 20 7a 54  s BY clause", zT
d080: 79 70 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ype);.    return
d090: 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   1;.  }.#endif. 
d0a0: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
d0b0: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  t->pEList;.  if(
d0c0: 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20   pEList==0 ){.  
d0d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d0e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
d0f0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
d100: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  +){.    int iCol
d110: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  ;.    Expr *pE =
d120: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
d130: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73  pExpr;.    if( s
d140: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
d150: 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29  ger(pE, &iCol) )
d160: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  {.      if( iCol
d170: 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
d180: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
d190: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
d1a0: 2a 7a 54 79 70 65 20 3d 20 69 73 4f 72 64 65 72  *zType = isOrder
d1b0: 20 3f 20 22 4f 52 44 45 52 22 20 3a 20 22 47 52   ? "ORDER" : "GR
d1c0: 4f 55 50 22 3b 0a 20 20 20 20 20 20 20 20 73 71  OUP";.        sq
d1d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d1e0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
d1f0: 20 20 22 25 72 20 25 73 20 42 59 20 74 65 72 6d    "%r %s BY term
d200: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20   out of range - 
d210: 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20  should be ".    
d220: 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20         "between 
d230: 31 20 61 6e 64 20 25 64 22 2c 20 69 2b 31 2c 20  1 and %d", i+1, 
d240: 7a 54 79 70 65 2c 20 70 45 4c 69 73 74 2d 3e 6e  zType, pEList->n
d250: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72  Expr);.        r
d260: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
d270: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d280: 20 20 69 43 6f 6c 20 3d 20 6d 61 74 63 68 4f 72    iCol = matchOr
d290: 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c  derByTermToExprL
d2a0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
d2b0: 65 63 74 2c 20 70 45 2c 20 69 2b 31 2c 20 30 2c  ect, pE, i+1, 0,
d2c0: 20 70 48 61 73 41 67 67 29 3b 0a 20 20 20 20 20   pHasAgg);.     
d2d0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
d2e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
d2f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d300: 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b     if( iCol>0 ){
d310: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
d320: 70 43 6f 6c 6c 20 3d 20 70 45 2d 3e 70 43 6f 6c  pColl = pE->pCol
d330: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  l;.      int fla
d340: 67 73 20 3d 20 70 45 2d 3e 66 6c 61 67 73 20 26  gs = pE->flags &
d350: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
d360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d370: 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20  rDelete(pE);.   
d380: 20 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33 45     pE = sqlite3E
d390: 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  xprDup(db, pELis
d3a0: 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78  t->a[iCol-1].pEx
d3b0: 70 72 29 3b 0a 20 20 20 20 20 20 70 4f 72 64 65  pr);.      pOrde
d3c0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  rBy->a[i].pExpr 
d3d0: 3d 20 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20  = pE;.      if( 
d3e0: 70 45 20 26 26 20 70 43 6f 6c 6c 20 26 26 20 66  pE && pColl && f
d3f0: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lags ){.        
d400: 70 45 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c  pE->pColl = pCol
d410: 6c 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 66  l;.        pE->f
d420: 6c 61 67 73 20 7c 3d 20 66 6c 61 67 73 3b 0a 20  lags |= flags;. 
d430: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d440: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
d450: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e  /*.** Analyze an
d460: 64 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  d ORDER BY or GR
d470: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e  OUP BY clause in
d480: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
d490: 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ent.  Return.** 
d4a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
d4b0: 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a  rors seen..**.**
d4c0: 20 49 66 20 69 54 61 62 6c 65 3e 30 20 74 68 65   If iTable>0 the
d4d0: 6e 20 6d 61 6b 65 20 74 68 65 20 4e 2d 74 68 20  n make the N-th 
d4e0: 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45  term of the ORDE
d4f0: 52 20 42 59 20 63 6c 61 75 73 65 20 72 65 66 65  R BY clause refe
d500: 72 20 74 6f 0a 2a 2a 20 74 68 65 20 4e 2d 74 68  r to.** the N-th
d510: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
d520: 20 69 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49   iTable..**.** I
d530: 66 20 69 54 61 62 6c 65 3d 3d 30 20 74 68 65 6e  f iTable==0 then
d540: 20 74 72 61 6e 73 66 6f 72 6d 20 65 61 63 68 20   transform each 
d550: 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45  term of the ORDE
d560: 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 72  R BY clause to r
d570: 65 66 65 72 0a 2a 2a 20 74 6f 20 61 20 63 6f 6c  efer.** to a col
d580: 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  umn of the resul
d590: 74 20 73 65 74 20 62 79 20 6e 75 6d 62 65 72 2e  t set by number.
d5a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
d5b0: 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72  rocessCompoundOr
d5c0: 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
d5d0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
d5e0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
d5f0: 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72 20  t.  Leave error 
d600: 6d 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f  messages here */
d610: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
d620: 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ct,      /* The 
d630: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d640: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
d650: 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 69 6e  ORDER BY */.  in
d660: 74 20 69 54 61 62 6c 65 20 20 20 20 20 20 20 20  t iTable        
d670: 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 61      /* Output ta
d680: 62 6c 65 20 66 6f 72 20 63 6f 6d 70 6f 75 6e 64  ble for compound
d690: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
d6a0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
d6b0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
d6c0: 72 64 65 72 42 79 3b 0a 20 20 45 78 70 72 4c 69  rderBy;.  ExprLi
d6d0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71  st *pEList;.  sq
d6e0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
d6f0: 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 0a   moreToDo = 1;..
d700: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 53 65    pOrderBy = pSe
d710: 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  lect->pOrderBy;.
d720: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
d730: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
d740: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d750: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
d760: 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72  COLUMN.  if( pOr
d770: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d  derBy->nExpr>db-
d780: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
d790: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
d7a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d7b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
d7c0: 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 4f   many terms in O
d7d0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 22 29  RDER BY clause")
d7e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
d7f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72    }.#endif.  for
d800: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
d810: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
d820: 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
d830: 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ].done = 0;.  }.
d840: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
d850: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
d860: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
d870: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20  t->pPrior;.  }. 
d880: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 20   while( pSelect 
d890: 26 26 20 6d 6f 72 65 54 6f 44 6f 20 29 7b 0a 20  && moreToDo ){. 
d8a0: 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 30 3b     moreToDo = 0;
d8b0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 53  .    pEList = pS
d8c0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
d8d0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30     if( pEList==0
d8e0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
d8f0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   1;.    }.    fo
d900: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
d910: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
d920: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
d930: 20 2d 31 3b 0a 20 20 20 20 20 20 45 78 70 72 20   -1;.      Expr 
d940: 2a 70 45 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20  *pE, *pDup;.    
d950: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
d960: 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74  a[i].done ) cont
d970: 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d  inue;.      pE =
d980: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
d990: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
d9a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
d9b0: 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
d9c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
d9d0: 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3e 70  iCol<0 || iCol>p
d9e0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
d9f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
da00: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
da10: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
da20: 22 25 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  "%r ORDER BY ter
da30: 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d  m out of range -
da40: 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
da50: 20 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65            "betwe
da60: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2b  en 1 and %d", i+
da70: 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  1, pEList->nExpr
da80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
da90: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
daa0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
dab0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
dac0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
dad0: 70 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pE);.        if(
dae0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
daf0: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
db00: 61 73 73 65 72 74 28 70 44 75 70 29 3b 0a 20 20  assert(pDup);.  
db10: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6d          iCol = m
db20: 61 74 63 68 4f 72 64 65 72 42 79 54 65 72 6d 54  atchOrderByTermT
db30: 6f 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  oExprList(pParse
db40: 2c 20 70 53 65 6c 65 63 74 2c 20 70 44 75 70 2c  , pSelect, pDup,
db50: 20 69 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20 20   i+1, 1, 0);.   
db60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
db70: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
db80: 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20  (pDup);.        
db90: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
dba0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
dbb0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dbc0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
dbd0: 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol>0 ){.        
dbe0: 69 66 28 20 69 54 61 62 6c 65 20 29 7b 0a 20 20  if( iTable ){.  
dbf0: 20 20 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d          pE->op =
dc00: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
dc10: 20 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65        pE->iTable
dc20: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 20   = iTable;.     
dc30: 20 20 20 20 20 70 45 2d 3e 69 41 67 67 20 3d 20       pE->iAgg = 
dc40: 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45  -1;.          pE
dc50: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
dc60: 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45  -1;.          pE
dc70: 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
dc80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dc90: 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b       pE->op = TK
dca0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
dcb0: 20 20 20 20 70 45 2d 3e 66 6c 61 67 73 20 7c 3d      pE->flags |=
dcc0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
dcd0: 20 20 20 20 20 20 20 20 70 45 2d 3e 69 54 61 62          pE->iTab
dce0: 6c 65 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  le = iCol;.     
dcf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4f 72     }.        pOr
dd00: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
dd10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
dd20: 65 7b 0a 20 20 20 20 20 20 20 20 6d 6f 72 65 54  e{.        moreT
dd30: 6f 44 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  oDo = 1;.      }
dd40: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 65 6c 65  .    }.    pSele
dd50: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4e  ct = pSelect->pN
dd60: 65 78 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ext;.  }.  for(i
dd70: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
dd80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
dd90: 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61   if( pOrderBy->a
dda0: 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20 29 7b 0a 20  [i].done==0 ){. 
ddb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
ddc0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 72  rMsg(pParse, "%r
ddd0: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 64   ORDER BY term d
dde0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
ddf0: 79 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  y ".            
de00: 22 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72  "column in the r
de10: 65 73 75 6c 74 20 73 65 74 22 2c 20 69 2b 31 29  esult set", i+1)
de20: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
de30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
de40: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
de50: 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20   Get a VDBE for 
de60: 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72  the given parser
de70: 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74   context.  Creat
de80: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
de90: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20  ecessary..** If 
dea0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
deb0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
dec0: 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65   leave a message
ded0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56   in pParse..*/.V
dee0: 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56  dbe *sqlite3GetV
def0: 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
df00: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
df10: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
df20: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
df30: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
df40: 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  be = sqlite3Vdbe
df50: 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64  Create(pParse->d
df60: 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b);.#ifndef SQLI
df70: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20  TE_OMIT_TRACE.  
df80: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20    if( v ){.     
df90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dfa0: 70 30 28 76 2c 20 4f 50 5f 54 72 61 63 65 29 3b  p0(v, OP_Trace);
dfb0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
dfc0: 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a  }.  return v;.}.
dfd0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
dfe0: 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
dff0: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
e000: 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
e010: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d  d on the.** pLim
e020: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65  it and pOffset e
e030: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69  xpressions.  pLi
e040: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
e050: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
e060: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70  ions.** that app
e070: 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ear in the origi
e080: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
e090: 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49  t after the LIMI
e0a0: 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20  T and OFFSET.** 
e0b0: 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55  keywords.  Or NU
e0c0: 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77  LL if those keyw
e0d0: 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ords are omitted
e0e0: 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  . iLimit and iOf
e0f0: 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65  fset .** are the
e100: 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
e110: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
e120: 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73   for counters us
e130: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a  ed to compute .*
e140: 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  * the limit and 
e150: 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
e160: 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e  e is no limit an
e170: 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
e180: 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  n .** iLimit and
e190: 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
e1a0: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
e1b0: 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
e1c0: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
e1d0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
e1e0: 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
e1f0: 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
e200: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c  is defined by pL
e210: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
e220: 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a  .  iLimit and.**
e230: 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
e240: 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
e250: 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
e260: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a  default values.*
e270: 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e  * (usually but n
e280: 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72  ot always -1) pr
e290: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
e2a0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20  his routine..** 
e2b0: 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d  Only if pLimit!=
e2c0: 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20  0 or pOffset!=0 
e2d0: 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
e2e0: 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
e2f0: 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
e300: 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
e310: 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
e320: 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
e330: 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
e340: 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
e350: 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
e360: 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
e370: 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
e380: 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
e390: 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
e3a0: 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
e3b0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
e3c0: 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b  t *p, int iBreak
e3d0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30  ){.  Vdbe *v = 0
e3e0: 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d  ;.  int iLimit =
e3f0: 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   0;.  int iOffse
e400: 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a  t;.  int addr1;.
e410: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
e420: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
e430: 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22  .  ** "LIMIT -1"
e440: 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c   always shows al
e450: 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69  l rows.  There i
e460: 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74  s some.  ** cont
e470: 72 61 76 65 72 73 79 20 61 62 6f 75 74 20 77 68  raversy about wh
e480: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
e490: 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62  ehavior should b
e4a0: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  e..  ** The curr
e4b0: 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
e4c0: 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c  on interprets "L
e4d0: 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a  IMIT 0" to mean.
e4e0: 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20    ** no rows..  
e4f0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  */.  if( p->pLim
e500: 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69  it ){.    p->iLi
e510: 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b  mit = iLimit = +
e520: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
e530: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
e540: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
e550: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
e560: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
e570: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
e580: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69  , p->pLimit, iLi
e590: 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mit);.    sqlite
e5a0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
e5b0: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69  P_MustBeInt, iLi
e5c0: 6d 69 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  mit);.    VdbeCo
e5d0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
e5e0: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
e5f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e600: 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p2(v, OP_IfZero,
e610: 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
e620: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
e630: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70 2d  Offset ){.    p-
e640: 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
e650: 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
e660: 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  Mem;.    if( p->
e670: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
e680: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
e690: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
e6a0: 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
e6b0: 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
e6c0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 76 20   */.    }.    v 
e6d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
e6e0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
e6f0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
e700: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
e710: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
e720: 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  pOffset, iOffset
e730: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e740: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
e750: 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65  ustBeInt, iOffse
e760: 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  t);.    VdbeComm
e770: 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20  ent((v, "OFFSET 
e780: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
e790: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
e7a0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
e7b0: 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b  IfPos, iOffset);
e7c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e7d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
e7e0: 65 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74  eger, 0, iOffset
e7f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e800: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
e810: 64 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr1);.    if( p-
e820: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
e830: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e840: 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c  p3(v, OP_Add, iL
e850: 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69  imit, iOffset, i
e860: 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20  Offset+1);.     
e870: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
e880: 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29   "LIMIT+OFFSET")
e890: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
e8a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e8b0: 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
e8c0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73  iLimit);.      s
e8d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e8e0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
e8f0: 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a  -1, iOffset+1);.
e900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e910: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
e920: 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  r1);.    }.  }.}
e930: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
e940: 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
e950: 20 74 6f 20 75 73 65 20 66 6f 72 20 73 6f 72 74   to use for sort
e960: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
e970: 6f 69 64 20 63 72 65 61 74 65 53 6f 72 74 69 6e  oid createSortin
e980: 67 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  gIndex(Parse *pP
e990: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
e9a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
e9b0: 72 42 79 29 7b 0a 20 20 69 66 28 20 70 4f 72 64  rBy){.  if( pOrd
e9c0: 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  erBy ){.    int 
e9d0: 61 64 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74  addr;.    assert
e9e0: 28 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  ( pOrderBy->iECu
e9f0: 72 73 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70  rsor==0 );.    p
ea00: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
ea10: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
ea20: 2b 2b 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  ++;.    addr = s
ea30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ea40: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
ea50: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
ea60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
ea80: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
ea90: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
eaa0: 72 2b 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r+1);.    assert
eab0: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
eac0: 6d 5b 32 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[2] == -1 );.  
ead0: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
eae0: 6d 5b 32 5d 20 3d 20 61 64 64 72 3b 0a 20 20 7d  m[2] = addr;.  }
eaf0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
eb00: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
eb10: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
eb20: 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
eb30: 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
eb40: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
eb50: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
eb60: 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
eb70: 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
eb80: 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
eb90: 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
eba0: 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
ebb0: 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
ebc0: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
ebd0: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
ebe0: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
ebf0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
ec00: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
ec10: 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
ec20: 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
ec30: 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
ec40: 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
ec50: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
ec60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
ec70: 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
ec80: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
ec90: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
eca0: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
ecb0: 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
ecc0: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
ecd0: 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
ece0: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
ecf0: 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
ed00: 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
ed10: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
ed20: 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d 3d    }.  if( pRet==
ed30: 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  0 ){.    pRet = 
ed40: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
ed50: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  eq(pParse, p->pE
ed60: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
ed70: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
ed80: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn pRet;.}.#endi
ed90: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
eda0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
edb0: 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
edc0: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
edd0: 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
ede0: 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
edf0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ee00: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
ee10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
ee20: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
ee30: 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
ee40: 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
ee50: 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
ee60: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
ee70: 74 2c 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t,    /* What to
ee80: 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
ee90: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 63 68 61 72  esults */.  char
eea0: 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20   *aff           
eeb0: 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73    /* If eDest is
eec0: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20   SRT_Union, the 
eed0: 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
eee0: 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20  */.);...#ifndef 
eef0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
ef00: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
ef10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
ef20: 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
ef30: 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71  ess a compound q
ef40: 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a  uery form from.*
ef50: 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  * two or more se
ef60: 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75  parate queries u
ef70: 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f  sing UNION, UNIO
ef80: 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f  N ALL, EXCEPT, o
ef90: 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a  r.** INTERSECT.*
efa0: 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
efb0: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
efc0: 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
efd0: 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
efe0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
eff0: 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
f000: 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
f010: 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
f020: 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
f030: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
f040: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
f050: 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
f060: 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
f070: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
f080: 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
f090: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
f0a0: 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
f0b0: 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
f0c0: 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
f0d0: 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
f0e0: 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
f0f0: 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
f100: 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
f110: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
f120: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
f130: 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
f140: 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
f150: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
f160: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
f170: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
f180: 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
f190: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
f1a0: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
f1b0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
f1c0: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
f1d0: 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
f1e0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
f200: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
f210: 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
f220: 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
f230: 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
f240: 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
f250: 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
f260: 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
f270: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
f280: 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
f290: 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
f2a0: 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
f2b0: 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
f2c0: 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
f2d0: 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
f2e0: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
f2f0: 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
f300: 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
f310: 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
f320: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
f330: 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
f340: 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
f350: 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
f360: 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
f370: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
f380: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
f390: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
f3a0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
f3b0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f3d0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
f3e0: 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
f3f0: 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
f400: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
f410: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
f420: 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
f430: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20   */.  char *aff 
f440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
f450: 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55  f eDest is SRT_U
f460: 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69  nion, the affini
f470: 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
f480: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f490: 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65  E_OK;   /* Succe
f4a0: 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73  ss code from a s
f4b0: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53  ubroutine */.  S
f4c0: 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
f4d0: 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
f4e0: 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
f4f0: 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
f500: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
f510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
f520: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
f530: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
f540: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
f550: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f560: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
f570: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45  esult set */.  E
f580: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
f590: 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y;   /* The ORDE
f5a0: 52 20 42 59 20 63 6c 61 75 73 65 20 6f 6e 20 70  R BY clause on p
f5b0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 65 74 50 32   */.  int aSetP2
f5c0: 5b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  [2];        /* S
f5d0: 65 74 20 50 32 20 76 61 6c 75 65 20 6f 66 20 74  et P2 value of t
f5e0: 68 65 73 65 20 6f 70 20 74 6f 20 6e 75 6d 62 65  hese op to numbe
f5f0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  r of columns */.
f600: 20 20 69 6e 74 20 6e 53 65 74 50 32 20 3d 20 30    int nSetP2 = 0
f610: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
f620: 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 53  r of slots in aS
f630: 65 74 50 32 5b 5d 20 75 73 65 64 20 2a 2f 0a 20  etP2[] used */. 
f640: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
f650: 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  ;      /* Altern
f660: 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69  ative data desti
f670: 6e 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nation */..  /* 
f680: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
f690: 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f  is no ORDER BY o
f6a0: 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  r LIMIT clause o
f6b0: 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e  n prior SELECTs.
f6c0: 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20    Only.  ** the 
f6d0: 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74  last (right-most
f6e0: 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20  ) SELECT in the 
f6f0: 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20  series may have 
f700: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  an ORDER BY or L
f710: 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  IMIT..  */.  if(
f720: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69   p==0 || p->pPri
f730: 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  or==0 ){.    rc 
f740: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
f750: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
f760: 20 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20 70    }.  pPrior = p
f770: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
f780: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
f790: 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29  htmost!=pPrior )
f7a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
f7b0: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d  or->pRightmost==
f7c0: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b  p->pRightmost );
f7d0: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
f7e0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
f7f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f800: 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20  Parse,"ORDER BY 
f810: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
f820: 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
f830: 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
f840: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
f850: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
f860: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
f870: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
f880: 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
f890: 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
f8a0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
f8b0: 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65  se,"LIMIT clause
f8c0: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
f8d0: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
f8e0: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
f8f0: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
f900: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
f910: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
f920: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
f930: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
f940: 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79 20  e a valid query 
f950: 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c  engine.  If not,
f960: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
f970: 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
f980: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
f990: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
f9a0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
f9b0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f9c0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
f9d0: 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
f9e0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70  destination temp
f9f0: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e  orary table if n
fa00: 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20  ecessary.  */.  
fa10: 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20  dest = *pDest;. 
fa20: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
fa30: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
fa40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
fa50: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71  pEList );.    sq
fa60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fa70: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
fa80: 72 61 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c  ral, dest.iParm,
fa90: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
faa0: 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  r);.    dest.eDe
fab0: 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
fac0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
fad0: 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
fae0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
faf0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
fb00: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
fb10: 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
fb20: 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
fb30: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
fb40: 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
fb50: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
fb60: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
fb70: 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
fb80: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
fb90: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
fba0: 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
fbb0: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
fbc0: 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
fbd0: 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
fbe0: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
fbf0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
fc00: 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
fc10: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
fc20: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
fc30: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
fc40: 64 3b 0a 20 20 7d 0a 0a 23 69 66 20 31 0a 20 20  d;.  }..#if 1.  
fc50: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
fc60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75  ){.    return mu
fc70: 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
fc80: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
fc90: 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 23 65 6e  t, aff);.  }.#en
fca0: 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
fcb0: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
fcc0: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
fcd0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
fce0: 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42  ..  */.  pOrderB
fcf0: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
fd00: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
fd10: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
fd20: 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ALL: {.      if(
fd30: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
fd40: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
fd50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73   = 0;.        as
fd60: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
fd70: 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 20  Limit );.       
fd80: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
fd90: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
fda0: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66       pPrior->pOf
fdb0: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
fdc0: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
fdd0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
fde0: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
fdf0: 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  est, 0, 0, 0, af
fe00: 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  f);.        p->p
fe10: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
fe20: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
fe30: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  0;.        if( r
fe40: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
fe50: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
fe60: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
fe70: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
fe80: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  r = 0;.        p
fe90: 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
fea0: 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
feb0: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
fec0: 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
fed0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
fee0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
fef0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
ff00: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
ff10: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
ff20: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 20  imit);.         
ff30: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
ff40: 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20   "Jump ahead if 
ff50: 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29  LIMIT reached"))
ff60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ff70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ff80: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
ff90: 2c 20 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30  , &dest, 0, 0, 0
ffa0: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  , aff);.        
ffb0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
ffc0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
ffd0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
ffe0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
fff0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
10000 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
10010 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
10020 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10030 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
10040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
10050 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
10060 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e      /* For UNION
10070 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42   ALL ... ORDER B
10080 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  Y fall through t
10090 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20  o the next case 
100a0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
100b0 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
100c0 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
100d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
100e0 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
100f0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
10100 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10110 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
10120 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  */.      int op 
10130 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65  = 0;      /* One
10140 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
10150 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
10160 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
10170 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
10180 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
10190 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
101a0 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
101b0 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
101c0 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
101d0 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
101e0 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
101f0 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
10200 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
10210 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
10220 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a  est uniondest;..
10230 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
10240 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20  p->op==TK_ALL ? 
10250 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f  SRT_Table : SRT_
10260 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  Union;.      if(
10270 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69   dest.eDest==pri
10280 6f 72 4f 70 20 26 26 20 70 4f 72 64 65 72 42 79  orOp && pOrderBy
10290 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69  ==0 && !p->pLimi
102a0 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74  t && !p->pOffset
102b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
102c0 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
102d0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
102e0 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
102f0 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
10300 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
10310 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
10320 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
10330 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  iParm;.      }el
10340 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
10350 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
10360 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
10370 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
10380 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
10390 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
103a0 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
103b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
103c0 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
103d0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
103e0 20 69 66 28 20 70 72 6f 63 65 73 73 43 6f 6d 70   if( processComp
103f0 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50 61 72  oundOrderBy(pPar
10400 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62 29  se, p, unionTab)
10410 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
10420 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
10430 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
10440 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
10450 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
10460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10470 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
10480 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  meral, unionTab,
10490 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
104a0 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54 5f 54 61   priorOp==SRT_Ta
104b0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ble ){.         
104c0 20 61 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c   assert( nSetP2<
104d0 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73  sizeof(aSetP2)/s
104e0 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29  izeof(aSetP2[0])
104f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 53   );.          aS
10500 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d  etP2[nSetP2++] =
10510 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 7d   addr;.        }
10520 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10530 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
10540 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
10550 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   );.          p-
10560 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
10570 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
10580 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
10590 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 31 3b 0a  ->usesEphm = 1;.
105a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
105b0 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49    createSortingI
105c0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20  ndex(pParse, p, 
105d0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
105e0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
105f0 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
10600 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
10610 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
10620 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
10630 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10640 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
10650 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
10660 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
10670 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64  DestInit(&uniond
10680 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  est, priorOp, un
10690 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 72  ionTab);.      r
106a0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
106b0 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
106c0 2c 20 26 75 6e 69 6f 6e 64 65 73 74 2c 20 30 2c  , &uniondest, 0,
106d0 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
106e0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
106f0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
10700 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
10710 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
10720 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
10730 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
10740 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
10750 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
10760 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
10770 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53  _EXCEPT:  op = S
10780 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65  RT_Except;   bre
10790 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
107a0 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70  e TK_UNION:   op
107b0 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20   = SRT_Union;   
107c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
107d0 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
107e0 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65    op = SRT_Table
107f0 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
10800 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
10810 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
10820 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
10830 20 20 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f        p->disallo
10840 77 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  wOrderBy = pOrde
10850 72 42 79 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c  rBy!=0;.      pL
10860 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
10870 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
10880 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
10890 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
108a0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
108b0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  set = 0;.      u
108c0 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
108d0 20 6f 70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   op;.      rc = 
108e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
108f0 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
10900 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  est, 0, 0, 0, af
10910 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65  f);.      /* Que
10920 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
10930 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
10940 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
10950 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
10960 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
10970 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
10980 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
10990 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
109a0 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73  leak. */.      s
109b0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
109c0 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79  lete(p->pOrderBy
109d0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
109e0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
109f0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
10a00 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20   pOrderBy;.     
10a10 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
10a20 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
10a30 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
10a40 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
10a50 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
10a60 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  set;.      p->iL
10a70 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
10a80 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
10a90 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
10aa0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
10ab0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
10ac0 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f       }...      /
10ad0 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61  * Convert the da
10ae0 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ta in the tempor
10af0 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  ary table into w
10b00 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20  hatever form.   
10b10 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74     ** it is that
10b20 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65   we currently ne
10b30 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20  ed..      */    
10b40 20 20 0a 20 20 20 20 20 20 69 66 28 20 64 65 73    .      if( des
10b50 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
10b60 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 64 65   || unionTab!=de
10b70 73 74 2e 69 50 61 72 6d 20 29 7b 0a 20 20 20 20  st.iParm ){.    
10b80 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
10b90 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
10ba0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
10bb0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
10bc0 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
10bd0 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
10be0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65   ){.          Se
10bf0 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
10c00 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
10c10 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
10c20 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
10c30 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
10c40 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
10c50 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
10c60 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
10c70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
10c80 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
10c90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
10ca0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
10cb0 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
10cc0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
10cd0 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
10ce0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
10cf0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
10d00 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
10d10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10d20 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
10d30 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
10d40 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
10d50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
10d60 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
10d70 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
10d80 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
10d90 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e  p->pEList, union
10da0 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Tab, p->pEList->
10db0 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10dd0 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 26 64 65  OrderBy, -1, &de
10de0 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
10df0 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  k, 0);.        s
10e00 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
10e10 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
10e20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10e30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10e40 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
10e50 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
10e60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
10e70 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
10e80 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
10e90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10ea0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e  (v, OP_Close, un
10eb0 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
10ec0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
10ed0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10ee0 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a  TK_INTERSECT: {.
10ef0 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20        int tab1, 
10f00 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20  tab2;.      int 
10f10 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
10f20 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70  Start;.      Exp
10f30 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
10f40 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  set;.      int a
10f50 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  ddr;.      Selec
10f60 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74 64  tDest intersectd
10f70 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  est;.      int r
10f80 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54  1;..      /* INT
10f90 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72  ERSECT is differ
10fa0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ent from the oth
10fb0 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71  ers since it req
10fc0 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  uires.      ** t
10fd0 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wo temporary tab
10fe0 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68  les.  Hence it h
10ff0 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e  as its own case.
11000 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a    Begin.      **
11010 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74   by allocating t
11020 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c  he tables we wil
11030 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  l need..      */
11040 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50  .      tab1 = pP
11050 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
11060 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73      tab2 = pPars
11070 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
11080 20 69 66 28 20 70 72 6f 63 65 73 73 43 6f 6d 70   if( processComp
11090 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50 61 72  oundOrderBy(pPar
110a0 73 65 2c 20 70 2c 20 74 61 62 31 29 20 29 7b 0a  se, p, tab1) ){.
110b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
110c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
110d0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
110e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 72 65       }.      cre
110f0 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28  ateSortingIndex(
11100 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65  pParse, p, pOrde
11110 72 42 79 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  rBy);..      add
11120 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
11130 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
11140 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
11150 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
11160 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
11170 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
11180 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
11190 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
111a0 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
111b0 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20  ost->usesEphm = 
111c0 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
111d0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
111e0 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
111f0 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
11200 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
11210 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
11220 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11230 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
11240 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
11250 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
11260 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 72  , tab1);.      r
11270 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
11280 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
11290 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
112a0 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
112b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
112c0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
112d0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
112e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
112f0 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
11300 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
11310 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
11320 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
11330 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
11340 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11350 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
11360 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
11370 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
11380 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
11390 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
113a0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
113b0 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
113c0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
113d0 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
113e0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
113f0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
11400 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
11410 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
11420 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
11430 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
11440 74 2e 69 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a  t.iParm = tab2;.
11450 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11460 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
11470 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65   p, &intersectde
11480 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  st, 0, 0, 0, aff
11490 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
114a0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
114b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
114c0 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b  lete(p->pLimit);
114d0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
114e0 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
114f0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
11500 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28  ffset;.      if(
11510 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
11520 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
11530 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
11540 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
11550 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
11560 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
11570 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
11580 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
11590 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
115a0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
115b0 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
115c0 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
115d0 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
115e0 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
115f0 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
11600 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
11610 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
11620 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
11630 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65  or;.        gene
11640 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
11650 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
11660 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  t->pEList);.    
11670 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b    }.      iBreak
11680 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
11690 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
116a0 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
116b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
116c0 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65  );.      compute
116d0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
116e0 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
116f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11700 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11710 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
11720 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 72 31  Break);.      r1
11730 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
11740 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
11750 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
11760 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11770 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62  , OP_RowKey, tab
11780 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  1, r1);.      sq
11790 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
117a0 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
117b0 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 29  tab2, iCont, r1)
117c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
117d0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
117e0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
117f0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
11800 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
11810 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e  EList, tab1, p->
11820 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
11830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11840 20 20 20 20 20 70 4f 72 64 65 72 42 79 2c 20 2d       pOrderBy, -
11850 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  1, &dest, iCont,
11860 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20   iBreak, 0);.   
11870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
11880 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
11890 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
118a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
118b0 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20   OP_Next, tab1, 
118c0 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73  iStart);.      s
118d0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
118e0 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
118f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11900 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11910 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
11920 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11930 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11940 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b  Close, tab1, 0);
11950 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11960 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65    }.  }..  /* Se
11970 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
11980 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 65 6d 70 6f  columns in tempo
11990 72 61 72 79 20 74 61 62 6c 65 73 0a 20 20 2a 2f  rary tables.  */
119a0 0a 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  .  nCol = p->pEL
119b0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 77 68  ist->nExpr;.  wh
119c0 69 6c 65 28 20 6e 53 65 74 50 32 20 29 7b 0a 20  ile( nSetP2 ){. 
119d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
119e0 61 6e 67 65 50 32 28 76 2c 20 61 53 65 74 50 32  angeP2(v, aSetP2
119f0 5b 2d 2d 6e 53 65 74 50 32 5d 2c 20 6e 43 6f 6c  [--nSetP2], nCol
11a00 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
11a10 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  pute collating s
11a20 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79  equences used by
11a30 20 65 69 74 68 65 72 20 74 68 65 20 4f 52 44 45   either the ORDE
11a40 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 20  R BY clause or. 
11a50 20 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d 70 6f   ** by any tempo
11a60 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64  rary tables need
11a70 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
11a80 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
11a90 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68  ect..  ** Attach
11aa0 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
11ab0 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65  ucture to all te
11ac0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
11ad0 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a   Invoke the.  **
11ae0 20 4f 52 44 45 52 20 42 59 20 70 72 6f 63 65 73   ORDER BY proces
11af0 73 69 6e 67 20 69 66 20 74 68 65 72 65 20 69 73  sing if there is
11b00 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
11b10 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  use..  **.  ** T
11b20 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72  his section is r
11b30 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d  un by the right-
11b40 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
11b50 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a  ement only..  **
11b60 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11b70 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  ts to the left a
11b80 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20  lways skip this 
11b90 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74  part.  The right
11ba0 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43  -most.  ** SELEC
11bb0 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69  T might also ski
11bc0 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69  p this part if i
11bd0 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42  t has no ORDER B
11be0 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a  Y clause and.  *
11bf0 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73  * no temp tables
11c00 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20   are required.. 
11c10 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
11c20 42 79 20 7c 7c 20 70 2d 3e 75 73 65 73 45 70 68  By || p->usesEph
11c30 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  m ){.    int i; 
11c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c50 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
11c60 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65  ounter */.    Ke
11c70 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
11c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
11c90 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
11ca0 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  e for the result
11cb0 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65   set */.    Sele
11cc0 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  ct *pLoop;      
11cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
11ce0 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
11cf0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11d00 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b  ts */.    int nK
11d10 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
11d20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11d30 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
11d40 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pKeyInfo->aCol[]
11d50 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
11d60 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  **apColl;       
11d70 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
11d80 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65  ping through pKe
11d90 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
11da0 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a  /.    CollSeq **
11db0 61 43 6f 70 79 3b 20 20 20 20 20 20 20 20 20 20  aCopy;          
11dc0 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
11dd0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
11de0 5b 5d 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  [] */..    asser
11df0 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t( p->pRightmost
11e00 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 4b 65 79 43  ==p );.    nKeyC
11e10 6f 6c 20 3d 20 6e 43 6f 6c 20 2b 20 28 70 4f 72  ol = nCol + (pOr
11e20 64 65 72 42 79 20 3f 20 70 4f 72 64 65 72 42 79  derBy ? pOrderBy
11e30 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
11e40 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
11e50 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
11e60 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79      sizeof(*pKey
11e90 49 6e 66 6f 29 2b 6e 4b 65 79 43 6f 6c 2a 28 73  Info)+nKeyCol*(s
11ea0 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20  izeof(CollSeq*) 
11eb0 2b 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 21  + 1));.    if( !
11ec0 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
11ed0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
11ee0 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
11ef0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
11f00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65  ;.    }..    pKe
11f10 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43  yInfo->enc = ENC
11f20 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
11f30 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65    pKeyInfo->nFie
11f40 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20  ld = nCol;..    
11f50 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d  for(i=0, apColl=
11f60 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b  pKeyInfo->aColl;
11f70 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70   i<nCol; i++, ap
11f80 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  Coll++){.      *
11f90 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65  apColl = multiSe
11fa0 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
11fb0 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
11fc0 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20   if( 0==*apColl 
11fd0 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f  ){.        *apCo
11fe0 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
11ff0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
12000 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
12010 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f  or(pLoop=p; pLoo
12020 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
12030 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66  pPrior){.      f
12040 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b  or(i=0; i<2; i++
12050 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
12060 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64  ddr = pLoop->add
12070 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20  rOpenEphm[i];.  
12080 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30        if( addr<0
12090 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
120a0 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65   If [0] is unuse
120b0 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c  d then [1] is al
120c0 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77  so unused.  So w
120d0 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20  e can.          
120e0 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79  ** always safely
120f0 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61   abort as soon a
12100 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73  s the first unus
12110 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64  ed slot is found
12120 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
12130 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64  sert( pLoop->add
12140 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29  rOpenEphm[1]<0 )
12150 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
12160 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
12170 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12180 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
12190 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
121a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
121b0 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63  geP4(v, addr, (c
121c0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
121d0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
121e0 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f      pLoop->addrO
121f0 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b  penEphm[i] = -1;
12200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
12210 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
12220 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
12230 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
12240 70 4f 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42  pOTerm = pOrderB
12250 79 2d 3e 61 3b 0a 20 20 20 20 20 20 69 6e 74 20  y->a;.      int 
12260 6e 4f 72 64 65 72 42 79 45 78 70 72 20 3d 20 70  nOrderByExpr = p
12270 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
12280 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
12290 20 20 20 20 20 20 75 38 20 2a 70 53 6f 72 74 4f        u8 *pSortO
122a0 72 64 65 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rder;..      /* 
122b0 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 70  Reuse the same p
122c0 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 20  KeyInfo for the 
122d0 4f 52 44 45 52 20 42 59 20 61 73 20 77 61 73 20  ORDER BY as was 
122e0 75 73 65 64 20 61 62 6f 76 65 20 66 6f 72 0a 20  used above for. 
122f0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70       ** the comp
12300 6f 75 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74  ound select stat
12310 65 6d 65 6e 74 73 2e 20 20 45 78 63 65 70 74 20  ements.  Except 
12320 77 65 20 68 61 76 65 20 74 6f 20 63 68 61 6e 67  we have to chang
12330 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
12340 2a 2a 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ** pKeyInfo->aCo
12350 6c 6c 5b 5d 20 76 61 6c 75 65 73 2e 20 20 53 6f  ll[] values.  So
12360 6d 65 20 6f 66 20 74 68 65 20 61 43 6f 6c 6c 5b  me of the aColl[
12370 5d 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 62 65  ] values will be
12380 0a 20 20 20 20 20 20 2a 2a 20 72 65 75 73 65 64  .      ** reused
12390 20 77 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 69   when constructi
123a0 6e 67 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 20  ng the pKeyInfo 
123b0 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  for the ORDER BY
123c0 2c 20 73 6f 20 6d 61 6b 65 0a 20 20 20 20 20 20  , so make.      
123d0 2a 2a 20 61 20 63 6f 70 79 2e 20 20 53 75 66 66  ** a copy.  Suff
123e0 69 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20  icient space to 
123f0 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 20 6e 43  hold both the nC
12400 6f 6c 20 65 6e 74 72 69 65 73 20 66 6f 72 0a 20  ol entries for. 
12410 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70       ** the comp
12420 6f 75 6e 64 20 73 65 6c 65 63 74 20 61 6e 64 20  ound select and 
12430 74 68 65 20 6e 4f 72 64 65 72 62 79 45 78 70 72  the nOrderbyExpr
12440 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
12450 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20 20   ORDER BY.      
12460 2a 2a 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  ** was allocated
12470 20 61 62 6f 76 65 2e 20 20 42 75 74 20 77 65 20   above.  But we 
12480 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 74 68 65  need to move the
12490 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
124a0 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 69 65  .      ** entrie
124b0 73 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79  s out of the way
124c0 20 62 65 66 6f 72 65 20 63 6f 6e 73 74 72 75 63   before construc
124d0 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
124e0 59 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  Y entries..     
124f0 20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f 6d   ** Move the com
12500 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 65 6e 74  pound select ent
12510 72 69 65 73 20 69 6e 74 6f 20 61 43 6f 70 79 5b  ries into aCopy[
12520 5d 20 77 68 65 72 65 20 74 68 65 79 20 63 61 6e  ] where they can
12530 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61 63 63   be.      ** acc
12540 65 73 73 65 64 20 61 6e 64 20 72 65 75 73 65 64  essed and reused
12550 20 77 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 69   when constructi
12560 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ng the ORDER BY 
12570 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 2a  entries..      *
12580 2a 20 42 65 63 61 75 73 65 20 6e 43 6f 6c 20 6d  * Because nCol m
12590 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20  ight be greater 
125a0 74 68 61 6e 20 6f 72 20 6c 65 73 73 20 74 68 61  than or less tha
125b0 6e 20 6e 4f 72 64 65 72 42 79 45 78 70 72 0a 20  n nOrderByExpr. 
125c0 20 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20       ** we have 
125d0 74 6f 20 75 73 65 20 6d 65 6d 6d 6f 76 65 28 29  to use memmove()
125e0 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20   when doing the 
125f0 63 6f 70 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  copy..      */. 
12600 20 20 20 20 20 61 43 6f 70 79 20 3d 20 26 70 4b       aCopy = &pK
12610 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 4f  eyInfo->aColl[nO
12620 72 64 65 72 42 79 45 78 70 72 5d 3b 0a 20 20 20  rderByExpr];.   
12630 20 20 20 70 53 6f 72 74 4f 72 64 65 72 20 3d 20     pSortOrder = 
12640 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
12650 72 64 65 72 20 3d 20 28 75 38 2a 29 26 61 43 6f  rder = (u8*)&aCo
12660 70 79 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  py[nCol];.      
12670 6d 65 6d 6d 6f 76 65 28 61 43 6f 70 79 2c 20 70  memmove(aCopy, p
12680 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c 20  KeyInfo->aColl, 
12690 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c  nCol*sizeof(Coll
126a0 53 65 71 2a 29 29 3b 0a 0a 20 20 20 20 20 20 61  Seq*));..      a
126b0 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f  pColl = pKeyInfo
126c0 2d 3e 61 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 66  ->aColl;.      f
126d0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
126e0 42 79 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4f 54  ByExpr; i++, pOT
126f0 65 72 6d 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 2c  erm++, apColl++,
12700 20 70 53 6f 72 74 4f 72 64 65 72 2b 2b 29 7b 0a   pSortOrder++){.
12710 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
12720 78 70 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 70 45  xpr = pOTerm->pE
12730 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
12740 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
12750 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20   EP_ExpCollate) 
12760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
12770 65 72 74 28 20 70 45 78 70 72 2d 3e 70 43 6f 6c  ert( pExpr->pCol
12780 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
12790 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 45 78 70    *apColl = pExp
127a0 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  r->pColl;.      
127b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
127c0 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 61 43 6f     *apColl = aCo
127d0 70 79 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  py[pExpr->iColum
127e0 6e 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n];.        }.  
127f0 20 20 20 20 20 20 2a 70 53 6f 72 74 4f 72 64 65        *pSortOrde
12800 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 73 6f 72 74  r = pOTerm->sort
12810 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20  Order;.      }. 
12820 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
12830 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b  pRightmost==p );
12840 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12850 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
12860 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64  ]>=0 );.      ad
12870 64 72 20 3d 20 70 2d 3e 61 64 64 72 4f 70 65 6e  dr = p->addrOpen
12880 45 70 68 6d 5b 32 5d 3b 0a 20 20 20 20 20 20 73  Ephm[2];.      s
12890 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
128a0 50 32 28 76 2c 20 61 64 64 72 2c 20 70 2d 3e 70  P2(v, addr, p->p
128b0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32  OrderBy->nExpr+2
128c0 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  );.      pKeyInf
128d0 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f 72 64  o->nField = nOrd
128e0 65 72 42 79 45 78 70 72 3b 0a 20 20 20 20 20 20  erByExpr;.      
128f0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
12900 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP4(v, addr, (ch
12910 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
12920 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
12930 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  );.      pKeyInf
12940 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 65 6e  o = 0;.      gen
12950 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
12960 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70  arse, p, v, p->p
12970 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 26 64  EList->nExpr, &d
12980 65 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  est);.    }..   
12990 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b   sqlite3_free(pK
129a0 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75  eyInfo);.  }..mu
129b0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a  lti_select_end:.
129c0 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20    pDest->iMem = 
129d0 64 65 73 74 2e 69 4d 65 6d 3b 0a 20 20 70 44 65  dest.iMem;.  pDe
129e0 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73 74 2e  st->nMem = dest.
129f0 6e 4d 65 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72  nMem;.  return r
12a00 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
12a10 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
12a20 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
12a30 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74  *.** Code an out
12a40 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66  put subroutine f
12a50 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69  or a coroutine i
12a60 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
12a70 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
12a80 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tment..**.** The
12a90 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70   data to be outp
12aa0 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ut is contained 
12ab0 69 6e 20 70 49 6e 2d 3e 69 4d 65 6d 2e 20 20 54  in pIn->iMem.  T
12ac0 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d  here are.** pIn-
12ad0 3e 6e 4d 65 6d 20 63 6f 6c 75 6d 6e 73 20 74 6f  >nMem columns to
12ae0 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65   be output.  pDe
12af0 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20  st is where the 
12b00 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a  output should.**
12b10 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   be sent..**.** 
12b20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65  regReturn is the
12b30 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
12b40 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
12b50 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a  the subroutine.*
12b60 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  * return address
12b70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72  ..**.** If regPr
12b80 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20  ev>0 then it is 
12b90 61 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  a the first regi
12ba0 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72  ster in a vector
12bb0 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73   that.** records
12bc0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75   the previous ou
12bd0 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72  tput.  mem[regPr
12be0 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68  ev] is a flag th
12bf0 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69  at is false.** i
12c00 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
12c10 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74   no previous out
12c20 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76  put.  If regPrev
12c30 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a  >0 then code is.
12c40 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  ** generated to 
12c50 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  suppress duplica
12c60 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69  tes.  pKeyInfo i
12c70 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61  s used for compa
12c80 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a  ring.** keys..**
12c90 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54  .** If the LIMIT
12ca0 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69   found in p->iLi
12cb0 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20  mit is reached, 
12cc0 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
12cd0 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a   to.** iBreak..*
12ce0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e  /.static int gen
12cf0 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
12d00 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a  utine(.  Parse *
12d10 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
12d20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
12d30 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
12d40 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12d50 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
12d60 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65  tatement */.  Se
12d70 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20  lectDest *pIn,  
12d80 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69        /* Corouti
12d90 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74  ne supplying dat
12da0 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
12db0 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
12dc0 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20  * Where to send 
12dd0 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  the data */.  in
12de0 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20  t regReturn,    
12df0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
12e00 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
12e10 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
12e20 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  gPrev,          
12e30 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65    /* Previous re
12e40 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20  sult register.  
12e50 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66  No uniqueness if
12e60 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20   0 */.  KeyInfo 
12e70 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
12e80 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67  /* For comparing
12e90 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65   with previous e
12ea0 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 34  ntry */.  int p4
12eb0 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
12ec0 20 20 2f 2a 20 54 68 65 20 70 34 20 74 79 70 65    /* The p4 type
12ed0 20 66 6f 72 20 70 4b 65 79 49 6e 66 6f 20 2a 2f   for pKeyInfo */
12ee0 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
12ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
12f00 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69  mp here if we hi
12f10 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29  t the LIMIT */.)
12f20 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
12f30 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
12f40 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  nt iContinue;.  
12f50 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 66 28 20  int addr;.  if( 
12f60 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
12f70 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ..  addr = sqlit
12f80 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
12f90 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75  r(v);.  iContinu
12fa0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
12fb0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
12fc0 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70 6c  /* Suppress dupl
12fd0 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e  icates for UNION
12fe0 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
12ff0 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20  TERSECT .  */.  
13000 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20  if( regPrev ){. 
13010 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20     int j1, j2;. 
13020 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
13030 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
13040 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b  IfNot, regPrev);
13050 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65  .    j2 = sqlite
13060 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
13070 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e  P_Compare, pIn->
13080 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c  iMem, regPrev+1,
13090 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20   pIn->nMem,.    
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130b0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
130c0 29 70 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79 70  )pKeyInfo, p4typ
130d0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
130e0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
130f0 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e  Jump, j2+2, iCon
13100 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20  tinue, j2+2);.  
13110 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
13120 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
13130 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
13140 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49  eCopy(pParse, pI
13150 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76  n->iMem, regPrev
13160 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a  +1, pIn->nMem);.
13170 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13180 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
13190 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29  ger, 1, regPrev)
131a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 75 70 70  ;.  }..  /* Supp
131b0 72 65 73 73 20 74 68 65 20 74 68 65 20 66 69 72  ress the the fir
131c0 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65  st OFFSET entrie
131d0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  s if there is an
131e0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20   OFFSET clause. 
131f0 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74   */.  codeOffset
13200 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
13210 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44  );..  switch( pD
13220 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20  est->eDest ){.  
13230 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
13240 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
13250 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
13260 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
13270 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
13280 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
13290 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
132a0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
132b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
132c0 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
132d0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
132e0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
132f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13300 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
13310 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70  rd, pIn->iMem, p
13320 49 6e 2d 3e 6e 4d 65 6d 2c 20 72 31 29 3b 0a 20  In->nMem, r1);. 
13330 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13340 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
13350 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 50  Rowid, pDest->iP
13360 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
13370 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13380 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
13390 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 31  pDest->iParm, r1
133a0 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
133b0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
133c0 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
133d0 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D);.      sqlite
133e0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
133f0 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
13400 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
13410 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
13420 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
13430 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
13440 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
13450 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
13460 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
13470 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
13480 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
13490 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
134a0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
134b0 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
134c0 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
134d0 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
134e0 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
134f0 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
13500 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
13510 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
13520 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
13530 20 20 20 20 20 69 6e 74 20 61 64 64 72 32 2c 20       int addr2, 
13540 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r1;.      assert
13550 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29  ( pIn->nMem==1 )
13560 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e  ;.      p->affin
13570 69 74 79 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ity = .         
13580 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
13590 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74  finity(p->pEList
135a0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
135b0 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a  est->affinity);.
135c0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
135d0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
135e0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
135f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
13600 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
13610 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72 31  pIn->iMem, 1, r1
13620 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20  , &p->affinity, 
13630 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
13640 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
13650 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
13660 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a   pIn->iMem, 1);.
13670 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13680 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
13690 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  xInsert, pDest->
136a0 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
136b0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
136c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
136d0 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
136e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
136f0 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
13700 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
13710 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
13720 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
13730 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
13740 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
13750 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13760 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
13770 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69  ger, 1, pDest->i
13780 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
13790 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
137a0 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
137b0 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
137c0 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
137d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
137e0 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
137f0 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
13800 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
13810 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
13820 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
13830 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
13840 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
13850 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
13860 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
13870 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
13880 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
13890 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
138a0 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d  ert( pIn->nMem==
138b0 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
138c0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
138d0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  Parse, pIn->iMem
138e0 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
138f0 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
13900 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
13910 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
13920 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
13930 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
13940 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
13950 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13960 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
13970 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20      /* Send the 
13980 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c  data to the call
13990 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72  back function or
139a0 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
139b0 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a  .  In the.    **
139c0 20 63 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f   case of a subro
139d0 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f  utine, the subro
139e0 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20  utine itself is 
139f0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a  responsible for.
13a00 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74      ** popping t
13a10 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  he data from the
13a20 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20   stack..    */. 
13a30 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f     case SRT_Coro
13a40 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69  utine: {.      i
13a50 66 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d  f( pDest->iMem==
13a60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
13a70 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c 69 74  st->iMem = sqlit
13a80 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
13a90 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  Parse, pIn->nMem
13aa0 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  );.        pDest
13ab0 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e 6e 4d  ->nMem = pIn->nM
13ac0 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
13ad0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
13ae0 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
13af0 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e  n->iMem, pDest->
13b00 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 6e 4d 65  iMem, pDest->nMe
13b10 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
13b20 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
13b30 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
13b40 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  iParm);.      br
13b50 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
13b60 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63  case SRT_Callbac
13b70 6b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  k: {.      sqlit
13b80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13b90 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49  OP_ResultRow, pI
13ba0 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d  n->iMem, pIn->nM
13bb0 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
13bc0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
13bd0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
13be0 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e  , pIn->iMem, pIn
13bf0 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62  ->nMem);.      b
13c00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
13c10 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13c20 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
13c30 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
13c40 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
13c50 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
13c60 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
13c70 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
13c80 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
13c90 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
13ca0 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
13cb0 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
13cc0 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
13cd0 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
13ce0 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
13cf0 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
13d00 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
13d10 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
13d20 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
13d30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
13d40 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65  ult: {.      bre
13d50 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
13d60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
13d70 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
13d80 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
13d90 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
13da0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
13db0 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
13dc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13dd0 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69   OP_AddImm, p->i
13de0 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
13df0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13e00 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  2(v, OP_IfZero, 
13e10 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
13e20 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  k);.  }..  /* Ge
13e30 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
13e40 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
13e50 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
13e60 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
13e70 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
13e80 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13e90 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
13ea0 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
13eb0 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
13ec0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
13ed0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
13ee0 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
13ef0 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
13f00 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
13f10 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
13f20 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
13f30 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
13f40 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
13f50 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
13f60 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
13f70 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
13f80 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
13f90 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
13fa0 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
13fb0 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
13fc0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
13fd0 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
13fe0 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
13ff0 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
14000 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
14010 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
14020 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
14030 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
14040 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
14050 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
14060 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
14070 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
14080 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
14090 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
140a0 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
140b0 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
140c0 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
140d0 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
140e0 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
140f0 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
14100 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
14110 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
14120 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
14130 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
14140 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
14150 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
14160 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
14170 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
14180 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
14190 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
141a0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
141b0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
141c0 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
141d0 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
141e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
141f0 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
14200 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
14210 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
14220 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
14230 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
14240 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
14250 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
14260 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
14270 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
14280 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
14290 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
142a0 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
142b0 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
142c0 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
142d0 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
142e0 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
142f0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
14300 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
14310 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
14320 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
14330 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
14340 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
14350 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
14360 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
14370 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
14380 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
14390 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
143a0 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
143b0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
143c0 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
143d0 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
143e0 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
143f0 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
14400 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
14410 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
14420 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
14430 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
14440 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
14450 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
14460 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
14470 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
14480 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
14490 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
144a0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
144b0 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
144c0 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
144d0 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
144e0 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
144f0 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
14500 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
14510 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
14520 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
14530 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
14540 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
14550 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
14560 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
14570 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
14580 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
14590 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
145a0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
145b0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
145c0 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
145d0 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
145e0 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
145f0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
14600 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
14610 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
14620 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
14630 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
14640 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
14650 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
14660 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
14670 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
14680 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
14690 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
146a0 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
146b0 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
146c0 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
146d0 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
146e0 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
146f0 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
14700 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
14710 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
14720 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
14730 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
14740 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
14750 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
14760 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
14770 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
14780 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
14790 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
147a0 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
147b0 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
147c0 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
147d0 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
147e0 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
147f0 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
14800 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
14810 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
14820 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
14830 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
14840 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
14850 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
14860 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
14870 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
14880 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
14890 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
148a0 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
148b0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
148c0 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
148d0 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
148e0 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
148f0 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
14900 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
14910 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
14920 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
14930 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
14940 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
14950 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
14960 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
14970 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
14980 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
14990 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
149a0 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
149b0 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
149c0 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
149d0 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
149e0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
149f0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
14a00 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
14a10 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
14a20 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
14a30 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
14a40 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
14a50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
14a60 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
14a70 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
14a80 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
14a90 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
14aa0 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
14ab0 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
14ac0 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
14ad0 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
14ae0 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
14af0 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
14b00 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
14b10 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
14b20 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
14b30 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
14b40 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
14b50 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
14b60 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
14b70 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
14b80 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
14b90 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
14ba0 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
14bb0 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
14bc0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
14bd0 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
14be0 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
14bf0 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
14c00 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
14c10 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
14c20 42 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  B..*/.static int
14c30 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
14c40 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
14c50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
14c60 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
14c70 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
14c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14c90 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
14ca0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
14cb0 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
14cc0 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 2f  est *pDest,    /
14cd0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
14ce0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
14cf0 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20  */.  char *aff  
14d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
14d10 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
14d20 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74  ion, the affinit
14d30 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
14d40 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
14d50 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
14d60 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c  ounters */.  Sel
14d70 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
14d80 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
14d90 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
14da0 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
14db0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
14dc0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
14dd0 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
14de0 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
14df0 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20  tDest destA;    
14e00 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
14e10 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20  for coroutine A 
14e20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
14e30 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65  destB;     /* De
14e40 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
14e50 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69  routine B */.  i
14e60 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20  nt regAddrA;    
14e70 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
14e80 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
14e90 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
14ea0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 41  */.  int regEofA
14eb0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  ;          /* Fl
14ec0 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  ag to indicate w
14ed0 68 65 6e 20 73 65 6c 65 63 74 2d 41 20 69 73 20  hen select-A is 
14ee0 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  complete */.  in
14ef0 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20  t regAddrB;     
14f00 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
14f10 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
14f20 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
14f30 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 42 3b  /.  int regEofB;
14f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
14f50 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  g to indicate wh
14f60 65 6e 20 73 65 6c 65 63 74 2d 42 20 69 73 20 63  en select-B is c
14f70 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74  omplete */.  int
14f80 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20   addrSelectA;   
14f90 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
14fa0 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f   the select-A co
14fb0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
14fc0 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20   addrSelectB;   
14fd0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
14fe0 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f   the select-B co
14ff0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
15000 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20   regOutA;       
15010 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
15020 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
15030 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
15040 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
15050 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utB;          /*
15060 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
15070 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
15080 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
15090 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b  .  int addrOutA;
150a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
150b0 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
150c0 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
150d0 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42  /.  int addrOutB
150e0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
150f0 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
15100 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
15110 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
15120 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
15130 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
15140 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20  ect-A-exhausted 
15150 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
15160 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
15170 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
15180 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
15190 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
151a0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
151b0 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
151c0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
151d0 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
151e0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
151f0 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
15200 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
15210 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
15220 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
15230 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
15240 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
15250 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
15260 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
15270 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
15280 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
15290 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
152a0 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
152b0 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
152c0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
152d0 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
152e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
152f0 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
15300 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
15310 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
15320 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
15330 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
15340 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
15350 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
15360 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
15370 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
15380 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
15390 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
153a0 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
153b0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
153c0 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
153d0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
153e0 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
153f0 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
15400 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
15410 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
15420 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20    int j1;       
15430 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
15440 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
15450 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
15460 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15480 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
15490 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
154a0 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
154b0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
154c0 4b 65 79 44 75 70 3b 20 20 20 20 20 2f 2a 20 43  KeyDup;     /* C
154d0 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
154e0 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
154f0 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
15500 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
15510 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
15520 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
15530 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
15540 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
15550 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
15560 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
15570 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
15580 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
15590 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
155a0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
155b0 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
155c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
155d0 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
155e0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
155f0 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
15600 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
15610 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
15620 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
15630 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  et columns */.  
15640 75 38 20 4e 6f 74 55 73 65 64 3b 20 20 20 20 20  u8 NotUsed;     
15650 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20 76        /* Dummy v
15660 61 72 69 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 61  ariables */..  a
15670 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
15680 42 79 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  By!=0 );.  db = 
15690 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20  pParse->db;.  v 
156a0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
156b0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
156c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
156d0 4d 3b 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20  M;.  labelEnd = 
156e0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
156f0 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c  abel(v);.  label
15700 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Cmpr = sqlite3Vd
15710 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
15720 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20  ..  /* Patch up 
15730 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
15740 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  use.  */.  op = 
15750 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f  p->op;  .  pPrio
15760 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
15770 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
15780 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
15790 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
157a0 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
157b0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
157c0 69 66 28 20 70 72 6f 63 65 73 73 43 6f 6d 70 6f  if( processCompo
157d0 75 6e 64 4f 72 64 65 72 42 79 28 70 50 61 72 73  undOrderBy(pPars
157e0 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20  e, p, 0) ){.    
157f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15800 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
15810 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
15820 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  erBy->nExpr;.  }
15830 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72  else{.    nOrder
15840 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  By = 0;.  }.  /*
15850 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f   For operators o
15860 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
15870 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d  ALL we have to m
15880 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20  ake sure that.  
15890 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
158a0 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76  clause covers ev
158b0 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ery term of the 
158c0 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64  result set.  Add
158d0 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74  .  ** terms to t
158e0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
158f0 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  se as necessary.
15900 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d  .  */.  if( op!=
15910 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f  TK_ALL ){.    fo
15920 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f  r(i=1; db->mallo
15930 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c  cFailed==0 && i<
15940 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
15950 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  r; i++){.      f
15960 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 4f 72 64 65 72  or(j=0; j<nOrder
15970 42 79 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  By; j++){.      
15980 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20    Expr *pTerm = 
15990 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a 5d 2e 70  pOrderBy->a[j].p
159a0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73  Expr;.        as
159b0 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 6f 70 3d  sert( pTerm->op=
159c0 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  =TK_INTEGER );. 
159d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
159e0 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45  pTerm->flags & E
159f0 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 29  P_IntValue)!=0 )
15a00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
15a10 65 72 6d 2d 3e 69 54 61 62 6c 65 3d 3d 69 20 29  erm->iTable==i )
15a20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
15a30 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72        if( j==nOr
15a40 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
15a50 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
15a60 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
15a70 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  e, TK_INTEGER, 0
15a80 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
15a90 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
15aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
15ab0 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EM;.        pNew
15ac0 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e  ->flags |= EP_In
15ad0 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  tValue;.        
15ae0 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20 3d 20 69  pNew->iTable = i
15af0 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
15b00 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
15b10 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
15b20 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65  e, pOrderBy, pNe
15b30 77 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e  w, 0);.        n
15b40 4f 72 64 65 72 42 79 2b 2b 3b 0a 20 20 20 20 20  OrderBy++;.     
15b50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
15b60 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
15b70 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
15b80 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
15b90 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
15ba0 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
15bb0 6d 75 74 61 74 69 6f 6e 20 69 6e 20 6f 72 64 65  mutation in orde
15bc0 72 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 73  r to comparisons
15bd0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
15be0 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
15bf0 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
15c00 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
15c10 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
15c20 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
15c30 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
15c40 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
15c50 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
15c60 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
15c70 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
15c80 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
15c90 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
15ca0 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
15cb0 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
15cc0 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
15cd0 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
15ce0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
15cf0 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
15d00 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  *nOrderBy);.  if
15d10 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20  ( aPermute ){.  
15d20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
15d30 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
15d40 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d     Expr *pTerm =
15d50 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
15d60 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
15d70 65 72 74 28 20 70 54 65 72 6d 2d 3e 6f 70 3d 3d  ert( pTerm->op==
15d80 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20  TK_INTEGER );.  
15d90 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
15da0 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  rm->flags & EP_I
15db0 6e 74 56 61 6c 75 65 29 21 3d 30 20 29 3b 0a 20  ntValue)!=0 );. 
15dc0 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d       aPermute[i]
15dd0 20 3d 20 70 54 65 72 6d 2d 3e 69 54 61 62 6c 65   = pTerm->iTable
15de0 2d 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  -1;.      assert
15df0 28 20 61 50 65 72 6d 75 74 65 5b 69 5d 3e 3d 30  ( aPermute[i]>=0
15e00 20 26 26 20 61 50 65 72 6d 75 74 65 5b 69 5d 3c   && aPermute[i]<
15e10 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
15e20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b   );.    }.    pK
15e30 65 79 4d 65 72 67 65 20 3d 0a 20 20 20 20 20 20  eyMerge =.      
15e40 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
15e50 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
15e60 4b 65 79 4d 65 72 67 65 29 2b 6e 4f 72 64 65 72  KeyMerge)+nOrder
15e70 42 79 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  By*(sizeof(CollS
15e80 65 71 2a 29 2b 31 29 29 3b 0a 20 20 20 20 69 66  eq*)+1));.    if
15e90 28 20 70 4b 65 79 4d 65 72 67 65 20 29 7b 0a 20  ( pKeyMerge ){. 
15ea0 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e       pKeyMerge->
15eb0 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
15ec0 2a 29 26 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43  *)&pKeyMerge->aC
15ed0 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20  oll[nOrderBy];. 
15ee0 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e       pKeyMerge->
15ef0 6e 46 69 65 6c 64 20 3d 20 6e 4f 72 64 65 72 42  nField = nOrderB
15f00 79 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72  y;.      pKeyMer
15f10 67 65 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  ge->enc = ENC(db
15f20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
15f30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
15f40 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
15f50 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
15f60 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20      Expr *pTerm 
15f70 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
15f80 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
15f90 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
15fa0 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
15fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
15fc0 6f 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 43 6f  oll = pTerm->pCo
15fd0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ll;.        }els
15fe0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  e{.          pCo
15ff0 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
16000 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
16010 70 2c 20 61 50 65 72 6d 75 74 65 5b 69 5d 29 3b  p, aPermute[i]);
16020 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d  .          pTerm
16030 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78  ->flags |= EP_Ex
16040 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20  pCollate;.      
16050 20 20 20 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c      pTerm->pColl
16060 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
16070 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4b 65 79    }.        pKey
16080 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  Merge->aColl[i] 
16090 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  = pColl;.       
160a0 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72   pKeyMerge->aSor
160b0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64  tOrder[i] = pOrd
160c0 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
160d0 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rder;.      }.  
160e0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
160f0 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a   pKeyMerge = 0;.
16100 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61    }..  /* Reatta
16110 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ch the ORDER BY 
16120 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71 75  clause to the qu
16130 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ery..  */.  p->p
16140 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
16150 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f  By;.  pPrior->pO
16160 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
16170 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72  ExprListDup(pPar
16180 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79  se->db, pOrderBy
16190 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
161a0 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d  e a range of tem
161b0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
161c0 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   and the KeyInfo
161d0 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72   needed.  ** for
161e0 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
161f0 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74  removes duplicat
16200 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68  e result rows wh
16210 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72  en the.  ** oper
16220 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45  ator is UNION, E
16230 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
16240 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49  ECT (but not UNI
16250 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20  ON ALL)..  */.  
16260 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
16270 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  {.    regPrev = 
16280 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
16290 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70  int nExpr = p->p
162a0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
162b0 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
162c0 42 79 3e 3d 6e 45 78 70 72 20 29 3b 0a 20 20 20  By>=nExpr );.   
162d0 20 72 65 67 50 72 65 76 20 3d 20 73 71 6c 69 74   regPrev = sqlit
162e0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
162f0 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 31 29 3b  Parse, nExpr+1);
16300 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16310 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
16320 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76  eger, 0, regPrev
16330 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d  );.    pKeyDup =
16340 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
16350 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20  Zero(db,.       
16360 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
16370 66 28 2a 70 4b 65 79 44 75 70 29 20 2b 20 6e 45  f(*pKeyDup) + nE
16380 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  xpr*(sizeof(Coll
16390 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20  Seq*)+1) );.    
163a0 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
163b0 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53       pKeyDup->aS
163c0 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
163d0 26 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b  &pKeyDup->aColl[
163e0 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b  nExpr];.      pK
163f0 65 79 44 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  eyDup->nField = 
16400 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4b 65  nExpr;.      pKe
16410 79 44 75 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  yDup->enc = ENC(
16420 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  db);.      for(i
16430 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
16440 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  ){.        pKeyD
16450 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  up->aColl[i] = m
16460 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
16470 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
16480 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
16490 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
164a0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
164b0 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65   }.  }. .  /* Se
164c0 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20  parate the left 
164d0 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75  and the right qu
164e0 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f  ery from one ano
164f0 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ther.  */.  p->p
16500 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72  Prior = 0;.  pPr
16510 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  ior->pRightmost 
16520 3d 20 30 3b 0a 20 20 70 72 6f 63 65 73 73 4f 72  = 0;.  processOr
16530 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
16540 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
16550 79 2c 20 31 2c 20 26 4e 6f 74 55 73 65 64 29 3b  y, 1, &NotUsed);
16560 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
16570 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
16580 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75  processOrderGrou
16590 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69  pBy(pParse, pPri
165a0 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  or, pPrior->pOrd
165b0 65 72 42 79 2c 20 31 2c 20 26 4e 6f 74 55 73 65  erBy, 1, &NotUse
165c0 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  d);.  }..  /* Co
165d0 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20  mpute the limit 
165e0 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63  registers */.  c
165f0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
16600 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
16610 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28  labelEnd);.  if(
16620 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70   p->iLimit && op
16630 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
16640 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50  regLimitA = ++pP
16650 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
16660 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50  regLimitB = ++pP
16670 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
16680 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16690 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d  2(v, OP_Copy, p-
166a0 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f  >iOffset ? p->iO
166b0 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69  ffset+1 : p->iLi
166c0 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166e0 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41         regLimitA
166f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16700 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
16710 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20  opy, regLimitA, 
16720 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65  regLimitB);.  }e
16730 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  lse{.    regLimi
16740 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d  tA = regLimitB =
16750 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
16760 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
16770 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  Limit);.  p->pLi
16780 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  mit = 0;.  sqlit
16790 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
167a0 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70  pOffset);.  p->p
167b0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72  Offset = 0;..  r
167c0 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72  egAddrA = ++pPar
167d0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45  se->nMem;.  regE
167e0 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ofA = ++pParse->
167f0 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42  nMem;.  regAddrB
16800 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
16810 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d 20 2b  m;.  regEofB = +
16820 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
16830 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61   regOutA = ++pPa
16840 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
16850 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutB = ++pParse-
16860 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
16870 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
16880 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75  destA, SRT_Corou
16890 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b  tine, regAddrA);
168a0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
168b0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c  DestInit(&destB,
168c0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
168d0 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a  regAddrB);..  /*
168e0 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65 20 76   Jump past the v
168f0 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74 69 6e  arious subroutin
16900 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69 6e 65  es and coroutine
16910 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20  s to the main.  
16920 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20  ** merge loop.  
16930 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  */.  j1 = sqlite
16940 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
16950 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64 72 53  P_Goto);.  addrS
16960 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33  electA = sqlite3
16970 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
16980 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  v);...  /* Gener
16990 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
169a0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
169b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
169c0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66   to the.  ** lef
169d0 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  t of the compoun
169e0 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65  d operator - the
169f0 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a   "A" select..  *
16a00 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
16a10 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63  ent((v, "Begin c
16a20 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
16a30 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70  t SELECT"));.  p
16a40 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
16a50 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 73 71 6c  regLimitA;.  sql
16a60 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
16a70 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
16a80 41 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  A, 0, 0, 0, 0);.
16a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16aa0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
16ab0 72 2c 20 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a  r, 1, regEofA);.
16ac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16ad0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
16ae0 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 56 64   regAddrA);.  Vd
16af0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
16b00 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65  , "End coroutine
16b10 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54   for left SELECT
16b20 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  "));..  /* Gener
16b30 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
16b40 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
16b50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16b60 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69   on .  ** the ri
16b70 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65  ght - the "B" se
16b80 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72  lect.  */.  addr
16b90 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65  SelectB = sqlite
16ba0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
16bb0 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  (v);.  VdbeNoopC
16bc0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
16bd0 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  n coroutine for 
16be0 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
16bf0 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20  .  savedLimit = 
16c00 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76  p->iLimit;.  sav
16c10 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  edOffset = p->iO
16c20 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d  ffset;.  p->iLim
16c30 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a  it = regLimitB;.
16c40 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
16c50 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  ;  .  sqlite3Sel
16c60 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
16c70 64 65 73 74 42 2c 20 30 2c 20 30 2c 20 30 2c 20  destB, 0, 0, 0, 
16c80 30 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  0);.  p->iLimit 
16c90 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20  = savedLimit;.  
16ca0 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76  p->iOffset = sav
16cb0 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69  edOffset;.  sqli
16cc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16cd0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
16ce0 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69  regEofB);.  sqli
16cf0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16d00 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
16d10 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  drB);.  VdbeNoop
16d20 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
16d30 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
16d40 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
16d50 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
16d60 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
16d70 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
16d80 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
16d90 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  A.  ** select as
16da0 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
16db0 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
16dc0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
16dd0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
16de0 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
16df0 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29  routine for A"))
16e00 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67  ;.  addrOutA = g
16e10 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
16e20 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
16e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e40 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73   p, &destA, pDes
16e50 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20  t, regOutA,.    
16e60 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
16e70 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50  Prev, pKeyDup, P
16e80 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
16e90 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  F, labelEnd);.  
16ea0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
16eb0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
16ec0 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
16ed0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
16ee0 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  B.  ** select as
16ef0 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
16f00 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
16f10 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
16f20 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
16f30 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
16f40 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f  ON ){.    VdbeNo
16f50 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
16f60 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
16f70 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72  r B"));.    addr
16f80 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutB = generateO
16f90 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
16fa0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
16fb0 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
16fc0 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tB, pDest, regOu
16fd0 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tB,.            
16fe0 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
16ff0 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46  eyDup, P4_KEYINF
17000 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62 65 6c 45  O_STATIC, labelE
17010 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  nd);.  }..  /* G
17020 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
17030 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
17040 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
17050 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20  m select A.  ** 
17060 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
17070 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
17080 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e  elect B remains.
17090 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
170a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
170b0 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -A subroutine"))
170c0 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  ;.  if( op==TK_E
170d0 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
170e0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
170f0 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
17100 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17110 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
17120 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  elEnd);.  }else{
17130 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20    .    addrEofA 
17140 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
17150 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
17160 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29  gEofB, labelEnd)
17170 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17180 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
17190 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
171a0 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71 6c  drOutB);.    sql
171b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
171c0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
171d0 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrB);.    sqlit
171e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
171f0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
17200 45 6f 66 41 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  EofA);.  }..  /*
17210 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
17220 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
17230 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
17240 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a  rom select B.  *
17250 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
17260 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
17270 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e   select A remain
17280 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
17290 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
172a0 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  {.    addrEofB =
172b0 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 7d 65 6c   addrEofA;.  }el
172c0 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f  se{  .    VdbeNo
172d0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
172e0 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  of-B subroutine"
172f0 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42  ));.    addrEofB
17300 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
17310 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
17320 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e 64  egEofA, labelEnd
17330 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17340 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
17350 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
17360 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71  ddrOutA);.    sq
17370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
17380 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
17390 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69  AddrA);.    sqli
173a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
173b0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
173c0 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rEofB);.  }..  /
173d0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
173e0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
173f0 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20  se of A<B.  */. 
17400 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
17410 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62  ((v, "A-lt-B sub
17420 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
17430 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33  drAltB = sqlite3
17440 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17450 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
17460 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71   addrOutA);.  sq
17470 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
17480 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
17490 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
174a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
174b0 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61  P_If, regEofA, a
174c0 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  ddrEofA);.  sqli
174d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
174e0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
174f0 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47  elCmpr);..  /* G
17500 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
17510 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
17520 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69  of A==B.  */.  i
17530 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
17540 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
17550 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73  addrAltB;.  }els
17560 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54  e if( op==TK_INT
17570 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
17580 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
17590 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b  B;.    addrAltB+
175a0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
175b0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
175c0 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72  (v, "A-eq-B subr
175d0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
175e0 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71  ddrAeqB =.    sq
175f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
17600 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
17610 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69  AddrA);.    sqli
17620 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17630 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c   OP_If, regEofA,
17640 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20   addrEofA);.    
17650 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17660 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
17670 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d   labelCmpr);.  }
17680 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
17690 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
176a0 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20  he case of A>B. 
176b0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
176c0 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d  mment((v, "A-gt-
176d0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
176e0 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71  .  addrAgtB = sq
176f0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
17700 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f  Addr(v);.  if( o
17710 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
17720 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
17730 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17740 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
17750 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
17760 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  B);.  }.  sqlite
17770 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
17780 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
17790 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
177a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
177b0 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45  , regEofB, addrE
177c0 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
177d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
177e0 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
177f0 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  pr);..  /* This 
17800 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74  code runs once t
17810 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65  o initialize eve
17820 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  rything..  */.  
17830 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
17840 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71  ere(v, j1);.  sq
17850 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17860 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
17870 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71  , regEofA);.  sq
17880 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17890 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
178a0 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71  , regEofB);.  sq
178b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
178c0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
178d0 41 64 64 72 41 2c 20 61 64 64 72 53 65 6c 65 63  AddrA, addrSelec
178e0 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
178f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
17900 6f 73 75 62 2c 20 72 65 67 41 64 64 72 42 2c 20  osub, regAddrB, 
17910 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20  addrSelectB);.  
17920 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17930 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
17940 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  ofA, addrEofA);.
17950 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17960 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
17970 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29  gEofB, addrEofB)
17980 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e  ;..  /* Implemen
17990 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65  t the main merge
179a0 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
179b0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
179c0 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70  abel(v, labelCmp
179d0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
179e0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65  eAddOp4(v, OP_Pe
179f0 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c  rmutation, 0, 0,
17a00 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d   0, (char*)aPerm
17a10 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59  ute, P4_INTARRAY
17a20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
17a30 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
17a40 70 61 72 65 2c 20 64 65 73 74 41 2e 69 4d 65 6d  pare, destA.iMem
17a50 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c 20 6e 4f  , destB.iMem, nO
17a60 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
17a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a80 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67   (char*)pKeyMerg
17a90 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  e, P4_KEYINFO_HA
17aa0 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65  NDOFF);.  sqlite
17ab0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
17ac0 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42  P_Jump, addrAltB
17ad0 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72  , addrAeqB, addr
17ae0 41 67 74 42 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c  AgtB);..  /* Rel
17af0 65 61 73 65 20 74 65 6d 70 6f 72 61 72 79 20 72  ease temporary r
17b00 65 67 69 73 74 65 72 73 0a 20 20 2a 2f 0a 20 20  egisters.  */.  
17b10 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20  if( regPrev ){. 
17b20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17b30 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
17b40 65 2c 20 72 65 67 50 72 65 76 2c 20 6e 4f 72 64  e, regPrev, nOrd
17b50 65 72 42 79 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20  erBy+1);.  }..  
17b60 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74  /* Jump to the t
17b70 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64  his point in ord
17b80 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  er to terminate 
17b90 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
17ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
17bb0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
17bc0 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65  elEnd);..  /* Se
17bd0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
17be0 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20  output columns. 
17bf0 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
17c00 3e 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c  >eDest==SRT_Call
17c10 62 61 63 6b 20 29 7b 0a 20 20 20 20 53 65 6c 65  back ){.    Sele
17c20 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72  ct *pFirst = pPr
17c30 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ior;.    while( 
17c40 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
17c50 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
17c60 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65  ->pPrior;.    ge
17c70 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
17c80 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
17c90 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
17ca0 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62  }..  /* Reassemb
17cb0 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ly the compound 
17cc0 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74  query so that it
17cd0 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63   will be freed c
17ce0 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79  orrectly.  ** by
17cf0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
17d00 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 2d 3e 70 50  ction */.  p->pP
17d10 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a  rior = pPrior;..
17d20 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73    /*** TBD:  Ins
17d30 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ert subroutine c
17d40 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75  alls to close cu
17d50 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c  rsors on incompl
17d60 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75  ete.  **** subqu
17d70 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 72 65  eries ****/.  re
17d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17d90 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
17da0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 20 46  E_OMIT_VIEW./* F
17db0 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
17dc0 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
17dd0 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
17de0 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c  (sqlite3*, ExprL
17df0 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ist*, int, ExprL
17e00 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
17e10 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73  id substSelect(s
17e20 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20  qlite3*, Select 
17e30 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
17e40 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e   *);../*.** Scan
17e50 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
17e60 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
17e70 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
17e80 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
17e90 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
17ea0 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
17eb0 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
17ec0 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
17ed0 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
17ee0 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
17ef0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
17f00 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
17f10 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
17f20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
17f30 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
17f40 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
17f50 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
17f60 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
17f70 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
17f80 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
17f90 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
17fa0 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
17fb0 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
17fc0 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
17fd0 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
17fe0 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
17ff0 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
18000 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
18010 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63  ine make the nec
18020 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
18030 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
18040 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
18050 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
18060 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
18070 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
18080 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
18090 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
180a0 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ery..*/.static v
180b0 6f 69 64 20 73 75 62 73 74 45 78 70 72 28 0a 20  oid substExpr(. 
180c0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
180d0 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
180e0 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20  alloc errors to 
180f0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
18100 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
18110 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  ,        /* Expr
18120 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69   in which substi
18130 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f  tution occurs */
18140 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
18150 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
18160 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
18170 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
18180 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75  *pEList    /* Su
18190 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73  bstitute express
181a0 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ions */.){.  if(
181b0 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
181c0 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
181d0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
181e0 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
181f0 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  =iTable ){.    i
18200 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
18210 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
18220 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
18230 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18240 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
18250 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
18260 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
18270 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d  >iColumn<pEList-
18280 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
18290 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
182a0 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
182b0 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70  ->pRight==0 && p
182c0 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
182d0 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70  ;.      pNew = p
182e0 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
182f0 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a  iColumn].pExpr;.
18300 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
18310 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew!=0 );.      p
18320 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d  Expr->op = pNew-
18330 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  >op;.      asser
18340 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
18350 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
18360 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r->pLeft = sqlit
18370 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e  e3ExprDup(db, pN
18380 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  ew->pLeft);.    
18390 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
183a0 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
183b0 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
183c0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
183d0 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69  up(db, pNew->pRi
183e0 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ght);.      asse
183f0 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  rt( pExpr->pList
18400 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
18410 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69  pr->pList = sqli
18420 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
18430 62 2c 20 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b  b, pNew->pList);
18440 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
18450 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61  able = pNew->iTa
18460 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ble;.      pExpr
18470 2d 3e 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70  ->pTab = pNew->p
18480 54 61 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72  Tab;.      pExpr
18490 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77  ->iColumn = pNew
184a0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
184b0 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70   pExpr->iAgg = p
184c0 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20  New->iAgg;.     
184d0 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
184e0 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f  y(db, &pExpr->to
184f0 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65  ken, &pNew->toke
18500 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
18510 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26  3TokenCopy(db, &
18520 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e  pExpr->span, &pN
18530 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20  ew->span);.     
18540 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
18550 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
18560 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 53 65  up(db, pNew->pSe
18570 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78  lect);.      pEx
18580 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77  pr->flags = pNew
18590 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
185a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73   }else{.    subs
185b0 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
185c0 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20  >pLeft, iTable, 
185d0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
185e0 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72  stExpr(db, pExpr
185f0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65  ->pRight, iTable
18600 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
18610 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
18620 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Expr->pSelect, i
18630 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
18640 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
18650 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 69  t(db, pExpr->pLi
18660 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
18670 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
18680 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
18690 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
186a0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
186b0 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
186c0 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
186d0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
186e0 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
186f0 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
18700 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
18710 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
18720 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
18730 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
18740 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
18750 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
18760 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
18770 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
18780 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
18790 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
187a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
187b0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
187c0 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  {.    substExpr(
187d0 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
187e0 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70  pExpr, iTable, p
187f0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
18800 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
18810 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  elect(.  sqlite3
18820 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
18830 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
18840 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20  rrors here */.  
18850 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
18860 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
18870 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63  tatement in whic
18880 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
18890 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  tutions */.  int
188a0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
188b0 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
188c0 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45   replaced */.  E
188d0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
188e0 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
188f0 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
18900 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
18910 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
18920 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  t(db, p->pEList,
18930 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
18940 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
18950 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  t(db, p->pGroupB
18960 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
18970 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
18980 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ist(db, p->pOrde
18990 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  rBy, iTable, pEL
189a0 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
189b0 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  r(db, p->pHaving
189c0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
189d0 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 64  );.  substExpr(d
189e0 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54  b, p->pWhere, iT
189f0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
18a00 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
18a10 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62   p->pPrior, iTab
18a20 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23  le, pEList);.}.#
18a30 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
18a40 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
18a50 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  EW) */..#ifndef 
18a60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
18a70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
18a80 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
18a90 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
18aa0 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  es in order to s
18ab0 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f  peed.** executio
18ac0 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31  n.  It returns 1
18ad0 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61   if it makes cha
18ae0 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f  nges and 0 if no
18af0 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f   flattening.** o
18b00 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
18b10 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
18b20 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
18b30 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
18b40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
18b50 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
18b60 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
18b70 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
18b80 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
18b90 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
18ba0 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
18bb0 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
18bc0 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
18bd0 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
18be0 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
18bf0 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
18c00 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
18c10 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
18c20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
18c30 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
18c40 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
18c50 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
18c60 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
18c70 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
18c80 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
18c90 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
18ca0 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
18cb0 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
18cc0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
18cd0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
18ce0 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
18cf0 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
18d00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
18d10 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
18d20 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
18d30 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
18d40 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
18d50 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
18d60 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
18d70 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
18d80 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
18d90 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
18da0 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
18db0 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
18dc0 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
18dd0 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
18de0 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
18df0 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
18e00 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
18e10 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
18e20 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
18e30 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
18e40 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
18e50 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
18e60 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
18e70 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
18e80 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
18e90 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
18ea0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
18eb0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
18ec0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
18ed0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
18ee0 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
18ef0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
18f00 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75  **   (2)  The su
18f10 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
18f20 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
18f30 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
18f40 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
18f50 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75  **   (3)  The su
18f60 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
18f70 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
18f80 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20  of a left outer 
18f90 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20  join, or.**     
18fa0 20 20 20 74 68 65 20 73 75 62 71 75 65 72 79 20     the subquery 
18fb0 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20  is not itself a 
18fc0 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23  join.  (Ticket #
18fd0 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  306).**.**   (4)
18fe0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
18ff0 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
19000 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
19010 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
19020 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68  .**.**   (5)  Th
19030 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
19040 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68  t DISTINCT or th
19050 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
19060 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
19070 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
19080 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68  .**.**   (6)  Th
19090 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
190a0 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
190b0 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
190c0 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
190d0 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
190e0 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
190f0 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61  e subquery has a
19100 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
19110 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73  .**   (8)  The s
19120 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
19130 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
19140 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
19150 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
19160 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75  **   (9)  The su
19170 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
19180 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
19190 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
191a0 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
191b0 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
191c0 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65  **.**  (10)  The
191d0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
191e0 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
191f0 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
19200 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
19210 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49          use LIMI
19220 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  T..**.**  (11)  
19230 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
19240 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
19250 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76   do not both hav
19260 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
19270 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20  es..**.**  (12) 
19280 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
19290 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 74   not the right t
192a0 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  erm of a LEFT OU
192b0 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a  TER JOIN or the.
192c0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
192d0 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
192e0 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64 20  clause.  (added 
192f0 62 79 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a  by ticket #350).
19300 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65  **.**  (13)  The
19310 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75   subquery and ou
19320 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
19330 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 0a   both use LIMIT.
19340 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
19350 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
19360 6f 74 20 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a  ot use OFFSET.**
19370 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f  .**  (15)  The o
19380 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
19390 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  t part of a comp
193a0 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74  ound select or t
193b0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
193c0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68  query does not h
193d0 61 76 65 20 62 6f 74 68 20 61 6e 20 4f 52 44 45  ave both an ORDE
193e0 52 20 42 59 20 61 6e 64 20 61 20 4c 49 4d 49 54  R BY and a LIMIT
193f0 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
19400 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23     (See ticket #
19410 32 33 33 39 29 0a 2a 2a 0a 2a 2a 20 20 28 31 36  2339).**.**  (16
19420 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  )  The outer que
19430 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
19440 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75  regate or the su
19450 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20  bquery does.**  
19460 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69        not contai
19470 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69  n ORDER BY.  (Ti
19480 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69  cket #2942)  Thi
19490 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61  s used to not ma
194a0 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75  tter.**        u
194b0 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63  ntil we introduc
194c0 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e  ed the group_con
194d0 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  cat() function. 
194e0 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20   .**.** In this 
194f0 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
19500 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
19510 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
19520 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
19530 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
19540 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
19550 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
19560 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
19570 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
19580 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75  egates and subqu
19590 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65  eryIsAgg is true
195a0 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
195b0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
195c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
195d0 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
195e0 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
195f0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
19600 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
19610 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
19620 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
19630 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
19640 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
19650 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
19660 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
19670 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
19680 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
19690 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
196a0 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
196b0 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
196c0 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
196d0 53 75 62 71 75 65 72 79 28 0a 20 20 73 71 6c 69  Subquery(.  sqli
196e0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
196f0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
19700 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  nection */.  Sel
19710 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
19720 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
19730 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
19740 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
19750 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
19760 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
19770 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
19780 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
19790 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
197a0 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
197b0 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
197c0 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
197d0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
197e0 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
197f0 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
19800 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
19810 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
19820 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
19830 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
19840 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
19850 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
19860 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69  uery" */.  SrcLi
19870 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
19880 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
19890 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
198a0 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
198b0 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
198c0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
198d0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
198e0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
198f0 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
19900 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
19910 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
19920 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
19930 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
19940 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
19950 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
19960 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
19970 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
19980 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
19990 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
199a0 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
199c0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
199d0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
199e0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75  rcList_item *pSu
199f0 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20  bitem;   /* The 
19a00 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f  subquery */..  /
19a10 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
19a20 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
19a30 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
19a40 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
19a50 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  /.  if( p==0 ) r
19a60 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
19a70 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
19a80 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
19a90 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
19aa0 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
19ab0 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d  Subitem = &pSrc-
19ac0 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70 53 75  >a[iFrom];.  pSu
19ad0 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  b = pSubitem->pS
19ae0 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
19af0 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
19b00 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75  ( isAgg && subqu
19b10 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
19b20 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
19b30 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
19b40 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66  ion (1)  */.  if
19b50 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
19b60 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
19b70 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
19b80 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
19b90 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53  ion (2)  */.  pS
19ba0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
19bb0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
19bc0 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
19bd0 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
19be0 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
19bf0 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
19c00 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
19c10 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
19c20 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
19c30 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f  sssions, we allo
19c40 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69  wed some combini
19c50 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20  ng of LIMIT and 
19c60 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
19c70 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62  use they could b
19c80 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f  e computed at co
19c90 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74  mpile-time.  But
19ca0 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
19cb0 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
19cc0 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70  me arbitrary exp
19cd0 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72  ressions, we wer
19ce0 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20  e forced to add 
19cf0 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33  restrictions (13
19d00 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e  ).  ** and (14).
19d10 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
19d20 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69  pLimit && p->pLi
19d30 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19d50 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29  Restriction (13)
19d60 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
19d70 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e  pOffset ) return
19d80 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19da0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29  Restriction (14)
19db0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52 69   */.  if( p->pRi
19dc0 67 68 74 6d 6f 73 74 20 26 26 20 70 53 75 62 2d  ghtmost && pSub-
19dd0 3e 70 4c 69 6d 69 74 20 26 26 20 70 53 75 62 2d  >pLimit && pSub-
19de0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
19df0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
19e30 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d  tion (15) */.  }
19e40 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
19e50 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
19e60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
19e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
19e80 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
19e90 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e 69 73  .  if( (pSub->is
19ea0 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
19eb0 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20 20 20 20  ->pLimit) .     
19ec0 20 20 20 20 26 26 20 28 70 53 72 63 2d 3e 6e 53      && (pSrc->nS
19ed0 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
19ee0 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  {          /* Re
19ef0 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 28 35  strictions (4)(5
19f00 29 28 38 29 28 39 29 20 2a 2f 0a 20 20 20 20 20  )(8)(9) */.     
19f10 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
19f20 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 73  .  }.  if( p->is
19f30 44 69 73 74 69 6e 63 74 20 26 26 20 73 75 62 71  Distinct && subq
19f40 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
19f50 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
19f60 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29   Restriction (6)
19f70 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 64    */.  if( (p->d
19f80 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 7c  isallowOrderBy |
19f90 7c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 26  | p->pOrderBy) &
19fa0 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
19fb0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
19fc0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19ff0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29  Restriction (11)
1a000 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   */.  }.  if( is
1a010 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  Agg && pSub->pOr
1a020 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30  derBy ) return 0
1a030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a040 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1a050 28 31 36 29 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  (16) */..  /* Re
1a060 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66  striction 3:  If
1a070 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1a080 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75   a join, make su
1a090 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
1a0a0 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65  is .  ** not use
1a0b0 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f  d as the right o
1a0c0 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74  perand of an out
1a0d0 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c  er join.  Exampl
1a0e0 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  es of why this. 
1a0f0 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77   ** is not allow
1a100 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
1a110 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
1a120 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49  TER JOIN (t2 JOI
1a130 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N t3).  **.  ** 
1a140 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
1a150 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
1a160 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
1a170 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
1a180 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
1a190 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a  JOIN t3.  **.  *
1a1a0 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  * which is not a
1a1b0 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74  t all the same t
1a1c0 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  hing..  */.  if(
1a1d0 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31   pSubSrc->nSrc>1
1a1e0 20 26 26 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a   && (pSubitem->j
1a1f0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
1a200 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
1a210 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
1a220 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
1a230 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
1a240 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1a250 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
1a260 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
1a270 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
1a280 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
1a290 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
1a2a0 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
1a2b0 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
1a2c0 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1a2d0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1a2e0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1a2f0 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
1a300 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
1a310 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
1a320 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
1a330 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
1a340 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1a350 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
1a360 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
1a370 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
1a380 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
1a390 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
1a3a0 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
1a3b0 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
1a3c0 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
1a3d0 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
1a3e0 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
1a3f0 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
1a400 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69   */.  if( (pSubi
1a410 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
1a420 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 26 26 20  JT_OUTER)!=0 && 
1a430 70 53 75 62 2d 3e 70 57 68 65 72 65 21 3d 30 20  pSub->pWhere!=0 
1a440 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1a450 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
1a460 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
1a470 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74  t, it means flat
1a480 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
1a490 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ted for the.  **
1a4a0 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
1a4b0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1a4c0 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  se in the outer 
1a4d0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  query..  */..  /
1a4e0 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68  * Move all of th
1a4f0 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
1a500 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1a510 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  into the.  ** th
1a520 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1a530 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1a540 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  .  Before doing 
1a550 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20  this, remember. 
1a560 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
1a570 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
1a580 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
1a590 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
1a5a0 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  in.  ** iParent.
1a5b0 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
1a5c0 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
1a5d0 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
1a5e0 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77  uent code.  ** w
1a5f0 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73  ill scan express
1a600 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ions looking for
1a610 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e   iParent referen
1a620 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a  ces and replace.
1a630 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
1a640 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
1a650 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
1a660 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
1a670 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c  ery FROM.  ** el
1a680 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
1a690 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
1a6a0 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  */.  iParent = p
1a6b0 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
1a6c0 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ;.  {.    int nS
1a6d0 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
1a6e0 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a  >nSrc;.    int j
1a6f0 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74  ointype = pSubit
1a700 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20  em->jointype;.. 
1a710 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
1a720 54 61 62 6c 65 28 70 53 75 62 69 74 65 6d 2d 3e  Table(pSubitem->
1a730 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
1a740 65 33 5f 66 72 65 65 28 70 53 75 62 69 74 65 6d  e3_free(pSubitem
1a750 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
1a760 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1a770 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  Subitem->zName);
1a780 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1a790 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69  e(pSubitem->zAli
1a7a0 61 73 29 3b 0a 20 20 20 20 70 53 75 62 69 74 65  as);.    pSubite
1a7b0 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  m->pTab = 0;.   
1a7c0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1a7d0 62 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 53  base = 0;.    pS
1a7e0 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
1a7f0 30 3b 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d  0;.    pSubitem-
1a800 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  >zAlias = 0;.   
1a810 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
1a820 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 74 72  {.      int extr
1a830 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b  a = nSubSrc - 1;
1a840 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
1a850 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
1a860 0a 20 20 20 20 20 20 20 20 70 53 72 63 20 3d 20  .        pSrc = 
1a870 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1a880 70 65 6e 64 28 64 62 2c 20 70 53 72 63 2c 20 30  pend(db, pSrc, 0
1a890 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
1a8a0 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( pSrc==0 ){.   
1a8b0 20 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20 3d         p->pSrc =
1a8c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   0;.          re
1a8d0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
1a8e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1a8f0 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
1a900 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63        for(i=pSrc
1a910 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74 72  ->nSrc-1; i-extr
1a920 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a  a>=iFrom; i--){.
1a930 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b          pSrc->a[
1a940 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65  i] = pSrc->a[i-e
1a950 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  xtra];.      }. 
1a960 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
1a970 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
1a980 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  ){.      pSrc->a
1a990 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
1a9a0 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
1a9b0 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
1a9c0 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
1a9d0 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
1a9e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
1a9f0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e  c->a[iFrom].join
1aa00 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
1aa10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62  .  }..  /* Now b
1aa20 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
1aa30 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
1aa40 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
1aa50 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65  s for .  ** refe
1aa60 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50  rences to the iP
1aa70 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74  arent in the out
1aa80 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a  er query..  ** .
1aa90 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
1aaa0 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  **.  **   SELECT
1aab0 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
1aac0 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
1aad0 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
1aae0 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
1aaf0 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20    **   \        
1ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
1ab10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71  ___________ subq
1ab20 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  uery __________/
1ab30 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a            /.  **
1ab40 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
1ab50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
1ab60 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
1ab70 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1ab80 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a  _____/.  **.  **
1ab90 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72   We look at ever
1aba0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
1abb0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1abc0 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
1abd0 77 65 20 73 65 65 0a 20 20 2a 2a 20 22 61 22 20  we see.  ** "a" 
1abe0 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78  we substitute "x
1abf0 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c  *3" and every pl
1ac00 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77  ace we see "b" w
1ac10 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b  e substitute "y+
1ac20 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 70 4c 69 73  10"..  */.  pLis
1ac30 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
1ac40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1ac50 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1ac60 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
1ac70 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
1ac80 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26  a[i].zName==0 &&
1ac90 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   (pExpr = pList-
1aca0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70  >a[i].pExpr)->sp
1acb0 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  an.z!=0 ){.     
1acc0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1acd0 6d 65 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  me = .          
1ace0 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e     sqlite3DbStrN
1acf0 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
1ad00 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45  Expr->span.z, pE
1ad10 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  xpr->span.n);.  
1ad20 20 20 7d 0a 20 20 7d 0a 20 20 73 75 62 73 74 45    }.  }.  substE
1ad30 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
1ad40 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20  EList, iParent, 
1ad50 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1ad60 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
1ad70 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1ad80 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
1ad90 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1ada0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
1adb0 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48  stExpr(db, p->pH
1adc0 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
1add0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1ade0 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70   }.  if( pSub->p
1adf0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61  OrderBy ){.    a
1ae00 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
1ae10 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  By==0 );.    p->
1ae20 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
1ae30 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70  >pOrderBy;.    p
1ae40 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Sub->pOrderBy = 
1ae50 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
1ae60 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1ae70 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1ae80 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
1ae90 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1aea0 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69  pEList);.  }.  i
1aeb0 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
1aec0 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  ){.    pWhere = 
1aed0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1aee0 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 29  b, pSub->pWhere)
1aef0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1af00 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Where = 0;.  }. 
1af10 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
1af20 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  gg ){.    assert
1af30 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ( p->pHaving==0 
1af40 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
1af50 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  g = p->pWhere;. 
1af60 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70     p->pWhere = p
1af70 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74  Where;.    subst
1af80 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76  Expr(db, p->pHav
1af90 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
1afa0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1afb0 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71   p->pHaving = sq
1afc0 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1afd0 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20   p->pHaving, .  
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1b000 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1b010 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 29   pSub->pHaving))
1b020 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
1b030 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
1b040 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
1b050 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1b060 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  tDup(db, pSub->p
1b070 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73  GroupBy);.  }els
1b080 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e{.    substExpr
1b090 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  (db, p->pWhere, 
1b0a0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1b0b0 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
1b0c0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
1b0d0 78 70 72 41 6e 64 28 64 62 2c 20 70 2d 3e 70 57  xprAnd(db, p->pW
1b0e0 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  here, pWhere);. 
1b0f0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61   }..  /* The fla
1b100 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
1b110 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
1b120 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
1b130 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71  the.  ** outer q
1b140 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
1b150 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44  . .  */.  p->isD
1b160 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
1b170 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d  istinct || pSub-
1b180 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20  >isDistinct;..  
1b190 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e  /*.  ** SELECT .
1b1a0 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  .. FROM (SELECT 
1b1b0 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53  ... LIMIT a OFFS
1b1c0 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46  ET b) LIMIT x OF
1b1d0 46 53 45 54 20 79 3b 0a 20 20 2a 2a 0a 20 20 2a  FSET y;.  **.  *
1b1e0 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64  * One is tempted
1b1f0 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61   to try to add a
1b200 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e   and b to combin
1b210 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42  e the limits.  B
1b220 75 74 20 74 68 69 73 0a 20 20 2a 2a 20 64 6f 65  ut this.  ** doe
1b230 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
1b240 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
1b250 67 61 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 69  gative..  */.  i
1b260 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1b270 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  ){.    p->pLimit
1b280 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
1b290 0a 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69  .    pSub->pLimi
1b2a0 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t = 0;.  }..  /*
1b2b0 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
1b2c0 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
1b2d0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
1b2e0 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
1b2f0 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
1b300 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1b310 74 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75  te(pSub);.  retu
1b320 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
1b330 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
1b340 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  EW */../*.** Ana
1b350 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20  lyze the SELECT 
1b360 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
1b370 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
1b380 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20  to see if it.** 
1b390 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61  is a min() or ma
1b3a0 78 28 29 20 71 75 65 72 79 2e 20 52 65 74 75 72  x() query. Retur
1b3b0 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
1b3c0 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44  MIN or WHERE_ORD
1b3d0 45 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20  ERBY_MAX if .** 
1b3e0 69 74 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65  it is, or 0 othe
1b3f0 72 77 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e  rwise. At presen
1b400 74 2c 20 61 20 71 75 65 72 79 20 69 73 20 63 6f  t, a query is co
1b410 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a  nsidered to be.*
1b420 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20  * a min()/max() 
1b430 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  query if:.**.** 
1b440 20 20 31 2e 20 54 68 65 72 65 20 69 73 20 61 20    1. There is a 
1b450 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e  single object in
1b460 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1b470 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65  ..**.**   2. The
1b480 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65  re is a single e
1b490 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
1b4a0 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64   result set, and
1b4b0 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65   it is.**      e
1b4c0 69 74 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20  ither min(x) or 
1b4d0 6d 61 78 28 78 29 2c 20 77 68 65 72 65 20 78 20  max(x), where x 
1b4e0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65  is a column refe
1b4f0 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rence..*/.static
1b500 20 69 6e 74 20 6d 69 6e 4d 61 78 51 75 65 72 79   int minMaxQuery
1b510 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b520 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78  Select *p){.  Ex
1b530 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70  pr *pExpr;.  Exp
1b540 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
1b550 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66  p->pEList;..  if
1b560 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
1b570 3d 31 20 29 20 72 65 74 75 72 6e 20 57 48 45 52  =1 ) return WHER
1b580 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
1b590 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69  ;.  pExpr = pELi
1b5a0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
1b5b0 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
1b5c0 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  ->pList;.  if( p
1b5d0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
1b5e0 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 70 45 4c  _FUNCTION || pEL
1b5f0 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74  ist==0 || pEList
1b600 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
1b610 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 4c  urn 0;.  if( pEL
1b620 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
1b630 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
1b640 4d 4e 20 29 20 72 65 74 75 72 6e 20 57 48 45 52  MN ) return WHER
1b650 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
1b660 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74  ;.  if( pExpr->t
1b670 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75  oken.n!=3 ) retu
1b680 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
1b690 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66 28 20 73  _NORMAL;.  if( s
1b6a0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28  qlite3StrNICmp((
1b6b0 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
1b6c0 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30  en.z,"min",3)==0
1b6d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
1b6e0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
1b6f0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
1b700 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
1b710 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
1b720 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20  n.z,"max",3)==0 
1b730 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48  ){.    return WH
1b740 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b  ERE_ORDERBY_MAX;
1b750 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 48  .  }.  return WH
1b760 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
1b770 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  AL;.}../*.** Thi
1b780 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76  s routine resolv
1b790 65 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73 65  es any names use
1b7a0 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  d in the result 
1b7b0 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75  set of the.** su
1b7c0 70 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73 74  pplied SELECT st
1b7d0 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20  atement. If the 
1b7e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1b7f0 20 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a   being resolved.
1b800 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  ** is a sub-sele
1b810 63 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72 4e  ct, then pOuterN
1b820 43 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  C is a pointer t
1b830 6f 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78  o the NameContex
1b840 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72  t .** of the par
1b850 65 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69  ent SELECT..*/.i
1b860 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
1b870 52 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73 65  Resolve(.  Parse
1b880 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1b890 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
1b8a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1b8b0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1b8c0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
1b8d0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
1b8e0 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61  g coded. */.  Na
1b8f0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65  meContext *pOute
1b900 72 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74 65  rNC  /* The oute
1b910 72 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20  r name context. 
1b920 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
1b930 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
1b940 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  EList;          
1b950 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20 2a  /* Result set. *
1b960 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b980 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61  * For-loop varia
1b990 62 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c 74  ble used in mult
1b9a0 69 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20  iple places */. 
1b9b0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
1b9c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
1b9d0 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78  ocal name-contex
1b9e0 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
1b9f0 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 20  *pGroupBy;      
1ba00 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20 62    /* The group b
1ba10 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f  y clause */..  /
1ba20 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
1ba30 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65  e has run before
1ba40 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  , return immedia
1ba50 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70  tely. */.  if( p
1ba60 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a  ->isResolved ){.
1ba70 20 20 20 20 61 73 73 65 72 74 28 20 21 70 4f 75      assert( !pOu
1ba80 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74  terNC );.    ret
1ba90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1baa0 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76   }.  p->isResolv
1bab0 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66  ed = 1;..  /* If
1bac0 20 74 68 65 72 65 20 68 61 76 65 20 61 6c 72 65   there have alre
1bad0 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c  ady been errors,
1bae0 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a   do nothing. */.
1baf0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1bb00 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  rr>0 ){.    retu
1bb10 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1bb20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61  .  }..  /* Prepa
1bb30 72 65 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  re the select st
1bb40 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61  atement. This ca
1bb50 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65  ll will allocate
1bb60 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a   all cursors.  *
1bb70 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61  * required to ha
1bb80 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20  ndle the tables 
1bb90 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 69  and subqueries i
1bba0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1bbb0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72  e..  */.  if( pr
1bbc0 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61  epSelectStmt(pPa
1bbd0 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
1bbe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1bbf0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  OR;.  }..  /* Re
1bc00 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73  solve the expres
1bc10 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d  sions in the LIM
1bc20 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
1bc30 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a  auses. These.  *
1bc40 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  * are not allowe
1bc50 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e  d to refer to an
1bc60 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73  y names, so pass
1bc70 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f   an empty NameCo
1bc80 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65  ntext..  */.  me
1bc90 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
1bca0 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
1bcb0 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
1bcc0 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  e;.  if( sqlite3
1bcd0 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
1bce0 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74  (&sNC, p->pLimit
1bcf0 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ||.      sqlit
1bd00 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
1bd10 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66  es(&sNC, p->pOff
1bd20 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  set) ){.    retu
1bd30 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1bd40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75  .  }..  /* Set u
1bd50 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65  p the local name
1bd60 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73  -context to pass
1bd70 20 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65 4e   to ExprResolveN
1bd80 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20 72  ames() to.  ** r
1bd90 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65  esolve the expre
1bda0 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f  ssion-list..  */
1bdb0 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20  .  sNC.allowAgg 
1bdc0 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  = 1;.  sNC.pSrcL
1bdd0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
1bde0 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75   sNC.pNext = pOu
1bdf0 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65 73  terNC;..  /* Res
1be00 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68  olve names in th
1be10 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f  e result set. */
1be20 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
1be30 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70 45  EList;.  if( !pE
1be40 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20 53 51  List ) return SQ
1be50 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f  LITE_ERROR;.  fo
1be60 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
1be70 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1be80 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 4c    Expr *pX = pEL
1be90 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
1bea0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1beb0 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
1bec0 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20  (&sNC, pX) ){.  
1bed0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bee0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
1bef0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
1bf00 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61  e are no aggrega
1bf10 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  te functions in 
1bf20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20  the result-set, 
1bf30 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
1bf40 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
1bf50 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  , do not allow a
1bf60 67 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e 79  ggregates in any
1bf70 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65 78   of the other ex
1bf80 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
1bf90 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73    assert( !p->is
1bfa0 41 67 67 20 29 3b 0a 20 20 70 47 72 6f 75 70 42  Agg );.  pGroupB
1bfb0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
1bfc0 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20  .  if( pGroupBy 
1bfd0 7c 7c 20 73 4e 43 2e 68 61 73 41 67 67 20 29 7b  || sNC.hasAgg ){
1bfe0 0a 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d 20  .    p->isAgg = 
1bff0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
1c000 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30  sNC.allowAgg = 0
1c010 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
1c020 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69   HAVING clause i
1c030 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  s present, then 
1c040 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
1c050 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
1c060 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
1c070 48 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f 75  Having && !pGrou
1c080 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBy ){.    sqlit
1c090 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c0a0 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63  e, "a GROUP BY c
1c0b0 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65  lause is require
1c0c0 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22  d before HAVING"
1c0d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1c0e0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1c0f0 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 78  .  /* Add the ex
1c100 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
1c110 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78   the name-contex
1c120 74 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67  t before parsing
1c130 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20   the.  ** other 
1c140 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
1c150 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1c160 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20  ent. This is so 
1c170 74 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65 73  that.  ** expres
1c180 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45  sions in the WHE
1c190 52 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29  RE clause (etc.)
1c1a0 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78   can refer to ex
1c1b0 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 2a  pressions by.  *
1c1c0 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68 65  * aliases in the
1c1d0 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a   result set..  *
1c1e0 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69  *.  ** Minor poi
1c1f0 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73 20 74  nt: If this is t
1c200 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
1c210 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c  e expression wil
1c220 6c 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76 61  l be.  ** re-eva
1c230 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  luated for each 
1c240 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e  reference to it.
1c250 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c 69  .  */.  sNC.pELi
1c260 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
1c270 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1c280 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
1c290 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 7c  NC, p->pWhere) |
1c2a0 7c 0a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  |.     sqlite3Ex
1c2b0 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
1c2c0 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  sNC, p->pHaving)
1c2d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1c2e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
1c2f0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
1c300 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
1c310 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
1c320 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  By(pParse, p, p-
1c330 3e 70 4f 72 64 65 72 42 79 2c 20 31 2c 20 26 73  >pOrderBy, 1, &s
1c340 4e 43 2e 68 61 73 41 67 67 29 20 29 7b 0a 20 20  NC.hasAgg) ){.  
1c350 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c360 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
1c370 20 7d 0a 20 20 69 66 28 20 70 72 6f 63 65 73 73   }.  if( process
1c380 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
1c390 72 73 65 2c 20 70 2c 20 70 47 72 6f 75 70 42 79  rse, p, pGroupBy
1c3a0 2c 20 30 2c 20 26 73 4e 43 2e 68 61 73 41 67 67  , 0, &sNC.hasAgg
1c3b0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1c3c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1c3d0 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  }..  if( pParse-
1c3e0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1c3f0 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
1c400 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1c410 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
1c420 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  e the GROUP BY c
1c430 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 63  lause does not c
1c440 6f 6e 74 61 69 6e 20 61 67 67 72 65 67 61 74 65  ontain aggregate
1c450 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
1c460 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20  .  if( pGroupBy 
1c470 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
1c480 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1c490 65 6d 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69  em;.  .    for(i
1c4a0 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  =0, pItem=pGroup
1c4b0 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42  By->a; i<pGroupB
1c4c0 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  y->nExpr; i++, p
1c4d0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Item++){.      i
1c4e0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1c4f0 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  ty(pItem->pExpr,
1c500 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20   EP_Agg) ){.    
1c510 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1c520 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 67 67  Msg(pParse, "agg
1c530 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1c540 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
1c550 20 69 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20   in ".          
1c560 20 20 22 74 68 65 20 47 52 4f 55 50 20 42 59 20    "the GROUP BY 
1c570 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 20 20  clause");.      
1c580 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c590 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
1c5a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1c5b0 66 20 74 68 69 73 20 69 73 20 6f 6e 65 20 53 45  f this is one SE
1c5c0 4c 45 43 54 20 6f 66 20 61 20 63 6f 6d 70 6f 75  LECT of a compou
1c5d0 6e 64 2c 20 62 65 20 73 75 72 65 20 74 6f 20 72  nd, be sure to r
1c5e0 65 73 6f 6c 76 65 20 6e 61 6d 65 73 0a 20 20 2a  esolve names.  *
1c5f0 2a 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 53  * in the other S
1c600 45 4c 45 43 54 73 2e 0a 20 20 2a 2f 0a 20 20 69  ELECTs..  */.  i
1c610 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
1c620 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1c630 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
1c640 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f  pParse, p->pPrio
1c650 72 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  r, pOuterNC);.  
1c660 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
1c670 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1c680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
1c690 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
1c6a0 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
1c6b0 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61   The aggregate a
1c6c0 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20  ccumulator is a 
1c6d0 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  set of memory ce
1c6e0 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a  lls that hold.**
1c6f0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
1c700 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63  sults while calc
1c710 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65  ulating an aggre
1c720 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72  gate.  This.** r
1c730 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74  outine simply st
1c740 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
1c750 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
1c760 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  y cells..*/.stat
1c770 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63  ic void resetAcc
1c780 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
1c790 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
1c7a0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
1c7b0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1c7c0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
1c7d0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1c7e0 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  _func *pFunc;.  
1c7f0 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  if( pAggInfo->nF
1c800 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  unc+pAggInfo->nC
1c810 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  olumn==0 ){.    
1c820 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f  return;.  }.  fo
1c830 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
1c840 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  o->nColumn; i++)
1c850 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1c860 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1c870 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d  ll, 0, pAggInfo-
1c880 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a  >aCol[i].iMem);.
1c890 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d    }.  for(pFunc=
1c8a0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
1c8b0 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
1c8c0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
1c8d0 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  unc++){.    sqli
1c8e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c8f0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75   OP_Null, 0, pFu
1c900 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69  nc->iMem);.    i
1c910 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  f( pFunc->iDisti
1c920 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
1c930 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63  Expr *pE = pFunc
1c940 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->pExpr;.      i
1c950 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d 30 20  f( pE->pList==0 
1c960 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45  || pE->pList->nE
1c970 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
1c980 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1c990 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
1c9a0 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61 74 65  NCT in aggregate
1c9b0 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65   must be followe
1c9c0 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  d ".           "
1c9d0 62 79 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  by an expression
1c9e0 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
1c9f0 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
1ca00 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1ca10 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
1ca20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
1ca30 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
1ca40 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73  pParse, pE->pLis
1ca50 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
1ca60 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1ca70 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1ca80 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  l, pFunc->iDisti
1ca90 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cab0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1cac0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
1cad0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
1cae0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
1caf0 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
1cb00 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
1cb10 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
1cb20 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1cb30 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
1cb40 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
1cb50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1cb60 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
1cb70 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
1cb80 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
1cb90 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
1cba0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1cbb0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1cbc0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
1cbd0 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
1cbe0 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
1cbf0 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
1cc00 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
1cc10 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
1cc20 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
1cc30 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
1cc40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cc50 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p4(v, OP_AggFina
1cc60 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
1cc70 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
1cc80 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  r : 0, 0,.      
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cca0 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
1ccb0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
1ccc0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
1ccd0 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
1cce0 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
1ccf0 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
1cd00 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
1cd10 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
1cd20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
1cd30 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
1cd40 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
1cd50 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
1cd60 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1cd70 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1cd80 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1cd90 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1cda0 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73  fo_func *pF;.  s
1cdb0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
1cdc0 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e  l *pC;..  pAggIn
1cdd0 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
1cde0 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   1;.  for(i=0, p
1cdf0 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
1ce00 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
1ce10 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
1ce20 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  {.    int nArg;.
1ce30 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
1ce40 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
1ce50 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  gAgg;.    ExprLi
1ce60 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
1ce70 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
1ce80 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
1ce90 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
1cea0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
1ceb0 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33  regAgg = sqlite3
1cec0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
1ced0 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  rse, nArg);.    
1cee0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1cef0 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
1cf00 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c  , pList, regAgg,
1cf10 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1cf20 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a        nArg = 0;.
1cf30 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 30        regAgg = 0
1cf40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1cf50 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  pF->iDistinct>=0
1cf60 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65   ){.      addrNe
1cf70 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
1cf80 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1cf90 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
1cfa0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==1 );.      cod
1cfb0 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
1cfc0 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c  , pF->iDistinct,
1cfd0 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65   addrNext, 1, re
1cfe0 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gAgg);.    }.   
1cff0 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e   if( pF->pFunc->
1d000 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20  needCollSeq ){. 
1d010 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
1d020 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  oll = 0;.      s
1d030 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1d040 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
1d050 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61    int j;.      a
1d060 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
1d070 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20  );  /* pList!=0 
1d080 69 66 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65  if pF->pFunc->ne
1d090 65 64 43 6f 6c 6c 53 65 71 20 69 73 20 74 72 75  edCollSeq is tru
1d0a0 65 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a  e */.      for(j
1d0b0 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
1d0c0 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c  >a; !pColl && j<
1d0d0 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d  nArg; j++, pItem
1d0e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  ++){.        pCo
1d0f0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1d100 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1d110 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
1d120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1d130 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
1d140 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73     pColl = pPars
1d150 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
1d160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d170 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d180 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
1d190 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20   0, 0, 0, (char 
1d1a0 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
1d1b0 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  SEQ);.    }.    
1d1c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d1d0 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c  4(v, OP_AggStep,
1d1e0 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e   0, regAgg, pF->
1d1f0 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  iMem,.          
1d200 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1d210 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  d*)pF->pFunc, P4
1d220 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73  _FUNCDEF);.    s
1d230 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1d240 50 35 28 76 2c 20 6e 41 72 67 29 3b 0a 20 20 20  P5(v, nArg);.   
1d250 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1d260 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1d270 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
1d280 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1d290 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
1d2a0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
1d2b0 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66  g, nArg);.    if
1d2c0 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20  ( addrNext ){.  
1d2d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1d2e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
1d2f0 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a  ddrNext);.    }.
1d300 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70    }.  for(i=0, p
1d310 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
1d320 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
1d330 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
1d340 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
1d350 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1d360 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70  se, pC->pExpr, p
1d370 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  C->iMem);.  }.  
1d380 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
1d390 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  Mode = 0;.}..#if
1d3a0 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75   0./*.** This fu
1d3b0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 77  nction is used w
1d3c0 68 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  hen a SELECT sta
1d3d0 74 65 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74  tement is used t
1d3e0 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 74 65  o create a.** te
1d3f0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 66 6f  mporary table fo
1d400 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
1d410 75 67 68 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ugh when running
1d420 20 61 6e 20 49 4e 53 54 45 41 44 20 4f 46 0a 2a   an INSTEAD OF.*
1d430 2a 20 55 50 44 41 54 45 20 6f 72 20 49 4e 53 54  * UPDATE or INST
1d440 45 41 44 20 4f 46 20 44 45 4c 45 54 45 20 74 72  EAD OF DELETE tr
1d450 69 67 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  igger. .**.** If
1d460 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 53   possible, the S
1d470 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1d480 69 73 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74  is modified so t
1d490 68 61 74 20 4e 55 4c 4c 20 76 61 6c 75 65 73 0a  hat NULL values.
1d4a0 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
1d4b0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
1d4c0 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 63 6f 6c  able for all col
1d4d0 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74  umns for which t
1d4e0 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  he .** correspon
1d4f0 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75  ding bit in argu
1d500 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 6e 6f 74  ment mask is not
1d510 20 73 65 74 2e 20 49 66 20 6d 61 73 6b 20 74 61   set. If mask ta
1d520 6b 65 73 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  kes the.** speci
1d530 61 6c 20 76 61 6c 75 65 20 30 78 66 66 66 66 66  al value 0xfffff
1d540 66 66 66 2c 20 74 68 65 6e 20 61 6c 6c 20 63 6f  fff, then all co
1d550 6c 75 6d 6e 73 20 61 72 65 20 70 6f 70 75 6c 61  lumns are popula
1d560 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
1d570 69 74 65 33 53 65 6c 65 63 74 4d 61 73 6b 28 50  ite3SelectMask(P
1d580 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
1d590 6c 65 63 74 20 2a 70 2c 20 75 33 32 20 6d 61 73  lect *p, u32 mas
1d5a0 6b 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 21  k){.  if( p && !
1d5b0 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 21 70 2d  p->pPrior && !p-
1d5c0 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 6d  >isDistinct && m
1d5d0 61 73 6b 21 3d 30 78 66 66 66 66 66 66 66 66 20  ask!=0xffffffff 
1d5e0 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
1d5f0 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  *pEList;.    int
1d600 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   i;.    sqlite3S
1d610 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61  electResolve(pPa
1d620 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  rse, p, 0);.    
1d630 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
1d640 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  st;.    for(i=0;
1d650 20 70 45 4c 69 73 74 20 26 26 20 69 3c 70 45 4c   pEList && i<pEL
1d660 69 73 74 2d 3e 6e 45 78 70 72 20 26 26 20 69 3c  ist->nExpr && i<
1d670 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  32; i++){.      
1d680 69 66 28 20 21 28 6d 61 73 6b 26 28 28 75 33 32  if( !(mask&((u32
1d690 29 31 3c 3c 69 29 29 20 29 7b 0a 20 20 20 20 20  )1<<i)) ){.     
1d6a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1d6b0 6c 65 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  lete(pEList->a[i
1d6c0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
1d6d0 20 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70    pEList->a[i].p
1d6e0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
1d6f0 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54  pr(pParse->db, T
1d700 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29  K_NULL, 0, 0, 0)
1d710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d720 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
1d730 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1d740 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
1d750 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1d760 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
1d770 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75  lts are distribu
1d780 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77  ted in various w
1d790 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ays depending on
1d7a0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
1d7b0 20 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65   of the SelectDe
1d7c0 73 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  st structure poi
1d7d0 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d  nted to by argum
1d7e0 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20  ent pDest.** as 
1d7f0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1d800 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20     pDest->eDest 
1d810 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20     Result.**    
1d820 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20   ------------   
1d830 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
1d840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
1d860 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b      SRT_Callback
1d870 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63      Invoke the c
1d880 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68  allback for each
1d890 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
1d8a0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  lt..**.**     SR
1d8b0 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74  T_Mem         St
1d8c0 6f 72 65 20 66 69 72 73 74 20 72 65 73 75 6c 74  ore first result
1d8d0 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
1d8e0 70 44 65 73 74 2d 3e 69 50 61 72 6d 0a 2a 2a 0a  pDest->iParm.**.
1d8f0 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20  **     SRT_Set  
1d900 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
1d910 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66 20  ults as keys of 
1d920 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
1d930 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  rm. .**         
1d940 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70 6c              Appl
1d950 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 70  y the affinity p
1d960 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 62  Dest->affinity b
1d970 65 66 6f 72 65 20 73 74 6f 72 69 6e 67 20 74 68  efore storing th
1d980 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  em..**.**     SR
1d990 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74  T_Union       St
1d9a0 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61  ore results as a
1d9b0 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72   key in a tempor
1d9c0 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
1d9d0 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20  >iParm..**.**   
1d9e0 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20    SRT_Except    
1d9f0 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73    Remove results
1da00 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72   from the tempor
1da10 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
1da20 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20  >iParm..**.**   
1da30 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20    SRT_Table     
1da40 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
1da50 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
1da60 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 0a  le pDest->iParm.
1da70 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 70  **.**     SRT_Ep
1da80 68 65 6d 54 61 62 20 20 20 20 43 72 65 61 74 65  hemTab    Create
1da90 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   an temporary ta
1daa0 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
1dab0 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 20 20   and store.**   
1dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dad0 20 20 74 68 65 20 72 65 73 75 6c 74 20 74 68 65    the result the
1dae0 72 65 2e 20 54 68 65 20 63 75 72 73 6f 72 20 69  re. The cursor i
1daf0 73 20 6c 65 66 74 20 6f 70 65 6e 20 61 66 74 65  s left open afte
1db00 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
1db10 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 69           returni
1db20 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  ng..**.**     SR
1db30 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 49 6e  T_Coroutine   In
1db40 76 6f 6b 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e  voke a co-routin
1db50 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 61 20 73  e to compute a s
1db60 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 0a 2a 2a  ingle row of .**
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db80 20 20 20 20 20 74 68 65 20 72 65 73 75 6c 74 0a       the result.
1db90 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
1dba0 69 73 74 73 20 20 20 20 20 20 53 74 6f 72 65 20  ists      Store 
1dbb0 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  a 1 in memory ce
1dbc0 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  ll pDest->iParm 
1dbd0 69 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  if the result.**
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbf0 20 20 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20       set is not 
1dc00 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  empty..**.**    
1dc10 20 53 52 54 5f 44 69 73 63 61 72 64 20 20 20 20   SRT_Discard    
1dc20 20 54 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c   Throw the resul
1dc30 74 73 20 61 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53  ts away..**.** S
1dc40 65 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e  ee the selectInn
1dc50 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f  erLoop() functio
1dc60 6e 20 66 6f 72 20 61 20 63 61 6e 6f 6e 69 63 61  n for a canonica
1dc70 6c 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  l listing of the
1dc80 20 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 76 61 6c   .** allowed val
1dc90 75 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64  ues of eDest and
1dca0 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e   their meanings.
1dcb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1dcc0 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
1dcd0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
1dce0 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
1dcf0 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
1dd00 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
1dd10 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
1dd20 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
1dd30 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
1dd40 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
1dd50 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
1dd60 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
1dd70 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
1dd80 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
1dd90 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1dda0 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
1ddb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72  ..**.** The pPar
1ddc0 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20  ent, parentTab, 
1ddd0 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20  and *pParentAgg 
1dde0 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65  fields are fille
1ddf0 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  d in if this.** 
1de00 53 45 4c 45 43 54 20 69 73 20 61 20 73 75 62 71  SELECT is a subq
1de10 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74  uery.  This rout
1de20 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63  ine may try to c
1de30 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45  ombine this SELE
1de40 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70  CT.** with its p
1de50 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20  arent to form a 
1de60 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72  single flat quer
1de70 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c  y.  In so doing,
1de80 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61   it might.** cha
1de90 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74 20 71  nge the parent q
1dea0 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d  uery from a non-
1deb0 61 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20  aggregate to an 
1dec0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
1ded0 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61  .** For that rea
1dee0 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74  son, the pParent
1def0 41 67 67 20 66 6c 61 67 20 69 73 20 70 61 73 73  Agg flag is pass
1df00 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c  ed as a pointer,
1df10 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65   so it.** can be
1df20 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
1df30 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65  Example 1:   The
1df40 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
1df50 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65  pParent paramete
1df60 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  r..**.**    SELE
1df70 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49  CT * FROM t1 JOI
1df80 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75  N (SELECT x, cou
1df90 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a  nt(*) FROM t2) J
1dfa0 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20  OIN t3;.**    \ 
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfc0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75       \_______ su
1dfd0 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20  bquery _______/ 
1dfe0 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20         /.**     
1dff0 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
1e000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e020 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20         /.**     
1e030 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
1e040 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
1e050 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
1e060 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68  ______/.**.** Th
1e070 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1e080 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74  lled for the out
1e090 65 72 20 71 75 65 72 79 20 66 69 72 73 74 2e 20  er query first. 
1e0a0 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c    For that call,
1e0b0 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c  .** pParent will
1e0c0 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e   be NULL.  Durin
1e0d0 67 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  g the processing
1e0e0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1e0f0 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f  ery, this .** ro
1e100 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1e110 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68  recursively to h
1e120 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75 65  andle the subque
1e130 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63  ry.  For the rec
1e140 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20  ursive.** call, 
1e150 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69  pParent will poi
1e160 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  nt to the outer 
1e170 71 75 65 72 79 2e 20 20 42 65 63 61 75 73 65 20  query.  Because 
1e180 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a  the subquery is.
1e190 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c  ** the second el
1e1a0 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65  ement in a three
1e1b0 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70  -way join, the p
1e1c0 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74  arentTab paramet
1e1d0 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20  er will.** be 1 
1e1e0 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f  (the 2nd value o
1e1f0 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72  f a 0-indexed ar
1e200 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ray.).*/.int sql
1e210 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
1e220 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1e230 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
1e240 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
1e250 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1e260 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
1e270 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
1e280 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
1e290 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
1e2a0 73 74 2c 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st,     /* What 
1e2b0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
1e2c0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
1e2d0 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
1e2e0 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  t,       /* Anot
1e2f0 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77  her SELECT for w
1e300 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73  hich this is a s
1e310 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ub-query */.  in
1e320 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20  t parentTab,    
1e330 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
1e340 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f   pParent->pSrc o
1e350 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  f this query */.
1e360 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67    int *pParentAg
1e370 67 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  g,       /* True
1e380 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73   if pParent uses
1e390 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1e3a0 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ions */.  char *
1e3b0 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  aff             
1e3c0 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20   /* If eDest is 
1e3d0 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61  SRT_Union, the a
1e3e0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
1e3f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
1e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e410 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
1e420 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
1e430 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
1e440 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
1e450 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
1e460 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
1e470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e480 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
1e490 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1e4a0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
1e4b0 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
1e4c0 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
1e4d0 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
1e4e0 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
1e4f0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
1e500 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1e510 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
1e520 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
1e530 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
1e540 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
1e550 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
1e560 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
1e570 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
1e580 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1e590 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
1e5a0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
1e5b0 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68  rderBy;    /* Th
1e5c0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1e5d0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
1e5e0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1e5f0 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
1e600 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
1e610 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
1e620 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
1e630 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
1e640 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
1e650 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
1e660 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69  */.  int isDisti
1e670 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
1e680 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
1e690 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
1e6a0 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
1e6b0 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  distinct;       
1e6c0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75     /* Table to u
1e6d0 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
1e6e0 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  nct set */.  int
1e6f0 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20   rc = 1;        
1e700 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
1e710 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73  return from this
1e720 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
1e730 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  nt addrSortIndex
1e740 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
1e750 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70   of an OP_OpenEp
1e760 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
1e770 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  ion */.  AggInfo
1e780 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
1e790 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
1e7a0 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
1e7b0 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
1e7c0 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
1e7d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1e7e0 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
1e7f0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
1e800 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
1e810 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1e820 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1e830 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  /..  db = pParse
1e840 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ->db;.  if( p==0
1e850 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1e860 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
1e870 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
1e880 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
1e890 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1e8a0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1e8b0 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
1e8c0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
1e8d0 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
1e8e0 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
1e8f0 6e 66 6f 29 29 3b 0a 0a 20 20 70 4f 72 64 65 72  nfo));..  pOrder
1e900 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1e910 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ;.  if( Ignorabl
1e920 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
1e930 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  ){.    p->pOrder
1e940 42 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  By = 0;..    /* 
1e950 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 74  In these cases t
1e960 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 65 72  he DISTINCT oper
1e970 61 74 6f 72 20 6d 61 6b 65 73 20 6e 6f 20 64 69  ator makes no di
1e980 66 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  fference to the.
1e990 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2c 20      ** results, 
1e9a0 73 6f 20 72 65 6d 6f 76 65 20 69 74 20 69 66 20  so remove it if 
1e9b0 69 74 20 77 65 72 65 20 73 70 65 63 69 66 69 65  it were specifie
1e9c0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  d..    */.    as
1e9d0 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73  sert(pDest->eDes
1e9e0 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c  t==SRT_Exists ||
1e9f0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1ea00 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20  RT_Union || .   
1ea10 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
1ea20 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74  Dest==SRT_Except
1ea30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
1ea40 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a  ==SRT_Discard);.
1ea50 20 20 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63      p->isDistinc
1ea60 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
1ea70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
1ea80 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c  solve(pParse, p,
1ea90 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   0) ){.    goto 
1eaa0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
1eab0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1eac0 70 4f 72 64 65 72 42 79 3b 0a 0a 23 69 66 6e 64  pOrderBy;..#ifnd
1ead0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
1eae0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
1eaf0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
1eb00 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f  are a sequence o
1eb10 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68  f queries, do th
1eb20 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66  e earlier ones f
1eb30 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irst..  */.  if(
1eb40 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
1eb50 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d    if( p->pRightm
1eb60 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ost==0 ){.      
1eb70 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a  Select *pLoop, *
1eb80 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  pRight = 0;.    
1eb90 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
1eba0 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63       int mxSelec
1ebb0 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f  t;.      for(pLo
1ebc0 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
1ebd0 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
1ebe0 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20  , cnt++){.      
1ebf0 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d    pLoop->pRightm
1ec00 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ost = p;.       
1ec10 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20   pLoop->pNext = 
1ec20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
1ec30 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a  pRight = pLoop;.
1ec40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 78        }.      mx
1ec50 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69  Select = db->aLi
1ec60 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
1ec70 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
1ec80 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53  ];.      if( mxS
1ec90 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d 78 53  elect && cnt>mxS
1eca0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
1ecb0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1ecc0 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
1ecd0 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70  ny terms in comp
1ece0 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20  ound SELECT");. 
1ecf0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
1ed00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ed10 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
1ed20 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
1ed30 20 70 44 65 73 74 2c 20 61 66 66 29 3b 0a 20 20   pDest, aff);.  
1ed40 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
1ed50 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73  ake local copies
1ed60 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
1ed70 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  rs for this quer
1ed80 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69  y..  */.  pTabLi
1ed90 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
1eda0 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
1edb0 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d  re;.  pGroupBy =
1edc0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
1edd0 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
1ede0 76 69 6e 67 3b 0a 20 20 69 73 41 67 67 20 3d 20  ving;.  isAgg = 
1edf0 70 2d 3e 69 73 41 67 67 3b 0a 20 20 69 73 44 69  p->isAgg;.  isDi
1ee00 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
1ee10 73 74 69 6e 63 74 3b 0a 20 20 70 45 4c 69 73 74  stinct;.  pEList
1ee20 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
1ee30 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20  if( pEList==0 ) 
1ee40 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1ee50 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20  ..  /* .  ** Do 
1ee60 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74  not even attempt
1ee70 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79   to generate any
1ee80 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76 65   code if we have
1ee90 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20   already seen.  
1eea0 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65  ** errors before
1eeb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   this routine st
1eec0 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  arts..  */.  if(
1eed0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
1eee0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1eef0 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74  d;..  /* If writ
1ef00 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72  ing to memory or
1ef10 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65   generating a se
1ef20 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  t.  ** only a si
1ef30 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20  ngle column may 
1ef40 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
1ef50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ef60 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69  MIT_SUBQUERY.  i
1ef70 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  f( checkForMulti
1ef80 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
1ef90 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c  r(pParse, pDest,
1efa0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20   pEList->nExpr) 
1efb0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
1efc0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
1efd0 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42  if..  /* ORDER B
1efe0 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  Y is ignored for
1eff0 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f   some destinatio
1f000 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ns..  */.  if( I
1f010 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
1f020 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 4f  pDest) ){.    pO
1f030 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
1f040 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
1f050 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
1f060 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
1f070 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1f080 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
1f090 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
1f0a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1f0b0 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
1f0c0 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
1f0d0 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
1f0e0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1f0f0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1f100 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1f110 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
1f120 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
1f130 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
1f140 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
1f150 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
1f160 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
1f170 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
1f180 65 78 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ext;.    struct 
1f190 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1f1a0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
1f1b0 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
1f1c0 74 44 65 73 74 20 64 65 73 74 3b 0a 0a 20 20 20  tDest dest;..   
1f1d0 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
1f1e0 65 63 74 3d 3d 30 20 7c 7c 20 70 49 74 65 6d 2d  ect==0 || pItem-
1f1f0 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29 20 63  >isPopulated ) c
1f200 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
1f210 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30   pItem->zName!=0
1f220 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64   ){.      zSaved
1f230 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
1f240 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1f250 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  xt;.      pParse
1f260 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
1f270 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20   pItem->zName;. 
1f280 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
1f290 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20  Context = 1;.   
1f2a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65   }else{.      ne
1f2b0 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
1f2c0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1f2d0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72  /* Increment Par
1f2e0 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68  se.nHeight by th
1f2f0 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20  e height of the 
1f300 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69  largest expressi
1f310 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72  on.    ** tree r
1f320 65 66 65 72 65 64 20 74 6f 20 62 79 20 74 68 69  efered to by thi
1f330 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65  s, the parent se
1f340 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20  lect. The child 
1f350 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61  select.    ** ma
1f360 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73  y contain expres
1f370 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74  sion trees of at
1f380 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51   most.    ** (SQ
1f390 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
1f3a0 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68  PTH-Parse.nHeigh
1f3b0 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20  t) height. This 
1f3c0 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20  is a bit.    ** 
1f3d0 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76  more conservativ
1f3e0 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  e than necessary
1f3f0 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65  , but much easie
1f400 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67  r than enforcing
1f410 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74  .    ** an exact
1f420 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   limit..    */. 
1f430 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
1f440 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht += sqlite3Sel
1f450 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
1f460 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
1f470 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
1f480 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
1f490 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
1f4a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
1f4b0 65 63 74 28 70 50 61 72 73 65 2c 20 70 49 74 65  ect(pParse, pIte
1f4c0 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 26 64 65 73  m->pSelect, &des
1f4d0 74 2c 20 70 2c 20 69 2c 20 26 69 73 41 67 67 2c  t, p, i, &isAgg,
1f4e0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
1f4f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1f500 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
1f510 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
1f520 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
1f530 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
1f540 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
1f550 0a 20 20 20 20 69 66 28 20 6e 65 65 64 52 65 73  .    if( needRes
1f560 74 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20  toreContext ){. 
1f570 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
1f580 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
1f590 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  edAuthContext;. 
1f5a0 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
1f5b0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
1f5c0 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
1f5d0 65 72 65 3b 0a 20 20 20 20 69 66 28 20 21 49 67  ere;.    if( !Ig
1f5e0 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
1f5f0 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70  Dest) ){.      p
1f600 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1f610 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20  derBy;.    }.   
1f620 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
1f630 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61  GroupBy;.    pHa
1f640 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
1f650 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  g;.    isDistinc
1f660 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
1f670 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  t;.  }.#endif.. 
1f680 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1f690 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 75   if this is a su
1f6a0 62 71 75 65 72 79 20 74 68 61 74 20 63 61 6e 20  bquery that can 
1f6b0 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69  be "flattened" i
1f6c0 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a  nto its parent..
1f6d0 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69    ** If flatteni
1f6e0 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69  ng is a possibli
1f6f0 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65  ty, do so and re
1f700 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
1f710 2e 20 20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  .  .  */.#ifndef
1f720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
1f730 57 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  W.  if( pParent 
1f740 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26 26  && pParentAgg &&
1f750 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75  .      flattenSu
1f760 62 71 75 65 72 79 28 64 62 2c 20 70 50 61 72 65  bquery(db, pPare
1f770 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a  nt, parentTab, *
1f780 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67  pParentAgg, isAg
1f790 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  g) ){.    if( is
1f7a0 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67  Agg ) *pParentAg
1f7b0 67 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  g = 1;.    goto 
1f7c0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
1f7d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1f7e0 70 6f 73 73 69 62 6c 65 2c 20 72 65 77 72 69 74  possible, rewrit
1f7f0 65 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 75  e the query to u
1f800 73 65 20 47 52 4f 55 50 20 42 59 20 69 6e 73 74  se GROUP BY inst
1f810 65 61 64 20 6f 66 20 44 49 53 54 49 4e 43 54 2e  ead of DISTINCT.
1f820 0a 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d  .  ** GROUP BY m
1f830 61 79 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2c  ay use an index,
1f840 20 44 49 53 54 49 4e 43 54 20 6e 65 76 65 72 20   DISTINCT never 
1f850 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  does..  */.  if(
1f860 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26   p->isDistinct &
1f870 26 20 21 70 2d 3e 69 73 41 67 67 20 26 26 20 21  & !p->isAgg && !
1f880 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  p->pGroupBy ){. 
1f890 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d     p->pGroupBy =
1f8a0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1f8b0 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
1f8c0 74 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79  t);.    pGroupBy
1f8d0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
1f8e0 20 20 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63      p->isDistinc
1f8f0 74 20 3d 20 30 3b 0a 20 20 20 20 69 73 44 69 73  t = 0;.    isDis
1f900 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  tinct = 0;.  }..
1f910 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1f920 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1f930 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73  use, then this s
1f940 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  orting.  ** inde
1f950 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  x might end up b
1f960 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74  eing unused if t
1f970 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a  he data can be .
1f980 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69    ** extracted i
1f990 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
1f9a0 65 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  er.  If that is 
1f9b0 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
1f9c0 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45  he.  ** OP_OpenE
1f9d0 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
1f9e0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61  tion will be cha
1f9f0 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f  nged to an OP_No
1fa00 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20  op once.  ** we 
1fa10 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
1fa20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
1fa30 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e  x is not needed.
1fa40 20 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e    The addrSortIn
1fa50 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  dex.  ** variabl
1fa60 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63  e is used to fac
1fa70 69 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61  ilitate that cha
1fa80 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
1fa90 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1faa0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1fab0 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
1fac0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
1fad0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
1fae0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72  rderBy);.    pOr
1faf0 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20  derBy->iECursor 
1fb00 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1fb10 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  ;.    p->addrOpe
1fb20 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53  nEphm[2] = addrS
1fb30 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20  ortIndex =.     
1fb40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fb50 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
1fb60 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
1fb90 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d  ursor, pOrderBy-
1fba0 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbc0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1fbd0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
1fbe0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
1fbf0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53  }else{.    addrS
1fc00 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
1fc10 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1fc20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
1fc30 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
1fc40 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
1fc50 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
1fc60 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
1fc70 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
1fc80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1fc90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1fca0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
1fcb0 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c  Dest->iParm, pEL
1fcc0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
1fcd0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c  ..  /* Set the l
1fce0 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  imiter..  */.  i
1fcf0 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
1fd00 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1fd10 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
1fd20 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
1fd30 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f  , iEnd);..  /* O
1fd40 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e  pen a virtual in
1fd50 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74  dex to use for t
1fd60 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e  he distinct set.
1fd70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69  .  */.  if( isDi
1fd80 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65  stinct ){.    Ke
1fd90 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
1fda0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 41  .    assert( isA
1fdb0 67 67 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29  gg || pGroupBy )
1fdc0 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  ;.    distinct =
1fdd0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1fde0 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
1fdf0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
1fe00 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ist(pParse, p->p
1fe10 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
1fe20 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1fe30 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1fe40 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20  l, distinct, 0, 
1fe50 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1fe60 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1fe70 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
1fe80 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
1fe90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69  .  }else{.    di
1fea0 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d  stinct = -1;.  }
1feb0 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65  ..  /* Aggregate
1fec0 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61   and non-aggrega
1fed0 74 65 20 71 75 65 72 69 65 73 20 61 72 65 20 68  te queries are h
1fee0 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
1fef0 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41  ly */.  if( !isA
1ff00 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
1ff10 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
1ff20 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e   case is for non
1ff30 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
1ff40 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20  es.    ** Begin 
1ff50 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
1ff60 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49  n.    */.    pWI
1ff70 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
1ff80 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
1ff90 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
1ffa0 2c 20 26 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  , &pOrderBy, 0);
1ffb0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
1ffc0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
1ffd0 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  _end;..    /* If
1ffe0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
1fff0 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
20000 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
20010 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
20020 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
20030 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
20040 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
20050 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
20060 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
20070 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
20080 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
20090 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  f( addrSortIndex
200a0 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d  >=0 && pOrderBy=
200b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
200c0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
200d0 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49  oop(v, addrSortI
200e0 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 20 20 20  ndex, 1);.      
200f0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
20100 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  2] = -1;.    }..
20110 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
20120 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
20130 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  op.    */.    as
20140 73 65 72 74 28 21 69 73 44 69 73 74 69 6e 63 74  sert(!isDistinct
20150 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  );.    selectInn
20160 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
20170 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
20180 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 70 44  pOrderBy, -1, pD
20190 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
201a0 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
201b0 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e  >iContinue, pWIn
201c0 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66 29  fo->iBreak, aff)
201d0 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
201e0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
201f0 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
20200 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
20210 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
20220 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  e{.    /* This i
20230 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  s the processing
20240 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 71   for aggregate q
20250 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61  ueries */.    Na
20260 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
20270 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
20280 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
20290 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72   aggregate infor
202a0 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  mation */.    in
202b0 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iAMem;        
202c0 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
202d0 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69  ddress for stori
202e0 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  ng current GROUP
202f0 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
20300 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  BMem;          /
20310 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
20320 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73  ess for previous
20330 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
20340 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20   int iUseFlag;  
20350 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
20360 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67  ess holding flag
20370 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
20380 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   at least.      
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203a0 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20    ** one row of 
203b0 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65  the input to the
203c0 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20   aggregator has 
203d0 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  been.           
203e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
203f0 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20  processed */.   
20400 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b   int iAbortFlag;
20410 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
20420 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73  ess which causes
20430 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20   query abort if 
20440 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20  positive */.    
20450 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b  int groupBySort;
20460 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65      /* Rows come
20470 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20   from source in 
20480 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a  GROUP BY order *
20490 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  /...    /* The f
204a0 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
204b0 65 73 20 68 6f 6c 64 20 61 64 64 72 65 73 73 65  es hold addresse
204c0 73 20 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72 20  s or labels for 
204d0 70 61 72 74 73 20 6f 66 20 74 68 65 0a 20 20 20  parts of the.   
204e0 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68   ** virtual mach
204f0 69 6e 65 20 70 72 6f 67 72 61 6d 20 77 65 20 61  ine program we a
20500 72 65 20 70 75 74 74 69 6e 67 20 74 6f 67 65 74  re putting toget
20510 68 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  her */.    int a
20520 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 20  ddrOutputRow;   
20530 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73     /* Start of s
20540 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
20550 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
20560 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  row */.    int r
20570 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 20  egOutputRow;    
20580 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
20590 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
205a0 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  r output subrout
205b0 69 6e 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ine */.    int a
205c0 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 20  ddrSetAbort;    
205d0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62     /* Set the ab
205e0 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74  ort flag and ret
205f0 75 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  urn */.    int a
20600 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f  ddrInitializeLoo
20610 70 3b 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63  p; /* Start of c
20620 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c  ode that initial
20630 69 7a 65 73 20 74 68 65 20 69 6e 70 75 74 20 6c  izes the input l
20640 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  oop */.    int a
20650 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20  ddrTopOfLoop;   
20660 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
20670 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20   input loop */. 
20680 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20     int addrEnd; 
20690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
206a0 64 20 6f 66 20 61 6c 6c 20 70 72 6f 63 65 73 73  d of all process
206b0 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ing */.    int a
206c0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 20  ddrSortingIdx;  
206d0 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65     /* The OP_Ope
206e0 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
206f0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
20700 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
20710 52 65 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  Reset;          
20720 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
20730 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
20740 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20  accumulator */. 
20750 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
20760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
20770 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
20780 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20  ister for reset 
20790 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  subroutine */.. 
207a0 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c     addrEnd = sql
207b0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
207c0 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  l(v);..    /* Co
207d0 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20  nvert TK_COLUMN 
207e0 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47  nodes into TK_AG
207f0 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b  G_COLUMN and mak
20800 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20  e entries in.   
20810 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72   ** sAggInfo for
20820 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43   all TK_AGG_FUNC
20830 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78  TION nodes in ex
20840 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
20850 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  .    ** SELECT s
20860 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
20870 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
20880 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
20890 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
208a0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
208b0 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
208c0 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43  TabList;.    sNC
208d0 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67  .pAggInfo = &sAg
208e0 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49  gInfo;.    sAggI
208f0 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
20900 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
20910 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b  pGroupBy->nExpr+
20920 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49  1 : 0;.    sAggI
20930 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  nfo.pGroupBy = p
20940 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c  GroupBy;.    sql
20950 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
20960 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
20970 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
20980 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
20990 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72  ist(&sNC, pOrder
209a0 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61  By);.    if( pHa
209b0 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  ving ){.      sq
209c0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
209d0 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
209e0 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
209f0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
20a00 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
20a10 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
20a20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
20a30 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
20a40 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
20a50 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
20a60 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
20a70 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
20a80 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  r->pList);.    }
20a90 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
20aa0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
20ab0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
20ac0 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20    /* Processing 
20ad0 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77  for aggregates w
20ae0 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20  ith GROUP BY is 
20af0 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61  very different a
20b00 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d  nd.    ** much m
20b10 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e  ore complex than
20b20 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
20b30 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
20b40 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
20b50 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
20b60 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
20b70 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
20b80 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
20b90 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
20ba0 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
20bb0 6a 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  j1;..      /* Cr
20bc0 65 61 74 65 20 6c 61 62 65 6c 73 20 74 68 61 74  eate labels that
20bd0 20 77 65 20 77 69 6c 6c 20 62 65 20 6e 65 65 64   we will be need
20be0 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ing.      */.   
20bf0 20 20 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a     addrInitializ
20c00 65 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  eLoop = sqlite3V
20c10 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
20c20 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
20c30 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
20c40 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
20c50 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
20c60 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
20c70 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
20c80 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
20c90 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
20ca0 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
20cb0 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
20cc0 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
20cd0 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
20ce0 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  he OpenEphemeral
20cf0 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
20d00 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
20d10 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
20d20 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
20d30 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
20d40 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
20d50 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
20d60 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
20d70 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
20d80 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
20d90 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f  y);.      addrSo
20da0 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74  rtingIdx = sqlit
20db0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
20dc0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
20dd0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  , .          sAg
20de0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
20df0 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74  , sAggInfo.nSort
20e00 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20  ingColumn, .    
20e10 20 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29        0, (char*)
20e20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
20e30 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a  INFO_HANDOFF);..
20e40 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
20e50 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ize memory locat
20e60 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f  ions used by GRO
20e70 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20  UP BY aggregate 
20e80 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
20e90 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c   */.      iUseFl
20ea0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
20eb0 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72  Mem;.      iAbor
20ec0 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  tFlag = ++pParse
20ed0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
20ee0 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
20ef0 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
20f00 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
20f10 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
20f20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61       iBMem = pPa
20f30 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
20f40 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
20f50 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
20f60 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
20f70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20f80 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
20f90 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
20fa0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
20fb0 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20  v, "clear abort 
20fc0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
20fd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20fe0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
20ff0 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  0, iUseFlag);.  
21000 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
21010 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63  (v, "indicate ac
21020 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22  cumulator empty"
21030 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
21040 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21050 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 49  P_Goto, 0, addrI
21060 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a  nitializeLoop);.
21070 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
21080 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
21090 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73  that outputs a s
210a0 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
210b0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
210c0 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72   set.  This subr
210d0 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f  outine first loo
210e0 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c  ks at the iUseFl
210f0 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67  ag.  If iUseFlag
21100 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73  .      ** is les
21110 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
21120 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62  to zero, the sub
21130 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
21140 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a  op.  If.      **
21150 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
21160 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75  calls for the qu
21170 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68  ery to abort, th
21180 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  is subroutine.  
21190 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
211a0 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67  s the iAbortFlag
211b0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
211c0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
211d0 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  g in.      ** or
211e0 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  der to signal th
211f0 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72  e caller to abor
21200 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
21210 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d    addrSetAbort =
21220 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
21230 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
21240 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21250 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
21260 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 1, iAbortFlag
21270 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
21280 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62  ment((v, "set ab
21290 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
212a0 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20     regOutputRow 
212b0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
212c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
212d0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
212e0 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
212f0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64  tRow);.      add
21300 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
21310 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
21320 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
21330 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21340 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73  v, OP_IfPos, iUs
21350 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75  eFlag, addrOutpu
21360 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56  tRow+2);.      V
21370 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
21380 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
21390 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
213a0 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
213b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
213c0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
213d0 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
213e0 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
213f0 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
21400 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
21410 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
21420 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21430 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
21440 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
21450 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53  drOutputRow+1, S
21460 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
21470 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21480 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
21490 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
214a0 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
214b0 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
214c0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
214d0 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214f0 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
21500 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72  w+1, addrSetAbor
21510 74 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 73  t, aff);.      s
21520 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
21530 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
21540 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
21550 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
21560 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79  (v, "end groupby
21570 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
21580 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
21590 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
215a0 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
215b0 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
215c0 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
215d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
215e0 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65  drReset = sqlite
215f0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
21600 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65  (v);.      regRe
21610 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
21620 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 73 65  nMem;.      rese
21630 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
21640 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
21650 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21660 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
21670 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29  eturn, regReset)
21680 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
21690 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
216a0 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
216b0 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
216c0 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
216d0 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
216e0 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
216f0 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
21700 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
21710 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
21720 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
21730 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
21740 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
21750 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
21760 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  ormation.      *
21770 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f  * in the right o
21780 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69  rder to begin wi
21790 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  th..      */.   
217a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
217b0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
217c0 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70  drInitializeLoop
217d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
217e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
217f0 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
21800 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
21810 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
21820 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
21830 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
21840 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70   pWhere, &pGroup
21850 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  By, 0);.      if
21860 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
21870 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
21880 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42       if( pGroupB
21890 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
218a0 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
218b0 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
218c0 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
218d0 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
218e0 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
218f0 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
21900 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
21910 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
21920 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
21930 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
21940 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
21950 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
21960 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
21970 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72    */.        pGr
21980 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
21990 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f  pBy;.        gro
219a0 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
219b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
219c0 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
219d0 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
219e0 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
219f0 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
21a00 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
21a10 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
21a20 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
21a30 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
21a40 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
21a50 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
21a60 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
21a70 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
21a80 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
21a90 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
21aa0 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
21ab0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
21ac0 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
21ad0 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
21ae0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
21af0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
21b00 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
21b10 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
21b20 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42  .        nGroupB
21b30 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y = pGroupBy->nE
21b40 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  xpr;.        nCo
21b50 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20 31  l = nGroupBy + 1
21b60 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
21b70 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20  roupBy+1;.      
21b80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
21b90 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
21ba0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
21bb0 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  f( sAggInfo.aCol
21bc0 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  [i].iSorterColum
21bd0 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
21be0 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
21bf0 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
21c00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21c10 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61   }.        regBa
21c20 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
21c30 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
21c40 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
21c50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
21c60 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
21c70 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73  pGroupBy, regBas
21c80 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
21c90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21ca0 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
21cb0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
21cc0 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72  gIdx,regBase+nGr
21cd0 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20  oupBy);.        
21ce0 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a  j = nGroupBy+1;.
21cf0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
21d00 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
21d10 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
21d20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
21d30 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
21d40 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
21d50 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
21d60 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
21d70 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
21d80 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
21d90 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
21da0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20           int r2 
21db0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
21dc0 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
21dd0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
21de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21df0 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70     pCol->pTab, p
21e00 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43  Col->iColumn, pC
21e10 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20  ol->iTable, r1, 
21e20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
21e30 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20  if( r1!=r2 ){.  
21e40 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21e50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21e60 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72   OP_SCopy, r2, r
21e70 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
21e80 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  }.            j+
21e90 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
21ea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21eb0 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
21ec0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
21ed0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
21ee0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21ef0 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
21f00 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
21f10 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
21f20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21f30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
21f40 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e  dxInsert, sAggIn
21f50 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72  fo.sortingIdx, r
21f60 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
21f70 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
21f80 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
21f90 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
21fa0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
21fb0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
21fc0 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
21fd0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
21fe0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
21ff0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  nfo);.        sq
22000 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22010 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67  v, OP_Sort, sAgg
22020 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
22030 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
22040 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
22050 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72  v, "GROUP BY sor
22060 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41  t"));.        sA
22070 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e  ggInfo.useSortin
22080 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  gIdx = 1;.      
22090 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c  }..      /* Eval
220a0 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  uate the current
220b0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
220c0 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c  and store in b0,
220d0 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20   b1, b2....     
220e0 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72   ** (b0 is memor
220f0 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d  y location iBMem
22100 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b  +0, b1 is iBMem+
22110 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  1, and so forth)
22120 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63  .      ** Then c
22130 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65  ompare the curre
22140 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
22150 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52  s against the GR
22160 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20  OUP BY terms.   
22170 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
22180 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72  revious row curr
22190 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
221a0 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20  a0, a1, a2....  
221b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
221c0 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c  rTopOfLoop = sql
221d0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
221e0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f  ddr(v);.      fo
221f0 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
22200 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
22210 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75          if( grou
22220 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
22230 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22240 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
22250 75 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  umn, sAggInfo.so
22260 72 74 69 6e 67 49 64 78 2c 20 6a 2c 20 69 42 4d  rtingIdx, j, iBM
22270 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
22280 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22290 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d  sAggInfo.directM
222a0 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ode = 1;.       
222b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
222c0 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  de(pParse, pGrou
222d0 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  pBy->a[j].pExpr,
222e0 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
222f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22300 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22310 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
22320 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d  re, iAMem, iBMem
22330 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
22340 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
22350 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
22360 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
22370 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
22380 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
22390 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
223a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
223b0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
223c0 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31  ump, j1+1, 0, j1
223d0 2b 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  +1);..      /* G
223e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
223f0 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20  t runs whenever 
22400 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61  the GROUP BY cha
22410 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43  nges..      ** C
22420 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52  hanges in the GR
22430 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63  OUP BY are detec
22440 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
22450 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a  ous code.      *
22460 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65  * block.  If the
22470 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67  re were no chang
22480 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69  es, this block i
22490 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20  s skipped..     
224a0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
224b0 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75  s code copies cu
224c0 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74  rrent group by t
224d0 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32  erms in b0,b1,b2
224e0 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76  ,....      ** ov
224f0 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20  er to a0,a1,a2. 
22500 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74   It then calls t
22510 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
22520 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  tine.      ** an
22530 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67  d resets the agg
22540 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
22550 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  or registers in 
22560 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20  preparation.    
22570 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78    ** for the nex
22580 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68  t GROUP BY batch
22590 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
225a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
225b0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d  Move(pParse, iBM
225c0 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75  em, iAMem, pGrou
225d0 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  pBy->nExpr);.   
225e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
225f0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
22600 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
22610 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
22620 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
22630 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e  t((v, "output on
22640 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  e row"));.      
22650 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22660 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
22670 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45  AbortFlag, addrE
22680 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  nd);.      VdbeC
22690 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63  omment((v, "chec
226a0 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
226b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
226c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
226d0 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
226e0 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
226f0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
22700 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c  , "reset accumul
22710 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
22720 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67  /* Update the ag
22730 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
22740 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68  tors based on th
22750 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20  e content of.   
22760 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
22770 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20  t row.      */. 
22780 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22790 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
227a0 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
227b0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
227c0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
227d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
227e0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
227f0 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29  er, 1, iUseFlag)
22800 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
22810 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
22820 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75  e data in accumu
22830 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
22840 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c   /* End of the l
22850 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  oop.      */.   
22860 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
22870 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
22880 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22890 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67  v, OP_Next, sAgg
228a0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
228b0 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b   addrTopOfLoop);
228c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
228d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
228e0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
228f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22900 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
22910 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  , addrSortingIdx
22920 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
22930 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74       /* Output t
22940 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20  he final row of 
22950 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a  result.      */.
22960 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22970 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
22980 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
22990 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
229a0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
229b0 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
229c0 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 20   final row"));. 
229d0 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65       .    } /* e
229e0 6e 64 69 66 20 70 47 72 6f 75 70 42 79 20 2a 2f  ndif pGroupBy */
229f0 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  .    else {.    
22a00 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
22a10 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  Max = 0;.      E
22a20 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20  xprList *pDel = 
22a30 30 3b 0a 20 20 20 20 20 20 75 38 20 66 6c 61 67  0;.      u8 flag
22a40 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  ;..      /* Chec
22a50 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  k if the query i
22a60 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
22a70 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
22a80 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
22a90 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28  **   SELECT min(
22aa0 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
22ab0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61    **   SELECT ma
22ac0 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  x(x) FROM ....  
22ad0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
22ae0 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61  If it is, then a
22af0 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77  sk the code in w
22b00 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70  here.c to attemp
22b10 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74  t to sort result
22b20 73 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66  s.      ** as if
22b30 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f   there was an "O
22b40 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f  RDER ON x" or "O
22b50 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20  RDER ON x DESC" 
22b60 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 2a  clause. .      *
22b70 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20  * If where.c is 
22b80 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20  able to produce 
22b90 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69  results sorted i
22ba0 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68  n this order, th
22bb0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 64 64 20  en.      ** add 
22bc0 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65  vdbe code to bre
22bd0 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72  ak out of the pr
22be0 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66  ocessing loop af
22bf0 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ter the .      *
22c00 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  * first iteratio
22c10 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72  n (since the fir
22c20 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
22c30 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20  the loop is .   
22c40 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
22c50 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
22c60 68 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20  he row with the 
22c70 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d  minimum or maxim
22c80 75 6d 20 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c  um .      ** val
22c90 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c  ue of x, the onl
22ca0 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e  y row required).
22cb0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
22cc0 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61  ** A special fla
22cd0 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64  g must be passed
22ce0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
22cf0 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68  Begin() to sligh
22d00 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64  tly.      ** mod
22d10 69 66 79 20 62 65 68 61 76 69 6f 75 72 20 61 73  ify behaviour as
22d20 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
22d30 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  **.      **   + 
22d40 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
22d50 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
22d60 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70  ", then the loop
22d70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20   coded by.      
22d80 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73  **     where.c s
22d90 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74  hould not iterat
22da0 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65  e over any value
22db0 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61  s with a NULL va
22dc0 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  lue.      **    
22dd0 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 2a 2a   for x..      **
22de0 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68  .      **   + Th
22df0 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65  e optimizer code
22e00 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65   in where.c (the
22e10 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69   thing that deci
22e20 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20  des which.      
22e30 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20  **     index or 
22e40 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20  indices to use) 
22e50 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64  should place a d
22e60 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74  ifferent priorit
22e70 79 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 20  y on .      **  
22e80 20 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68     satisfying th
22e90 65 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61  e 'ORDER BY' cla
22ea0 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73  use than it does
22eb0 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e   in other cases.
22ec0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65  .      **     Re
22ed0 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20  fer to code and 
22ee0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72  comments in wher
22ef0 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  e.c for details.
22f00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22f10 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65  flag = minMaxQue
22f20 72 79 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ry(pParse, p);. 
22f30 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b       if( flag ){
22f40 0a 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20  .        pDel = 
22f50 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65  pMinMax = sqlite
22f60 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
22f70 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
22f80 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a  .pExpr->pList);.
22f90 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e          if( pMin
22fa0 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  Max && !db->mall
22fb0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
22fc0 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
22fd0 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
22fe0 28 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52  ((flag==WHERE_OR
22ff0 44 45 52 42 59 5f 4d 49 4e 29 3f 30 3a 31 29 3b  DERBY_MIN)?0:1);
23000 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d  .          pMinM
23010 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  ax->a[0].pExpr->
23020 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
23030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23040 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  }..      /* This
23050 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68   case runs if th
23060 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  e aggregate has 
23070 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
23080 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  se.  The.      *
23090 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  * processing is 
230a0 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e  much simpler sin
230b0 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  ce there is only
230c0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20   a single row.  
230d0 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74      ** of output
230e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
230f0 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
23100 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
23110 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  nfo);.      pWIn
23120 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
23130 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
23140 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
23150 20 26 70 4d 69 6e 4d 61 78 2c 20 66 6c 61 67 29   &pMinMax, flag)
23160 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
23170 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
23180 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
23190 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20  Delete(pDel);.  
231a0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
231b0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
231c0 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
231d0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
231e0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
231f0 20 69 66 28 20 21 70 4d 69 6e 4d 61 78 20 26 26   if( !pMinMax &&
23200 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20   flag ){.       
23210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23220 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
23230 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
23240 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
23250 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29  omment((v, "%s()
23260 20 62 79 20 69 6e 64 65 78 22 2c 28 66 6c 61 67   by index",(flag
23270 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  ==WHERE_ORDERBY_
23280 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29  MIN?"min":"max")
23290 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
232a0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
232b0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
232c0 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
232d0 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
232e0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
232f0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
23300 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
23310 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23320 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
23330 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
23340 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a  ddrEnd, SQLITE_J
23350 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
23360 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74    }.      select
23370 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
23380 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
23390 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20  0, 0, 0, -1, .  
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233b0 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45      pDest, addrE
233c0 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66 66  nd, addrEnd, aff
233d0 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
233e0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
233f0 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pDel);.    }.   
23400 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
23410 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
23420 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
23430 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
23440 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a  e query */..  /*
23450 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
23460 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
23470 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
23480 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
23490 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
234a0 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
234b0 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
234c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
234d0 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65  erBy ){.    gene
234e0 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
234f0 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73  rse, p, v, pELis
23500 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29  t->nExpr, pDest)
23510 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
23520 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
23530 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  ERY.  /* If this
23540 20 77 61 73 20 61 20 73 75 62 71 75 65 72 79 2c   was a subquery,
23550 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e   we have now con
23560 76 65 72 74 65 64 20 74 68 65 20 73 75 62 71 75  verted the subqu
23570 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20  ery into a.  ** 
23580 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
23590 20 20 53 6f 20 73 65 74 20 74 68 65 20 53 72 63    So set the Src
235a0 4c 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f 70 75  List_item.isPopu
235b0 6c 61 74 65 64 20 66 6c 61 67 20 74 6f 20 70 72  lated flag to pr
235c0 65 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69 73 20  event.  ** this 
235d0 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65  subquery from be
235e0 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61 67  ing evaluated ag
235f0 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65  ain and to force
23600 20 74 68 65 20 75 73 65 20 6f 66 0a 20 20 2a 2a   the use of.  **
23610 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
23620 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
23630 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20   pParent ){.    
23640 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
23650 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65  >pSrc->nSrc>pare
23660 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73  ntTab );.    ass
23670 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53  ert( pParent->pS
23680 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
23690 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20  .pSelect==p );. 
236a0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63     pParent->pSrc
236b0 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 69  ->a[parentTab].i
236c0 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a  sPopulated = 1;.
236d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
236e0 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
236f0 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  ip this query.  
23700 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
23710 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
23720 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  iEnd);..  /* The
23730 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63   SELECT was succ
23740 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20  essfully coded. 
23750 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e    Set the return
23760 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20   code to 0.  ** 
23770 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65  to indicate no e
23780 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rrors..  */.  rc
23790 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74   = 0;..  /* Cont
237a0 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72  rol jumps to her
237b0 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
237c0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f   encountered abo
237d0 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a  ve, or upon.  **
237e0 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69   successful codi
237f0 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ng of the SELECT
23800 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e  ..  */.select_en
23810 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  d:..  /* Identif
23820 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  y column names i
23830 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  f we will be usi
23840 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c  ng them in a cal
23850 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
23860 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
23870 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
23880 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65  is going to some
23890 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74 69   other destinati
238a0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  on..  */.  if( r
238b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
238c0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
238d0 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
238e0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
238f0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
23900 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
23910 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
23920 66 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 43  free(sAggInfo.aC
23930 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ol);.  sqlite3_f
23940 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 46 75  ree(sAggInfo.aFu
23950 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nc);.  return rc
23960 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
23970 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
23980 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
23990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
239a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
239b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
239c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
239d0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
239e0 6e 67 20 63 6f 64 65 20 69 73 20 75 73 65 64 20  ng code is used 
239f0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
23a00 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20  debugging only. 
23a10 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61   The code.** tha
23a20 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e  t follows does n
23a30 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72  ot appear in nor
23a40 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a  mal builds..**.*
23a50 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
23a60 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 72 69   are used to pri
23a70 6e 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74 65  nt out the conte
23a80 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72  nt of all or par
23a90 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73 65  t of a .** parse
23aa0 20 73 74 72 75 63 74 75 72 65 73 20 73 75 63 68   structures such
23ab0 20 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45 78   as Select or Ex
23ac0 70 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74 6f  pr.  Such printo
23ad0 75 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a 2a  uts are useful.*
23ae0 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f  * for helping to
23af0 20 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61 74   understand what
23b00 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69 6e   is happening in
23b10 73 69 64 65 20 74 68 65 20 63 6f 64 65 20 67 65  side the code ge
23b20 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e  nerator.** durin
23b30 67 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20  g the execution 
23b40 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43  of complex SELEC
23b50 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  T statements..**
23b60 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
23b70 65 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64  e are not called
23b80 20 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20 77   anywhere from w
23b90 69 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c  ithin the normal
23ba0 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20 20  .** code base.  
23bb0 54 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64 65  Then are intende
23bc0 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66  d to be called f
23bd0 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64  rom within the d
23be0 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72  ebugger.** or fr
23bf0 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70 72  om temporary "pr
23c00 69 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74 73  intf" statements
23c10 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64 65   inserted for de
23c20 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64  bugging..*/.void
23c30 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
23c40 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  r(Expr *p){.  if
23c50 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20  ( p->token.z && 
23c60 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a  p->token.n>0 ){.
23c70 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23c80 50 72 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c 20  Printf("(%.*s", 
23c90 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74  p->token.n, p->t
23ca0 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65  oken.z);.  }else
23cb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
23cc0 75 67 50 72 69 6e 74 66 28 22 28 25 64 22 2c 20  ugPrintf("(%d", 
23cd0 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66  p->op);.  }.  if
23ce0 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  ( p->pLeft ){.  
23cf0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23d00 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73  intf(" ");.    s
23d10 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
23d20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20  p->pLeft);.  }. 
23d30 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29   if( p->pRight )
23d40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
23d50 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20  ugPrintf(" ");. 
23d60 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
23d70 78 70 72 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a  xpr(p->pRight);.
23d80 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
23d90 75 67 50 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d  ugPrintf(")");.}
23da0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69  .void sqlite3Pri
23db0 6e 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  ntExprList(ExprL
23dc0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
23dd0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
23de0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
23df0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
23e00 65 33 50 72 69 6e 74 45 78 70 72 28 70 4c 69 73  e3PrintExpr(pLis
23e10 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
23e20 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d      if( i<pList-
23e30 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20  >nExpr-1 ){.    
23e40 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23e50 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20 20 20  intf(", ");.    
23e60 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  }.  }.}.void sql
23e70 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28  ite3PrintSelect(
23e80 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
23e90 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65  ndent){.  sqlite
23ea0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
23eb0 73 53 45 4c 45 43 54 28 25 70 29 20 22 2c 20 69  sSELECT(%p) ", i
23ec0 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20  ndent, "", p);. 
23ed0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
23ee0 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 29  rList(p->pEList)
23ef0 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
23f00 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
23f10 69 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20  if( p->pSrc ){. 
23f20 20 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78     char *zPrefix
23f30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
23f40 20 7a 50 72 65 66 69 78 20 3d 20 22 46 52 4f 4d   zPrefix = "FROM
23f50 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ";.    for(i=0; 
23f60 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b  i<p->pSrc->nSrc;
23f70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
23f80 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
23f90 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53   *pItem = &p->pS
23fa0 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
23fb0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23fc0 74 66 28 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e  tf("%*s ", inden
23fd0 74 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20  t+6, zPrefix);. 
23fe0 20 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22       zPrefix = "
23ff0 22 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ";.      if( pIt
24000 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
24010 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
24020 62 75 67 50 72 69 6e 74 66 28 22 28 5c 6e 22 29  bugPrintf("(\n")
24030 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
24040 33 50 72 69 6e 74 53 65 6c 65 63 74 28 70 49 74  3PrintSelect(pIt
24050 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64  em->pSelect, ind
24060 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20 20 20  ent+10);.       
24070 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24080 6e 74 66 28 22 25 2a 73 29 22 2c 20 69 6e 64 65  ntf("%*s)", inde
24090 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20 20  nt+8, "");.     
240a0 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d   }else if( pItem
240b0 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ->zName ){.     
240c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
240d0 72 69 6e 74 66 28 22 25 73 22 2c 20 70 49 74 65  rintf("%s", pIte
240e0 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m->zName);.     
240f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
24100 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20  em->pTab ){.    
24110 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24120 50 72 69 6e 74 66 28 22 28 74 61 62 6c 65 3a 20  Printf("(table: 
24130 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  %s)", pItem->pTa
24140 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
24150 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
24160 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
24170 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
24180 75 67 50 72 69 6e 74 66 28 22 20 41 53 20 25 73  ugPrintf(" AS %s
24190 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  ", pItem->zAlias
241a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
241b0 20 69 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e   if( i<p->pSrc->
241c0 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20  nSrc-1 ){.      
241d0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
241e0 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20 20 20  intf(",");.     
241f0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
24200 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
24210 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
24220 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a  f( p->pWhere ){.
24230 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24240 50 72 69 6e 74 66 28 22 25 2a 73 20 57 48 45 52  Printf("%*s WHER
24250 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  E ", indent, "")
24260 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
24270 6e 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  ntExpr(p->pWhere
24280 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
24290 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
242a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47  .  }.  if( p->pG
242b0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71  roupBy ){.    sq
242c0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
242d0 28 22 25 2a 73 20 47 52 4f 55 50 20 42 59 20 22  ("%*s GROUP BY "
242e0 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
242f0 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
24300 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
24310 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBy);.    sqlite
24320 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
24330 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ");.  }.  if( p-
24340 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
24350 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24360 74 66 28 22 25 2a 73 20 48 41 56 49 4e 47 20 22  tf("%*s HAVING "
24370 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
24380 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
24390 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b  xpr(p->pHaving);
243a0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
243b0 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
243c0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
243d0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
243e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
243f0 25 2a 73 20 4f 52 44 45 52 20 42 59 20 22 2c 20  %*s ORDER BY ", 
24400 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
24410 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
24420 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
24430 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  y);.    sqlite3D
24440 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
24450 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f  ;.  }.}./* End o
24460 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
24470 64 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63  debug printing c
24480 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ode.************
24490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244d0 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  */.#endif /* def
244e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
244f0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
24500 49 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a        ITE_DEBUG) */.