/ Hex Artifact Content
Login

Artifact 31c8ab4c9514981d33d85cb29e2abedfb531a7ea:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 34 34 36  select.c,v 1.446
0200: 20 32 30 30 38 2f 30 37 2f 30 32 20 31 33 3a 31   2008/07/02 13:1
0210: 33 3a 35 32 20 64 61 6e 69 65 6c 6b 31 39 37 37  3:52 danielk1977
0220: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0230: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0240: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  .../*.** Delete 
0250: 61 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  all the content 
0260: 6f 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75  of a Select stru
0270: 63 74 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74  cture but do not
0280: 20 64 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74   deallocate.** t
0290: 68 65 20 73 65 6c 65 63 74 20 73 74 72 75 63 74  he select struct
02a0: 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73  ure itself..*/.s
02b0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
02c0: 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70  Select(Select *p
02d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
02e0: 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45  ListDelete(p->pE
02f0: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
0300: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  SrcListDelete(p-
0310: 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  >pSrc);.  sqlite
0320: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
0330: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
0340: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0350: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
0370: 65 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  e(p->pHaving);. 
0380: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0390: 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72  Delete(p->pOrder
03a0: 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  By);.  sqlite3Se
03b0: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50  lectDelete(p->pP
03c0: 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  rior);.  sqlite3
03d0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
03e0: 69 6d 69 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  imit);.  sqlite3
03f0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4f  ExprDelete(p->pO
0400: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
0410: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65   Initialize a Se
0420: 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
0430: 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
0440: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
0450: 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44  t(SelectDest *pD
0460: 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20  est, int eDest, 
0470: 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44  int iParm){.  pD
0480: 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 65 44 65  est->eDest = eDe
0490: 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 50 61  st;.  pDest->iPa
04a0: 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44  rm = iParm;.  pD
04b0: 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  est->affinity = 
04c0: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d  0;.  pDest->iMem
04d0: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e   = 0;.  pDest->n
04e0: 4d 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  Mem = 0;.}.../*.
04f0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
0500: 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  w Select structu
0510: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  re and return a 
0520: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a  pointer to that.
0530: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
0540: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
0550: 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72  SelectNew(.  Par
0560: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0570: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0580: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
0590: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
05a0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
05b0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
05c0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
05d0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
05e0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
05f0: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0600: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0610: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0620: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0630: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0640: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0650: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0660: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0670: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
0680: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
0690: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
06a0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
06b0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
06c0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
06d0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
06e0: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
06f0: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0700: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0710: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 45  s present */.  E
0720: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0730: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0740: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0750: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0760: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0770: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
0780: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0790: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
07a0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
07b0: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
07c0: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  in;.  sqlite3 *d
07d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
07e0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
07f0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
0800: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
0810: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4f 66  ;.  assert( !pOf
0820: 66 73 65 74 20 7c 7c 20 70 4c 69 6d 69 74 20 29  fset || pLimit )
0830: 3b 20 20 20 2f 2a 20 43 61 6e 27 74 20 68 61 76  ;   /* Can't hav
0840: 65 20 4f 46 46 53 45 54 20 77 69 74 68 6f 75 74  e OFFSET without
0850: 20 4c 49 4d 49 54 2e 20 2a 2f 0a 20 20 69 66 28   LIMIT. */.  if(
0860: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
0870: 70 4e 65 77 20 3d 20 26 73 74 61 6e 64 69 6e 3b  pNew = &standin;
0880: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77  .    memset(pNew
0890: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  , 0, sizeof(*pNe
08a0: 77 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  w));.  }.  if( p
08b0: 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  EList==0 ){.    
08c0: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
08d0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
08e0: 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65  Parse, 0, sqlite
08f0: 33 45 78 70 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c  3Expr(db,TK_ALL,
0900: 30 2c 30 2c 30 29 2c 20 30 29 3b 0a 20 20 7d 0a  0,0,0), 0);.  }.
0910: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
0920: 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d   pEList;.  pNew-
0930: 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
0940: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
0950: 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70  Where;.  pNew->p
0960: 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
0970: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  By;.  pNew->pHav
0980: 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20  ing = pHaving;. 
0990: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
09a0: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e  = pOrderBy;.  pN
09b0: 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d  ew->isDistinct =
09c0: 20 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70   isDistinct;.  p
09d0: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
09e0: 45 43 54 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ECT;.  assert( p
09f0: 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69  Offset==0 || pLi
0a00: 6d 69 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77  mit!=0 );.  pNew
0a10: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
0a20: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  t;.  pNew->pOffs
0a30: 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
0a40: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0a50: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
0a60: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a70: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
0a80: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
0a90: 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 4e  ] = -1;.  if( pN
0aa0: 65 77 3d 3d 26 73 74 61 6e 64 69 6e 29 20 7b 0a  ew==&standin) {.
0ab0: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
0ac0: 70 4e 65 77 29 3b 0a 20 20 20 20 70 4e 65 77 20  pNew);.    pNew 
0ad0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
0ae0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
0af0: 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76 65   Delete the give
0b00: 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  n Select structu
0b10: 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  re and all of it
0b20: 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73 2e  s substructures.
0b30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0b40: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 53 65 6c  SelectDelete(Sel
0b50: 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
0b60: 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c   ){.    clearSel
0b70: 65 63 74 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  ect(p);.    sqli
0b80: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
0b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
0ba0: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
0bb0: 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74 68  rs preceeding th
0bc0: 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20  e JOIN keyword, 
0bd0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a  determine the.**
0be0: 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20   type of join.  
0bf0: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
0c00: 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  r constant that 
0c10: 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74  expresses that t
0c20: 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20  ype.** in terms 
0c30: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0c40: 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a   bit values:.**.
0c50: 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a  **     JT_INNER.
0c60: 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a  **     JT_CROSS.
0c70: 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a  **     JT_OUTER.
0c80: 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41  **     JT_NATURA
0c90: 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54  L.**     JT_LEFT
0ca0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54  .**     JT_RIGHT
0cb0: 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75  .**.** A full ou
0cc0: 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20  ter join is the 
0cd0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a  combination of J
0ce0: 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49  T_LEFT and JT_RI
0cf0: 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  GHT..**.** If an
0d00: 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75   illegal or unsu
0d10: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
0d20: 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20  e is seen, then 
0d30: 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20  still return.** 
0d40: 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74  a join type, but
0d50: 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e   put an error in
0d60: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
0d70: 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
0d80: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61  lite3JoinType(Pa
0d90: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
0da0: 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70  en *pA, Token *p
0db0: 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20  B, Token *pC){. 
0dc0: 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
0dd0: 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c  0;.  Token *apAl
0de0: 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  l[3];.  Token *p
0df0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0e00: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
0e10: 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 77 6f 72  nst char zKeywor
0e20: 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20 6e 43 68  d[8];.    u8 nCh
0e30: 61 72 3b 0a 20 20 20 20 75 38 20 63 6f 64 65 3b  ar;.    u8 code;
0e40: 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20  .  } keywords[] 
0e50: 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61 74 75 72  = {.    { "natur
0e60: 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52  al", 7, JT_NATUR
0e70: 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66  AL },.    { "lef
0e80: 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46  t",    4, JT_LEF
0e90: 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  T|JT_OUTER },.  
0ea0: 20 20 7b 20 22 72 69 67 68 74 22 2c 20 20 20 35    { "right",   5
0eb0: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
0ec0: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75  TER },.    { "fu
0ed0: 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45  ll",    4, JT_LE
0ee0: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
0ef0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f  UTER },.    { "o
0f00: 75 74 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f  uter",   5, JT_O
0f10: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69  UTER },.    { "i
0f20: 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49  nner",   5, JT_I
0f30: 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63  NNER },.    { "c
0f40: 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49  ross",   5, JT_I
0f50: 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 7d 2c  NNER|JT_CROSS },
0f60: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
0f70: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
0f80: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
0f90: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
0fa0: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
0fb0: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
0fc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
0fd0: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
0fe0: 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b  (j=0; j<sizeof(k
0ff0: 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28  eywords)/sizeof(
1000: 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b  keywords[0]); j+
1010: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1020: 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >n==keywords[j].
1030: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1040: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
1050: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
1060: 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65   keywords[j].zKe
1070: 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20  yword, p->n)==0 
1080: 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74  ){.        joint
1090: 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73 5b  ype |= keywords[
10a0: 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20  j].code;.       
10b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
10c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
10d0: 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  =sizeof(keywords
10e0: 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  )/sizeof(keyword
10f0: 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 6a  s[0]) ){.      j
1100: 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52  ointype |= JT_ER
1110: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
1120: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1130: 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  (.     (jointype
1140: 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   & (JT_INNER|JT_
1150: 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e  OUTER))==(JT_INN
1160: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a  ER|JT_OUTER) ||.
1170: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1180: 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20   JT_ERROR)!=0.  
1190: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
11a0: 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 3b 0a 20  r *zSp1 = " ";. 
11b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11c0: 53 70 32 20 3d 20 22 20 22 3b 0a 20 20 20 20 69  Sp2 = " ";.    i
11d0: 66 28 20 70 42 3d 3d 30 20 29 7b 20 7a 53 70 31  f( pB==0 ){ zSp1
11e0: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 43  ++; }.    if( pC
11f0: 3d 3d 30 20 29 7b 20 7a 53 70 32 2b 2b 3b 20 7d  ==0 ){ zSp2++; }
1200: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1210: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
1220: 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f  known or unsuppo
1230: 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20  rted join type: 
1240: 22 0a 20 20 20 20 20 20 20 22 25 54 25 73 25 54  ".       "%T%s%T
1250: 25 73 25 54 22 2c 20 70 41 2c 20 7a 53 70 31 2c  %s%T", pA, zSp1,
1260: 20 70 42 2c 20 7a 53 70 32 2c 20 70 43 29 3b 0a   pB, zSp2, pC);.
1270: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1280: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
1290: 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20   if( jointype & 
12a0: 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20  JT_RIGHT ){.    
12b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12c0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
12d0: 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f  RIGHT and FULL O
12e0: 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e  UTER JOINs are n
12f0: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70  ot currently sup
1300: 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f  ported");.    jo
1310: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
1320: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
1330: 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  jointype;.}../*.
1340: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
1350: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
1360: 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74  in a table.  Ret
1370: 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f  urn -1 if the co
1380: 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  lumn.** is not c
1390: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
13a0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
13b0: 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   int columnIndex
13c0: 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f  (Table *pTab, co
13d0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b  nst char *zCol){
13e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
13f0: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
1400: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
1410: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1420: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
1430: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20  ame, zCol)==0 ) 
1440: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
1450: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
1460: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
1470: 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f 20  e of a token to 
1480: 61 20 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e 61  a '\000'-termina
1490: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  ted string..*/.s
14a0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 54 6f  tatic void setTo
14b0: 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f  ken(Token *p, co
14c0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
14d0: 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a 20  p->z = (u8*)z;. 
14e0: 20 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73 74 72 6c   p->n = z ? strl
14f0: 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 70 2d 3e  en(z) : 0;.  p->
1500: 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  dyn = 0;.}../*.*
1510: 2a 20 53 65 74 20 74 68 65 20 74 6f 6b 65 6e 20  * Set the token 
1520: 74 6f 20 74 68 65 20 64 6f 75 62 6c 65 2d 71 75  to the double-qu
1530: 6f 74 65 64 20 61 6e 64 20 65 73 63 61 70 65 64  oted and escaped
1540: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
1550: 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 0a 2a  string pointed.*
1560: 2a 20 74 6f 20 62 79 20 7a 2e 20 46 6f 72 20 65  * to by z. For e
1570: 78 61 6d 70 6c 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  xample;.**.**   
1580: 20 7b 61 22 62 63 7d 20 20 2d 3e 20 20 7b 22 61   {a"bc}  ->  {"a
1590: 22 22 62 63 22 7d 0a 2a 2f 0a 73 74 61 74 69 63  ""bc"}.*/.static
15a0: 20 76 6f 69 64 20 73 65 74 51 75 6f 74 65 64 54   void setQuotedT
15b0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
15c0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f  se, Token *p, co
15d0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 0a 20  nst char *z){.. 
15e0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
15f0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73   string contains
1600: 20 61 6e 79 20 22 20 63 68 61 72 61 63 74 65 72   any " character
1610: 73 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74  s. If it does, t
1620: 68 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 75  hen.  ** this fu
1630: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6d 61 6c 6c  nction will mall
1640: 6f 63 20 73 70 61 63 65 20 74 6f 20 63 72 65 61  oc space to crea
1650: 74 65 20 61 20 71 75 6f 74 65 64 20 76 65 72 73  te a quoted vers
1660: 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ion of.  ** the 
1670: 73 74 72 69 6e 67 20 69 6e 2e 20 4f 74 68 65 72  string in. Other
1680: 77 69 73 65 2c 20 73 61 76 65 20 61 20 63 61 6c  wise, save a cal
1690: 6c 20 74 6f 20 73 71 6c 69 74 65 33 4d 50 72 69  l to sqlite3MPri
16a0: 6e 74 66 28 29 20 62 79 0a 20 20 2a 2a 20 6a 75  ntf() by.  ** ju
16b0: 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70  st copying the p
16c0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74  ointer to the st
16d0: 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e  ring..  */.  con
16e0: 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b  st char *z2 = z;
16f0: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b  .  while( *z2 ){
1700: 0a 20 20 20 20 69 66 28 20 2a 7a 32 3d 3d 27 22  .    if( *z2=='"
1710: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a  ' ) break;.    z
1720: 32 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  2++;.  }..  if( 
1730: 2a 7a 32 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74  *z2 ){.    /* St
1740: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 22 20  ring contains " 
1750: 63 68 61 72 61 63 74 65 72 73 20 2d 20 63 6f 70  characters - cop
1760: 79 20 61 6e 64 20 71 75 6f 74 65 20 74 68 65 20  y and quote the 
1770: 73 74 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 70  string. */.    p
1780: 2d 3e 7a 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  ->z = (u8 *)sqli
1790: 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
17a0: 65 2d 3e 64 62 2c 20 22 5c 22 25 77 5c 22 22 2c  e->db, "\"%w\"",
17b0: 20 7a 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   z);.    if( p->
17c0: 7a 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 20  z ){.      p->n 
17d0: 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a  = strlen((char *
17e0: 29 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 2d  )p->z);.      p-
17f0: 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  >dyn = 1;.    }.
1800: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1810: 53 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20  String contains 
1820: 6e 6f 20 22 20 63 68 61 72 61 63 74 65 72 73 20  no " characters 
1830: 2d 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74  - copy the point
1840: 65 72 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 7a 20  er. */.    p->z 
1850: 3d 20 28 75 38 2a 29 7a 3b 0a 20 20 20 20 70 2d  = (u8*)z;.    p-
1860: 3e 6e 20 3d 20 28 7a 32 20 2d 20 7a 29 3b 0a 20  >n = (z2 - z);. 
1870: 20 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 20     p->dyn = 0;. 
1880: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
1890: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
18a0: 20 6e 6f 64 65 20 66 6f 72 20 61 6e 20 69 64 65   node for an ide
18b0: 6e 74 69 66 69 65 72 20 77 69 74 68 20 74 68 65  ntifier with the
18c0: 20 6e 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a   name of zName.*
18d0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 43  /.Expr *sqlite3C
18e0: 72 65 61 74 65 49 64 45 78 70 72 28 50 61 72 73  reateIdExpr(Pars
18f0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1900: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
1910: 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20   Token dummy;.  
1920: 73 65 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c  setToken(&dummy,
1930: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
1940: 6e 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  n sqlite3PExpr(p
1950: 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c  Parse, TK_ID, 0,
1960: 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a   0, &dummy);.}..
1970: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d  /*.** Add a term
1980: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 65 78   to the WHERE ex
1990: 70 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45  pression in *ppE
19a0: 78 70 72 20 74 68 61 74 20 72 65 71 75 69 72 65  xpr that require
19b0: 73 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f  s the.** zCol co
19c0: 6c 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c  lumn to be equal
19d0: 20 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c   in the two tabl
19e0: 65 73 20 70 54 61 62 31 20 61 6e 64 20 70 54 61  es pTab1 and pTa
19f0: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
1a00: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
1a10: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1a20: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
1a30: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1a40: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1a50: 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  zCol,        /* 
1a60: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
1a70: 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61  mn */.  const Ta
1a80: 62 6c 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20  ble *pTab1,     
1a90: 20 2f 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20   /* First table 
1aa0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1ab0: 2a 7a 41 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a  *zAlias1,     /*
1ac0: 20 41 6c 69 61 73 20 66 6f 72 20 66 69 72 73 74   Alias for first
1ad0: 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20   table.  May be 
1ae0: 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  NULL */.  const 
1af0: 54 61 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20  Table *pTab2,   
1b00: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62     /* Second tab
1b10: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
1b20: 61 72 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20  ar *zAlias2,    
1b30: 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 73 65   /* Alias for se
1b40: 63 6f 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61 79  cond table.  May
1b50: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
1b60: 74 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  t iRightJoinTabl
1b70: 65 2c 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63  e,     /* VDBE c
1b80: 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 72 69  ursor for the ri
1b90: 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  ght table */.  E
1ba0: 78 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20  xpr **ppExpr,   
1bb0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1bc0: 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  he equality term
1bd0: 20 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73   to this express
1be0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ion */.  int isO
1bf0: 75 74 65 72 4a 6f 69 6e 20 20 20 20 20 20 20 20  uterJoin        
1c00: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 64 65 61    /* True if dea
1c10: 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 4f 55 54  ling with an OUT
1c20: 45 52 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20  ER join */.){.  
1c30: 45 78 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31  Expr *pE1a, *pE1
1c40: 62 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72  b, *pE1c;.  Expr
1c50: 20 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a   *pE2a, *pE2b, *
1c60: 70 45 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45  pE2c;.  Expr *pE
1c70: 3b 0a 0a 20 20 70 45 31 61 20 3d 20 73 71 6c 69  ;..  pE1a = sqli
1c80: 74 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28  te3CreateIdExpr(
1c90: 70 50 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20  pParse, zCol);. 
1ca0: 20 70 45 32 61 20 3d 20 73 71 6c 69 74 65 33 43   pE2a = sqlite3C
1cb0: 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72  reateIdExpr(pPar
1cc0: 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 69 66 28  se, zCol);.  if(
1cd0: 20 7a 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20   zAlias1==0 ){. 
1ce0: 20 20 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61     zAlias1 = pTa
1cf0: 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  b1->zName;.  }. 
1d00: 20 70 45 31 62 20 3d 20 73 71 6c 69 74 65 33 43   pE1b = sqlite3C
1d10: 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72  reateIdExpr(pPar
1d20: 73 65 2c 20 7a 41 6c 69 61 73 31 29 3b 0a 20 20  se, zAlias1);.  
1d30: 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29  if( zAlias2==0 )
1d40: 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32 20 3d 20  {.    zAlias2 = 
1d50: 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTab2->zName;.  
1d60: 7d 0a 20 20 70 45 32 62 20 3d 20 73 71 6c 69 74  }.  pE2b = sqlit
1d70: 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70  e3CreateIdExpr(p
1d80: 50 61 72 73 65 2c 20 7a 41 6c 69 61 73 32 29 3b  Parse, zAlias2);
1d90: 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69 74 65  .  pE1c = sqlite
1da0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1db0: 4b 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31  K_DOT, pE1b, pE1
1dc0: 61 2c 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20  a, 0);.  pE2c = 
1dd0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
1de0: 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 32  rse, TK_DOT, pE2
1df0: 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70  b, pE2a, 0);.  p
1e00: 45 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  E = sqlite3PExpr
1e10: 28 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20  (pParse, TK_EQ, 
1e20: 70 45 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a  pE1c, pE2c, 0);.
1e30: 20 20 69 66 28 20 70 45 20 26 26 20 69 73 4f 75    if( pE && isOu
1e40: 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45  terJoin ){.    E
1e50: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1e60: 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  E, EP_FromJoin);
1e70: 0a 20 20 20 20 70 45 2d 3e 69 52 69 67 68 74 4a  .    pE->iRightJ
1e80: 6f 69 6e 54 61 62 6c 65 20 3d 20 69 52 69 67 68  oinTable = iRigh
1e90: 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a  tJoinTable;.  }.
1ea0: 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69    *ppExpr = sqli
1eb0: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
1ec0: 65 2d 3e 64 62 2c 2a 70 70 45 78 70 72 2c 20 70  e->db,*ppExpr, p
1ed0: 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  E);.}../*.** Set
1ee0: 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   the EP_FromJoin
1ef0: 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c   property on all
1f00: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69   terms of the gi
1f10: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ven expression..
1f20: 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45  ** And set the E
1f30: 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
1f40: 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f  ble to iTable fo
1f50: 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  r every term in 
1f60: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
1f70: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f  n..**.** The EP_
1f80: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
1f90: 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72  y is used on ter
1fa0: 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  ms of an express
1fb0: 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74  ion to tell.** t
1fc0: 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  he LEFT OUTER JO
1fd0: 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  IN processing lo
1fe0: 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65  gic that this te
1ff0: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  rm is part of th
2000: 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69  e.** join restri
2010: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
2020: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2030: 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  NG clause and no
2040: 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  t a part.** of t
2050: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
2060: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54  WHERE clause.  T
2070: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d  hese terms are m
2080: 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65  oved over to the
2090: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
20a0: 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f   during join pro
20b0: 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e  cessing but we n
20c0: 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
20d0: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69  that they.** ori
20e0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
20f0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2100: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70  e..**.** The Exp
2110: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
2120: 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52  e tells the WHER
2130: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
2140: 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ing that the.** 
2150: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e  expression depen
2160: 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67  ds on table iRig
2170: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e  htJoinTable even
2180: 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69   if that table i
2190: 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69  s not.** explici
21a0: 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  tly mentioned in
21b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
21c0: 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69    That informati
21d0: 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20  on is needed.** 
21e0: 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74  for cases like t
21f0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
2200: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
2210: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
2220: 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e  1.a=t2.b AND t1.
2230: 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68  x=5.**.** The wh
2240: 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73  ere clause needs
2250: 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61   to defer the ha
2260: 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31  ndling of the t1
2270: 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74  .x=5.** term unt
2280: 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20  il after the t2 
2290: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e  loop of the join
22a0: 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  .  In that way, 
22b0: 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77  a.** NULL t2 row
22c0: 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
22d0: 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21  d whenever t1.x!
22e0: 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f  =5.  If we do no
22f0: 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68  t.** defer the h
2300: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d  andling of t1.x=
2310: 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72  5, it will be pr
2320: 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74  ocessed immediat
2330: 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65  ely.** after the
2340: 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77   t1 loop and row
2350: 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77  s with t1.x!=5 w
2360: 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72  ill never appear
2370: 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75   in.** the outpu
2380: 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f  t, which is inco
2390: 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
23a0: 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70   void setJoinExp
23b0: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  r(Expr *p, int i
23c0: 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28  Table){.  while(
23d0: 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65   p ){.    ExprSe
23e0: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
23f0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70  FromJoin);.    p
2400: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2410: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
2420: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70  setJoinExpr(p->p
2430: 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Left, iTable);. 
2440: 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74     p = p->pRight
2450: 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ;.  } .}../*.** 
2460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f  This routine pro
2470: 63 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20  cesses the join 
2480: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
2490: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
24a0: 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53  nt..** ON and US
24b0: 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20  ING clauses are 
24c0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65  converted into e
24d0: 78 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68  xtra terms of th
24e0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
24f0: 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73  ** NATURAL joins
2500: 20 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74   also create ext
2510: 72 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ra WHERE clause 
2520: 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  terms..**.** The
2530: 20 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d   terms of a FROM
2540: 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74   clause are cont
2550: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c  ained in the Sel
2560: 65 63 74 2e 70 53 72 63 20 73 74 72 75 63 74 75  ect.pSrc structu
2570: 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20  re..** The left 
2580: 6d 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74 68  most table is th
2590: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
25a0: 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54   Select.pSrc.  T
25b0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a  he right-most.**
25c0: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61   table is the la
25d0: 73 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a  st entry.  The j
25e0: 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20  oin operator is 
25f0: 68 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72  held in the entr
2600: 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74  y to.** the left
2610: 2e 20 20 54 68 75 73 20 65 6e 74 72 79 20 30 20  .  Thus entry 0 
2620: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69  contains the joi
2630: 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74  n operator for t
2640: 68 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a  he join between.
2650: 2a 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64  ** entries 0 and
2660: 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55   1.  Any ON or U
2670: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73  SING clauses ass
2680: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2690: 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73   join are.** als
26a0: 6f 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  o attached to th
26b0: 65 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a  e left entry..**
26c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
26d0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
26e0: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
26f0: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74  countered..*/.st
2700: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50  atic int sqliteP
2710: 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65  rocessJoin(Parse
2720: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
2730: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
2740: 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20  *pSrc;          
2750: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74          /* All t
2760: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2770: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  M clause */.  in
2780: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27a0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
27b0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
27c0: 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20  st_item *pLeft; 
27d0: 20 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c      /* Left tabl
27e0: 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a  e being joined *
27f0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
2800: 73 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b  st_item *pRight;
2810: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62      /* Right tab
2820: 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20  le being joined 
2830: 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e  */..  pSrc = p->
2840: 70 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20  pSrc;.  pLeft = 
2850: 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70  &pSrc->a[0];.  p
2860: 52 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31  Right = &pLeft[1
2870: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
2880: 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b  pSrc->nSrc-1; i+
2890: 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65  +, pRight++, pLe
28a0: 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  ft++){.    Table
28b0: 20 2a 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65   *pLeftTab = pLe
28c0: 66 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61  ft->pTab;.    Ta
28d0: 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d  ble *pRightTab =
28e0: 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20   pRight->pTab;. 
28f0: 20 20 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a     int isOuter;.
2900: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 54 61  .    if( pLeftTa
2910: 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61  b==0 || pRightTa
2920: 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
2930: 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28  .    isOuter = (
2940: 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65  pRight->jointype
2950: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b   & JT_OUTER)!=0;
2960: 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68  ..    /* When th
2970: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
2980: 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64  d is present, ad
2990: 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  d WHERE clause t
29a0: 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erms for.    ** 
29b0: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61  every column tha
29c0: 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  t the two tables
29d0: 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e   have in common.
29e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29f0: 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65  pRight->jointype
2a00: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b   & JT_NATURAL ){
2a10: 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68  .      if( pRigh
2a20: 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74  t->pOn || pRight
2a30: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
2a40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2a50: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e  Msg(pParse, "a N
2a60: 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20  ATURAL join may 
2a70: 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20 20  not have ".     
2a80: 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20        "an ON or 
2a90: 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30  USING clause", 0
2aa0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2ab0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
2ac0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
2ad0: 65 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  eftTab->nCol; j+
2ae0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
2af0: 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54   *zName = pLeftT
2b00: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
2b10: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  e;.        if( c
2b20: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68  olumnIndex(pRigh
2b30: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  tTab, zName)>=0 
2b40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
2b50: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
2b60: 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61  , zName, pLeftTa
2b70: 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73  b, pLeft->zAlias
2b80: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 70 52 69 67 68 74 54 61 62 2c 20 70 52 69 67   pRightTab, pRig
2bb0: 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20  ht->zAlias,.    
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
2be0: 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70  ->iCursor, &p->p
2bf0: 57 68 65 72 65 2c 20 69 73 4f 75 74 65 72 29 3b  Where, isOuter);
2c00: 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  .          .    
2c10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61    }..    /* Disa
2c30: 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64  llow both ON and
2c40: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69   USING clauses i
2c50: 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a  n the same join.
2c60: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2c70: 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52  Right->pOn && pR
2c80: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
2c90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2ca0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
2cb0: 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20  annot have both 
2cc0: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20  ON and USING ". 
2cd0: 20 20 20 20 20 20 20 22 63 6c 61 75 73 65 73 20         "clauses 
2ce0: 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e  in the same join
2cf0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
2d00: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
2d10: 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61  * Add the ON cla
2d20: 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  use to the end o
2d30: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2d40: 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  se, connected by
2d50: 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f  .    ** an AND o
2d60: 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a  perator..    */.
2d70: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
2d80: 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  pOn ){.      if(
2d90: 20 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f   isOuter ) setJo
2da0: 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70  inExpr(pRight->p
2db0: 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72  On, pRight->iCur
2dc0: 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  sor);.      p->p
2dd0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
2de0: 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
2df0: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52  b, p->pWhere, pR
2e00: 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  ight->pOn);.    
2e10: 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20    pRight->pOn = 
2e20: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
2e30: 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65   Create extra te
2e40: 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45  rms on the WHERE
2e50: 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68   clause for each
2e60: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20   column named.  
2e70: 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e    ** in the USIN
2e80: 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70  G clause.  Examp
2e90: 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74  le: If the two t
2ea0: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
2eb0: 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41  ed are .    ** A
2ec0: 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55   and B and the U
2ed0: 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65  SING clause name
2ee0: 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74  s X, Y, and Z, t
2ef0: 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20  hen add this.   
2f00: 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45   ** to the WHERE
2f10: 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d   clause:    A.X=
2f20: 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20  B.X AND A.Y=B.Y 
2f30: 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20  AND A.Z=B.Z.    
2f40: 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  ** Report an err
2f50: 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  or if any column
2f60: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
2f70: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69  e USING clause i
2f80: 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e  s.    ** not con
2f90: 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74  tained in both t
2fa0: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
2fb0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
2fc0: 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e  f( pRight->pUsin
2fd0: 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73  g ){.      IdLis
2fe0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68  t *pList = pRigh
2ff0: 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20  t->pUsing;.     
3000: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73   for(j=0; j<pLis
3010: 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20  t->nId; j++){.  
3020: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
3030: 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  e = pList->a[j].
3040: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
3050: 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  f( columnIndex(p
3060: 4c 65 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c  LeftTab, zName)<
3070: 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  0 || columnIndex
3080: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
3090: 65 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e)<0 ){.        
30a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
30b0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
30c0: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
30d0: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
30e0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
30f0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
3100: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
3110: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
3120: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
3130: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
3140: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a  reTerm(pParse, z
3150: 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20  Name, pLeftTab, 
3160: 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a  pLeft->zAlias, .
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
3190: 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a  htTab, pRight->z
31a0: 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20  Alias,.         
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c0: 20 20 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73     pRight->iCurs
31d0: 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 2c 20  or, &p->pWhere, 
31e0: 69 73 4f 75 74 65 72 29 3b 0a 20 20 20 20 20 20  isOuter);.      
31f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
3200: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
3210: 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74   Insert code int
3220: 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20  o "v" that will 
3230: 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20  push the record 
3240: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
3250: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20  e.** stack into 
3260: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73  the sorter..*/.s
3270: 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f  tatic void pushO
3280: 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61 72  ntoSorter(.  Par
3290: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
32a0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
32b0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
32c0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
32d0: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
32e0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65  Y clause */.  Se
32f0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
3300: 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
3310: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3320: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  nt */.  int regD
3330: 61 74 61 20 20 20 20 20 20 20 20 20 20 20 20 2f  ata            /
3340: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
3350: 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f  ng data to be so
3360: 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  rted */.){.  Vdb
3370: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
3380: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6e 45 78 70  Vdbe;.  int nExp
3390: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  r = pOrderBy->nE
33a0: 78 70 72 3b 0a 20 20 69 6e 74 20 72 65 67 42 61  xpr;.  int regBa
33b0: 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
33c0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
33d0: 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69 6e 74   nExpr+2);.  int
33e0: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
33f0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
3400: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
3410: 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
3420: 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
3430: 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b  By, regBase, 0);
3440: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3450: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
3460: 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  nce, pOrderBy->i
3470: 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65  ECursor, regBase
3480: 2b 6e 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74  +nExpr);.  sqlit
3490: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
34a0: 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20  Parse, regData, 
34b0: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 31 2c  regBase+nExpr+1,
34c0: 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   1);.  sqlite3Vd
34d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
34e0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
34f0: 73 65 2c 20 6e 45 78 70 72 20 2b 20 32 2c 20 72  se, nExpr + 2, r
3500: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
3510: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3520: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
3530: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
3540: 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  or, regRecord);.
3550: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
3560: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
3570: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
3580: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
3590: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
35a0: 67 42 61 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b  gBase, nExpr+2);
35b0: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
35c0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e  iLimit ){.    in
35d0: 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a  t addr1, addr2;.
35e0: 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a      int iLimit;.
35f0: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d      if( pSelect-
3600: 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >iOffset ){.    
3610: 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65    iLimit = pSele
3620: 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20  ct->iOffset+1;. 
3630: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3640: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
3650: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a  ->iLimit;.    }.
3660: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
3670: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
3680: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d   OP_IfZero, iLim
3690: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
36a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
36b0: 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c  _AddImm, iLimit,
36c0: 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20   -1);.    addr2 
36d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
36e0: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
36f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3700: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
3710: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
3720: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
3730: 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e  Last, pOrderBy->
3740: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  iECursor);.    s
3750: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
3760: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70  (v, OP_Delete, p
3770: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
3780: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
3790: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
37a0: 64 64 72 32 29 3b 0a 20 20 20 20 70 53 65 6c 65  ddr2);.    pSele
37b0: 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ct->iLimit = 0;.
37c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
37d0: 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65   code to impleme
37e0: 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f  nt the OFFSET.*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
3800: 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20  eOffset(.  Vdbe 
3810: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *v,          /* 
3820: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
3830: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
3840: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
3850: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
3860: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
3870: 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
3880: 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20  Continue     /* 
3890: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
38a0: 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  p the current re
38b0: 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  cord */.){.  if(
38c0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 26 26 20 69   p->iOffset && i
38d0: 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20  Continue!=0 ){. 
38e0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
38f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3900: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
3910: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 2d 31 29   p->iOffset, -1)
3920: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
3930: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3940: 2c 20 4f 50 5f 49 66 4e 65 67 2c 20 70 2d 3e 69  , OP_IfNeg, p->i
3950: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c  Offset);.    sql
3960: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3970: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43  , OP_Goto, 0, iC
3980: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64  ontinue);.    Vd
3990: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
39a0: 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72  kip OFFSET recor
39b0: 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ds"));.    sqlit
39c0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
39d0: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
39e0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
39f0: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
3a00: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
3a10: 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  N registers star
3a20: 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20  ting at iMem.** 
3a30: 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20  form a distinct 
3a40: 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20  entry.  iTab is 
3a50: 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
3a60: 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69  that holds previ
3a70: 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f  ously.** seen co
3a80: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68  mbinations of th
3a90: 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e  e N values.  A n
3aa0: 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  ew entry is made
3ab0: 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74   in iTab.** if t
3ac0: 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c  he current N val
3ad0: 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a  ues are new..**.
3ae0: 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64  ** A jump to add
3af0: 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20  rRepeat is made 
3b00: 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75  and the N+1 valu
3b10: 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72  es are popped fr
3b20: 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  om the.** stack 
3b30: 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  if the top N ele
3b40: 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69  ments are not di
3b50: 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  stinct..*/.stati
3b60: 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69  c void codeDisti
3b70: 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nct(.  Parse *pP
3b80: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
3b90: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
3ba0: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
3bb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
3bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
3bd0: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
3be0: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
3bf0: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
3c00: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
3c10: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
3c20: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
3c30: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
3c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3c50: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
3c60: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20  */.  int iMem   
3c70: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
3c80: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
3c90: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
3ca0: 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  r1;..  v = pPars
3cb0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d  e->pVdbe;.  r1 =
3cc0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
3cd0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
3ce0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
3cf0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3d00: 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a  , iMem, N, r1);.
3d10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3d20: 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Op3(v, OP_Found,
3d30: 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61   iTab, addrRepea
3d40: 74 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  t, r1);.  sqlite
3d50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3d60: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
3d70: 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  b, r1);.  sqlite
3d80: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
3d90: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
3da0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
3db0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
3dc0: 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73  when a SELECT is
3dd0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 73   used within a s
3de0: 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  ubexpression.** 
3df0: 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e  (example:  "a IN
3e00: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
3e10: 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74 20  table)") but it 
3e20: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20  has more than 1 
3e30: 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  result.** column
3e40: 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e  .  We do this in
3e50: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65   a subroutine be
3e60: 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72 20  cause the error 
3e70: 6f 63 63 75 72 73 20 69 6e 20 6d 75 6c 74 69 70  occurs in multip
3e80: 6c 65 0a 2a 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f  le.** places..*/
3e90: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
3ea0: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
3eb0: 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61  electError(.  Pa
3ec0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3ed0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
3ee0: 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ext. */.  Select
3ef0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f  Dest *pDest,   /
3f00: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66  * Destination of
3f10: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
3f20: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20  */.  int nExpr  
3f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3f40: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
3f50: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
3f60: 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  y SELECT */.){. 
3f70: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
3f80: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28  st->eDest;.  if(
3f90: 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65   nExpr>1 && (eDe
3fa0: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
3fb0: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29  Dest==SRT_Set) )
3fc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
3fd0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
3fe0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
3ff0: 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
4000: 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
4010: 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
4020: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
4030: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
4040: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
4050: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
4060: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4070: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
4080: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
4090: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
40a0: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
40b0: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ELECT..**.** If 
40c0: 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75  srcTab and nColu
40d0: 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f  mn are both zero
40e0: 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73  , then the pELis
40f0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
4100: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
4110: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
4120: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
4130: 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d   row.  If nColum
4140: 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61  n>0.** then data
4150: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
4160: 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73  srcTab and pELis
4170: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  t is used only t
4180: 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74  o get the.** dat
4190: 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68 20  atypes for each 
41a0: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
41b0: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e  c void selectInn
41c0: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
41d0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
41e0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
41f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
4200: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
4210: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
4220: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
4230: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
4240: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
4250: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
4260: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
4270: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
4280: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
4290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
42a0: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
42b0: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
42c0: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
42d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
42e0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
42f0: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
4300: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4310: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
4320: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f   If not NULL, so
4330: 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67  rt results using
4340: 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69   this key */.  i
4350: 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20  nt distinct,    
4360: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30         /* If >=0
4370: 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75  , make sure resu
4380: 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74  lts are distinct
4390: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
43a0: 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a   *pDest,      /*
43b0: 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
43c0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
43d0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
43e0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  e,          /* J
43f0: 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
4400: 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72  inue with next r
4410: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ow */.  int iBre
4420: 61 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ak,             
4430: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
4440: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
4450: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20   inner loop */. 
4460: 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
4470: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 66 66 69           /* affi
4480: 6e 69 74 79 20 73 74 72 69 6e 67 20 69 66 20 65  nity string if e
4490: 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f  Dest is SRT_Unio
44a0: 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  n */.){.  Vdbe *
44b0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
44c0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
44d0: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
44e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
44f0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
4500: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
4510: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73   */.  int regRes
4520: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ult;            
4530: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65    /* Start of me
4540: 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73  mory holding res
4550: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  ult set */.  int
4560: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
4570: 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20  eDest;   /* How 
4580: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65  to dispose of re
4590: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
45a0: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50  Parm = pDest->iP
45b0: 61 72 6d 3b 20 20 20 2f 2a 20 46 69 72 73 74 20  arm;   /* First 
45c0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70  argument to disp
45d0: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
45e0: 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b   int nResultCol;
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4600: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
4610: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 69   columns */..  i
4620: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
4630: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
4640: 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  st!=0 );..  /* I
4650: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 4c 49  f there was a LI
4660: 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  MIT clause on th
4670: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
4680: 6e 74 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  nt, then do the 
4690: 63 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65  check.  ** to se
46a0: 65 20 69 66 20 74 68 69 73 20 72 6f 77 20 73 68  e if this row sh
46b0: 6f 75 6c 64 20 62 65 20 6f 75 74 70 75 74 2e 0a  ould be output..
46c0: 20 20 2a 2f 0a 20 20 68 61 73 44 69 73 74 69 6e    */.  hasDistin
46d0: 63 74 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30  ct = distinct>=0
46e0: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
46f0: 72 3e 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  r>0;.  if( pOrde
4700: 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73 44 69  rBy==0 && !hasDi
4710: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f  stinct ){.    co
4720: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69  deOffset(v, p, i
4730: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a  Continue);.  }..
4740: 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65    /* Pull the re
4750: 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e  quested columns.
4760: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c  .  */.  if( nCol
4770: 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 6e 52 65  umn>0 ){.    nRe
4780: 73 75 6c 74 43 6f 6c 20 3d 20 6e 43 6f 6c 75 6d  sultCol = nColum
4790: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
47a0: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c  nResultCol = pEL
47b0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  ist->nExpr;.  }.
47c0: 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d 65    if( pDest->iMe
47d0: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 65 73  m==0 ){.    pDes
47e0: 74 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  t->iMem = pParse
47f0: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 44  ->nMem+1;.    pD
4800: 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 6e 52 65 73  est->nMem = nRes
4810: 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 70 50 61 72  ultCol;.    pPar
4820: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73  se->nMem += nRes
4830: 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20  ultCol;.  }else 
4840: 69 66 28 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 21  if( pDest->nMem!
4850: 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 7b 0a 20  =nResultCol ){. 
4860: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
4870: 6e 73 20 77 68 65 6e 20 74 77 6f 20 53 45 4c 45  ns when two SELE
4880: 43 54 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  CTs of a compoun
4890: 64 20 53 45 4c 45 43 54 20 68 61 76 65 20 64 69  d SELECT have di
48a0: 66 66 65 72 69 6e 67 0a 20 20 20 20 2a 2a 20 6e  ffering.    ** n
48b0: 75 6d 62 65 72 73 20 6f 66 20 72 65 73 75 6c 74  umbers of result
48c0: 20 63 6f 6c 75 6d 6e 73 2e 20 20 54 68 65 20 65   columns.  The e
48d0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c  rror message wil
48e0: 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 62  l be generated b
48f0: 79 0a 20 20 20 20 2a 2a 20 61 20 68 69 67 68 65  y.    ** a highe
4900: 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 2e  r-level routine.
4910: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
4920: 20 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20    }.  regResult 
4930: 3d 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20  = pDest->iMem;. 
4940: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
4950: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
4960: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
4970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4980: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
4990: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c  lumn, srcTab, i,
49a0: 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20   regResult+i);. 
49b0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
49c0: 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73   eDest!=SRT_Exis
49d0: 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ts ){.    /* If 
49e0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
49f0: 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e  is an EXISTS(...
4a00: 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  ) expression, th
4a10: 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20  e actual.    ** 
4a20: 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20  values returned 
4a30: 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  by the SELECT ar
4a40: 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  e not required..
4a50: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
4a60: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
4a70: 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  st(pParse, pELis
4a80: 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 65 44  t, regResult, eD
4a90: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
4aa0: 6b 29 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d  k);.  }.  nColum
4ab0: 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  n = nResultCol;.
4ac0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
4ad0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
4ae0: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
4af0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4b00: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
4b10: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
4b20: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
4b30: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
4b40: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
4b50: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
4b60: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
4b70: 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nct ){.    asser
4b80: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
4b90: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
4ba0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75  st->nExpr==nColu
4bb0: 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44 69  mn );.    codeDi
4bc0: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 64  stinct(pParse, d
4bd0: 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e  istinct, iContin
4be0: 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ue, nColumn, reg
4bf0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 69 66 28  Result);.    if(
4c00: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
4c10: 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74        codeOffset
4c20: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
4c30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
4c40: 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74  if( checkForMult
4c50: 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72  iColumnSelectErr
4c60: 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  or(pParse, pDest
4c70: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
4c80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
4c90: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
4ca0: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
4cb0: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
4cc0: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
4cd0: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
4ce0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
4cf0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
4d00: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
4d10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4d20: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
4d30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
4d40: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
4d50: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
4d60: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
4d70: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
4d80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4d90: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4da0: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
4db0: 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20  Column, r1);.   
4dc0: 20 20 20 69 66 28 20 61 66 66 20 29 7b 0a 20 20     if( aff ){.  
4dd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4de0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
4df0: 20 61 66 66 2c 20 50 34 5f 53 54 41 54 49 43 29   aff, P4_STATIC)
4e00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4e10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4e20: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
4e30: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
4e40: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
4e50: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
4e60: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
4e70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
4e80: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
4e90: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
4ea0: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
4eb0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
4ec0: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
4ed0: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
4ee0: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
4ef0: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
4f00: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
4f10: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
4f20: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4f30: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
4f40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4f50: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
4f60: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
4f70: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
4f80: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
4f90: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
4fa0: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
4fb0: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
4fc0: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
4fd0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
4fe0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
4ff0: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
5000: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
5010: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5020: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5030: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5040: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
5050: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
5060: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  sult, nColumn, r
5070: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  1);.      if( pO
5080: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
5090: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
50a0: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
50b0: 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  y, p, r1);.     
50c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
50d0: 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
50e0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
50f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
5100: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5110: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
5120: 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
5130: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5140: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
5150: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  , iParm, r1, r2)
5160: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5170: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
5180: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
5190: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
51a0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
51b0: 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
51c0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
51d0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
51e0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
51f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5200: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5210: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
5220: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
5230: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
5240: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
5250: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
5260: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
5270: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
5280: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
5290: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
52a0: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
52b0: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
52c0: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
52d0: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
52e0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
52f0: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
5300: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
5310: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e  ;.      p->affin
5320: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  ity = sqlite3Com
5330: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
5340: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
5350: 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
5360: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
5370: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
5380: 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61   /* At first gla
5390: 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68  nce you would th
53a0: 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74  ink we could opt
53b0: 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20  imize out the.  
53c0: 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
53d0: 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73  Y in this case s
53e0: 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f  ince the order o
53f0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
5400: 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   set.        ** 
5410: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e  does not matter.
5420: 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68    But there migh
5430: 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61  t be a LIMIT cla
5440: 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20  use, in which.  
5450: 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68        ** case th
5460: 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74  e order does mat
5470: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ter */.        p
5480: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
5490: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
54a0: 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  p, regResult);. 
54b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
54c0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
54d0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
54e0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
54f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5500: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
5510: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31  rd, regResult, 1
5520: 2c 20 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69  , r1, &p->affini
5530: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
5540: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
5550: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
5560: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
5570: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
5580: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5590: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
55a0: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
55b0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
55c0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
55d0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r1);.      }.
55e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
55f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
5600: 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
5610: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
5620: 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
5630: 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
5640: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
5650: 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
5660: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5670: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
5680: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
5690: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
56a0: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
56b0: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
56c0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
56d0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
56e0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
56f0: 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
5700: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
5710: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
5720: 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
5730: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
5740: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
5750: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
5760: 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
5770: 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
5780: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5790: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
57a0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
57b0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
57c0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
57d0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
57e0: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
57f0: 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75  erBy, p, regResu
5800: 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lt);.      }else
5810: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5820: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
5830: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
5840: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
5850: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
5860: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
5870: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
5880: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
5890: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
58a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
58b0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
58c0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
58d0: 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68  ..    /* Send th
58e0: 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61  e data to the ca
58f0: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
5900: 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  or to a subrouti
5910: 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20  ne.  In the.    
5920: 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75 62  ** case of a sub
5930: 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62  routine, the sub
5940: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69  routine itself i
5950: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
5960: 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67  r.    ** popping
5970: 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74   the data from t
5980: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f  he stack..    */
5990: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
59a0: 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73  routine:.    cas
59b0: 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 20  e SRT_Callback: 
59c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  {.      if( pOrd
59d0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
59e0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
59f0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
5a00: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
5a10: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5a20: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5a30: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
5a40: 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  mn, r1);.       
5a50: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
5a60: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
5a70: 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  , p, r1);.      
5a80: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
5a90: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5aa0: 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r1);.      }else
5ab0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
5ac0: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
5ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5ae0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
5af0: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ld, pDest->iParm
5b00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5b10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5b20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5b30: 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65  ResultRow, regRe
5b40: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  sult, nColumn);.
5b50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5b60: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
5b70: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
5b80: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5b90: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
5ba0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5bb0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
5bc0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
5bd0: 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64  ).    /* Discard
5be0: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
5bf0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
5c00: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
5c10: 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20  s inside.    ** 
5c20: 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52  the body of a TR
5c30: 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70  IGGER.  The purp
5c40: 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65  ose of such sele
5c50: 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20  cts is to call. 
5c60: 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e     ** user-defin
5c70: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ed functions tha
5c80: 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65  t have side effe
5c90: 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  cts.  We do not 
5ca0: 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75  care.    ** abou
5cb0: 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73  t the actual res
5cc0: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
5cd0: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ct..    */.    d
5ce0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5cf0: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
5d00: 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20  RT_Discard );.  
5d10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5d20: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
5d30: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
5d40: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
5d50: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
5d60: 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
5d70: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 70  ( p->iLimit && p
5d80: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
5d90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5da0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
5db0: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31 29  , p->iLimit, -1)
5dc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5dd0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
5de0: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
5df0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 7d 0a   iBreak);.  }.}.
5e00: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
5e10: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
5e20: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
5e30: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
5e40: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
5e50: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
5e60: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
5e70: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
5e80: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
5e90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
5ea0: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
5eb0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
5ec0: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
5ed0: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
5ee0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
5ef0: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
5f00: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
5f10: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
5f20: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
5f30: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
5f40: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
5f50: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
5f60: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
5f70: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
5f80: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
5f90: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
5fa0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
5fb0: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
5fc0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
5fd0: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
5fe0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
5ff0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
6000: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
6010: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54   from malloc.  T
6020: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
6030: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
6040: 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67  sible for seeing
6050: 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63   that this struc
6060: 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c  ture is eventual
6070: 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64  ly.** freed.  Ad
6080: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
6090: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 50  ructure to the P
60a0: 34 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70  4 field of an op
60b0: 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 34  code using.** P4
60c0: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
60d0: 20 69 73 20 74 68 65 20 75 73 75 61 6c 20 77 61   is the usual wa
60e0: 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74  y of dealing wit
60f0: 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  h this..*/.stati
6100: 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e  c KeyInfo *keyIn
6110: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50  foFromExprList(P
6120: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
6130: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
6140: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6150: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
6160: 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e  t nExpr;.  KeyIn
6170: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72  fo *pInfo;.  str
6180: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
6190: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
61a0: 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c  i;..  nExpr = pL
61b0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
61c0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
61d0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
61e0: 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e  zeof(*pInfo) + n
61f0: 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  Expr*(sizeof(Col
6200: 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69  lSeq*)+1) );.  i
6210: 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
6220: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
6230: 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66 6f 2d  r = (u8*)&pInfo-
6240: 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20  >aColl[nExpr];. 
6250: 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64     pInfo->nField
6260: 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20 70 49   = nExpr;.    pI
6270: 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64  nfo->enc = ENC(d
6280: 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  b);.    for(i=0,
6290: 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
62a0: 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70   i<nExpr; i++, p
62b0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43  Item++){.      C
62c0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
62d0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
62e0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
62f0: 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
6300: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
6310: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
6320: 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70     pColl = db->p
6330: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
6340: 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  }.      pInfo->a
6350: 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b  Coll[i] = pColl;
6360: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53  .      pInfo->aS
6370: 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49  ortOrder[i] = pI
6380: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
6390: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
63a0: 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a  rn pInfo;.}.../*
63b0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72  .** If the inner
63c0: 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61   loop was genera
63d0: 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d  ted using a non-
63e0: 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72  null pOrderBy ar
63f0: 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20  gument,.** then 
6400: 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65  the results were
6410: 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72   placed in a sor
6420: 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20  ter.  After the 
6430: 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74  loop is terminat
6440: 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f  ed.** we need to
6450: 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20   run the sorter 
6460: 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72  and output the r
6470: 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c  esults.  The fol
6480: 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e  lowing.** routin
6490: 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  e generates the 
64a0: 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64  code needed to d
64b0: 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69  o that..*/.stati
64c0: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53  c void generateS
64d0: 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65  ortTail(.  Parse
64e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
64f0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
6500: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
6510: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
6520: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
6530: 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  /.  Vdbe *v,    
6540: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
6550: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
6560: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
6570: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20  Column,      /* 
6580: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
6590: 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53  s of data */.  S
65a0: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
65b0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f   /* Write the so
65c0: 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72  rted results her
65d0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 72  e */.){.  int br
65e0: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
65f0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69  akeLabel(v);.  i
6600: 6e 74 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65  nt cont = sqlite
6610: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
6620: 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  );.  int addr;. 
6630: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74   int iTab;.  int
6640: 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a   pseudoTab = 0;.
6650: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
6660: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
6670: 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73 74  By;..  int eDest
6680: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
6690: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
66a0: 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20  Dest->iParm;..  
66b0: 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e  int regRow;.  in
66c0: 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69  t regRowid;..  i
66d0: 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Tab = pOrderBy->
66e0: 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  iECursor;.  if( 
66f0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
6700: 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ack || eDest==SR
6710: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
6720: 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70     pseudoTab = p
6730: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
6740: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6750: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75  dOp2(v, OP_SetNu
6760: 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 6e 43 6f  mColumns, 0, nCo
6770: 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  lumn);.    sqlit
6780: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6790: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70  OP_OpenPseudo, p
67a0: 73 65 75 64 6f 54 61 62 2c 20 65 44 65 73 74 3d  seudoTab, eDest=
67b0: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 29 3b 0a  =SRT_Callback);.
67c0: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b    }.  addr = 1 +
67d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
67e0: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
67f0: 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64  Tab, brk);.  cod
6800: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 63 6f  eOffset(v, p, co
6810: 6e 74 29 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20  nt);.  regRow = 
6820: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6830: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67  g(pParse);.  reg
6840: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
6850: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
6860: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6870: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
6880: 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65  umn, iTab, pOrde
6890: 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20  rBy->nExpr + 1, 
68a0: 72 65 67 52 6f 77 29 3b 0a 20 20 73 77 69 74 63  regRow);.  switc
68b0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
68c0: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
68d0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
68e0: 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73  emTab: {.      s
68f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6900: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
6910: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
6920: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6930: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6940: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
6950: 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64  regRow, regRowid
6960: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6970: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6980: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
6990: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
69a0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
69b0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
69c0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
69d0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
69e0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
69f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6a00: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
6a10: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  keRecord, regRow
6a20: 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 20 26  , 1, regRowid, &
6a30: 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  p->affinity, 1);
6a40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
6a50: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
6a60: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
6a70: 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20  gRow, 1);.      
6a80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6a90: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
6aa0: 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  t, iParm, regRow
6ab0: 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  id);.      break
6ac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6ad0: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
6ae0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
6af0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
6b00: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
6b10: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
6b20: 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  , iParm, 1);.   
6b30: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
6b40: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
6b50: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
6b60: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
6b70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
6b80: 69 66 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  if.    case SRT_
6b90: 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61  Callback:.    ca
6ba0: 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
6bb0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
6bc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6bd0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6be0: 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 52 6f  nteger, 1, regRo
6bf0: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
6c00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6c10: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 73 65 75   OP_Insert, pseu
6c20: 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20 72  doTab, regRow, r
6c30: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
6c40: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
6c50: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
6c60: 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f 77    assert( regRow
6c70: 21 3d 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 20  !=pDest->iMem+i 
6c80: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6c90: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6ca0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64  OP_Column, pseud
6cb0: 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e  oTab, i, pDest->
6cc0: 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 20 20 7d  iMem+i);.      }
6cd0: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
6ce0: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
6cf0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6d00: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6d10: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65  P_ResultRow, pDe
6d20: 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d  st->iMem, nColum
6d30: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
6d40: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
6d50: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
6d60: 65 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20  e, pDest->iMem, 
6d70: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
6d80: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d  }else if( eDest=
6d90: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
6da0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6db0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6dc0: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
6dd0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  iParm);.      }.
6de0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6df0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6e00: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
6e10: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
6e20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
6e30: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
6e40: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
6e50: 72 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74  regRow);.  sqlit
6e60: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
6e70: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69  (pParse, regRowi
6e80: 64 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  d);..  /* Jump t
6e90: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
6ea0: 20 6c 6f 6f 70 20 77 68 65 6e 20 74 68 65 20 4c   loop when the L
6eb0: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 0a  IMIT is reached.
6ec0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
6ed0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
6ee0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6ef0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69   OP_AddImm, p->i
6f00: 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
6f10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6f20: 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  2(v, OP_IfZero, 
6f30: 70 2d 3e 69 4c 69 6d 69 74 2c 20 62 72 6b 29 3b  p->iLimit, brk);
6f40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62  .  }..  /* The b
6f50: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
6f60: 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
6f70: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
6f80: 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c  (v, cont);.  sql
6f90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6fa0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
6fb0: 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65   addr);.  sqlite
6fc0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
6fd0: 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28  l(v, brk);.  if(
6fe0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
6ff0: 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53  back || eDest==S
7000: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
7010: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7020: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
7030: 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  e, pseudoTab, 0)
7040: 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ;.  }..}../*.** 
7050: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
7060: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
7070: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
7080: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
7090: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
70a0: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
70b0: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
70c0: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
70d0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
70e0: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
70f0: 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20  ion type is the 
7100: 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64  exact datatype d
7110: 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63  efinition extrac
7120: 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ted from the.** 
7130: 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20  original CREATE 
7140: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
7150: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
7160: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54  n is a column. T
7170: 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f  he.** declaratio
7180: 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57  n type for a ROW
7190: 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45  ID field is INTE
71a0: 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65  GER. Exactly whe
71b0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  n an expression.
71c0: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
71d0: 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65   a column can be
71e0: 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20   complex in the 
71f0: 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71  presence of subq
7200: 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72  ueries. The.** r
7210: 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73  esult-set expres
7220: 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74  sion in all of t
7230: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c  he following SEL
7240: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
7250: 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  s .** considered
7260: 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69   a column by thi
7270: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
7280: 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46  *   SELECT col F
7290: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
72a0: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
72b0: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
72c0: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
72d0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  ol FROM tbl);.**
72e0: 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52     SELECT abc FR
72f0: 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41  OM (SELECT col A
7300: 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b  S abc FROM tbl);
7310: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c  .** .** The decl
7320: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
7330: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
7340: 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c  other than a col
7350: 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  umn is NULL..*/.
7360: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7370: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20  r *columnType(. 
7380: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
7390: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
73a0: 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r,.  const char 
73b0: 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20  **pzOriginDb,.  
73c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
73d0: 72 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73  riginTab,.  cons
73e0: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69  t char **pzOrigi
73f0: 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63  nCol.){.  char c
7400: 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b  onst *zType = 0;
7410: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
7420: 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20  OriginDb = 0;.  
7430: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
7440: 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  ginTab = 0;.  ch
7450: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69  ar const *zOrigi
7460: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nCol = 0;.  int 
7470: 6a 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  j;.  if( pExpr==
7480: 30 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  0 || pNC->pSrcLi
7490: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
74a0: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
74b0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
74c0: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
74d0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
74e0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
74f0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
7500: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
7510: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
7520: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
7530: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
7540: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
7550: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
7560: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
7570: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
7580: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
7590: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
75a0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
75b0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
75d0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
75e0: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
75f0: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
7600: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7620: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
7630: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
7640: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
7650: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
7660: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
7670: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
7680: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  Tab */.      whi
7690: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
76a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
76b0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
76c0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
76d0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
76e0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
76f0: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
7700: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
7710: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
7720: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
7730: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
7740: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
7750: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
7760: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
7770: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
7780: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
7790: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
77a0: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
77b0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
77c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
77d0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
77e0: 20 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45         /* FIX ME
77f0: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  :.        ** Thi
7800: 73 20 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20  s can occurs if 
7810: 79 6f 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69  you have somethi
7820: 6e 67 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20  ng like "SELECT 
7830: 6e 65 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20  new.x;" inside. 
7840: 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67         ** a trig
7850: 67 65 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ger.  In other w
7860: 6f 72 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66  ords, if you ref
7870: 65 72 65 6e 63 65 20 74 68 65 20 73 70 65 63 69  erence the speci
7880: 61 6c 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20  al "new".       
7890: 20 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65   ** table in the
78a0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
78b0: 20 73 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20   select.  We do 
78c0: 6e 6f 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20  not have a good 
78d0: 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  way.        ** t
78e0: 6f 20 66 69 6e 64 20 74 68 65 20 61 63 74 75 61  o find the actua
78f0: 6c 20 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f  l table type, so
7900: 20 63 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e   call it "TEXT".
7910: 20 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79    This is really
7920: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65  .        ** some
7930: 74 68 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20  thing of a bug, 
7940: 62 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f  but I do not kno
7950: 77 20 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e  w how to fix it.
7960: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
7970: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
7980: 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63   does not produc
7990: 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
79a0: 73 77 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70  swer - it just p
79b0: 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20  revents.        
79c0: 2a 2a 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20  ** a segfault.  
79d0: 53 65 65 20 74 69 63 6b 65 74 20 23 31 32 32 39  See ticket #1229
79e0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
79f0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45       zType = "TE
7a00: 58 54 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65  XT";.        bre
7a10: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
7a20: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20     assert( pTab 
7a30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20  );.      if( pS 
7a40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
7a50: 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74  e "table" is act
7a60: 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65  ually a sub-sele
7a70: 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20  ct or a view in 
7a80: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
7a90: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
7aa0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
7ab0: 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  nt. Return the d
7ac0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
7ad0: 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20  and origin.     
7ae0: 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74     ** data for t
7af0: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  he result-set co
7b00: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d  lumn of the sub-
7b10: 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20  select..        
7b20: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
7b30: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
7b40: 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  S->pEList->nExpr
7b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
7b60: 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73   If iCol is less
7b70: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
7b80: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7b90: 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20  requests the.   
7ba0: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20         ** rowid 
7bb0: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
7bc0: 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20  t or view. This 
7bd0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65  expression is le
7be0: 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20  gal (see .      
7bf0: 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65      ** test case
7c00: 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74   misc2.2.2) - it
7c10: 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65   always evaluate
7c20: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  s to NULL..     
7c30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
7c40: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
7c50: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  C;.          Exp
7c60: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
7c70: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
7c80: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
7c90: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
7ca0: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Src;.          s
7cb0: 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  NC.pNext = 0;.  
7cc0: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72          sNC.pPar
7cd0: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
7ce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
7cf0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
7d00: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e  sNC, p, &zOrigin
7d10: 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c  Db, &zOriginTab,
7d20: 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a   &zOriginCol); .
7d30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7d40: 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e  }else if( pTab->
7d50: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
7d60: 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62     /* A real tab
7d70: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  le */.        as
7d80: 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20  sert( !pS );.   
7d90: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
7da0: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
7db0: 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73  PKey;.        as
7dc0: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
7dd0: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
7de0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
7df0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
7e00: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
7e10: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
7e20: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ER";.          z
7e30: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77  OriginCol = "row
7e40: 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  id";.        }el
7e50: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se{.          zT
7e60: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
7e70: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
7e80: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43          zOriginC
7e90: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
7ea0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
7eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
7ec0: 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62  OriginTab = pTab
7ed0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
7ee0: 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65   if( pNC->pParse
7ef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
7f00: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
7f10: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43  chemaToIndex(pNC
7f20: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  ->pParse->db, pT
7f30: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
7f40: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44          zOriginD
7f50: 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d  b = pNC->pParse-
7f60: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
7f70: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ame;.        }. 
7f80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7f90: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
7fa0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
7fb0: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
7fc0: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
7fd0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
7fe0: 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65  sion is a sub-se
7ff0: 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65  lect. Return the
8000: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
8010: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f  e and.      ** o
8020: 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74  rigin info for t
8030: 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  he single column
8040: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
8050: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
8060: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
8070: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
8080: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
8090: 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  sNC;.      Selec
80a0: 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70  t *pS = pExpr->p
80b0: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78  Select;.      Ex
80c0: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
80d0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
80e0: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
80f0: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
8100: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
8110: 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e   pNC;.      sNC.
8120: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
8130: 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70  arse;.      zTyp
8140: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
8150: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e  sNC, p, &zOrigin
8160: 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c  Db, &zOriginTab,
8170: 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a   &zOriginCol); .
8180: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8190: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
81a0: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e 44  .  if( pzOriginD
81b0: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
81c0: 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26 20   pzOriginTab && 
81d0: 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20  pzOriginCol );. 
81e0: 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d     *pzOriginDb =
81f0: 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20 20   zOriginDb;.    
8200: 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a  *pzOriginTab = z
8210: 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a  OriginTab;.    *
8220: 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f  pzOriginCol = zO
8230: 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20  riginCol;.  }.  
8240: 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
8250: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
8260: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
8270: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
8280: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
8290: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
82a0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
82b0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
82c0: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
82d0: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
82e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
82f0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
8300: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
8310: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
8320: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
8330: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
8340: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
8350: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
8360: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
8370: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8380: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
8390: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
83a0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
83b0: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
83c0: 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  sNC;.  sNC.pSrcL
83d0: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
83e0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
83f0: 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30  Parse;.  for(i=0
8400: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
8410: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
8420: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
8430: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
8440: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
8450: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
8460: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
8470: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
8480: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
8490: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
84a0: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
84b0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
84c0: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
84d0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
84e0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
84f0: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
8500: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b  Tab, &zOrigCol);
8510: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62  ..    /* The vdb
8520: 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20  e must make its 
8530: 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20  own copy of the 
8540: 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20  column-type and 
8550: 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f  other .    ** co
8560: 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74  lumn specific st
8570: 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74  rings, in case t
8580: 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73  he schema is res
8590: 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20  et before this. 
85a0: 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
85b0: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
85c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
85d0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
85e0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
85f0: 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67  _DATABASE, zOrig
8600: 44 62 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54  Db, P4_TRANSIENT
8610: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8620: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8630: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45  i, COLNAME_TABLE
8640: 2c 20 7a 4f 72 69 67 54 61 62 2c 20 50 34 5f 54  , zOrigTab, P4_T
8650: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
8660: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8670: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8680: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
8690: 43 6f 6c 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e  Col, P4_TRANSIEN
86a0: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54  T);.#else.    zT
86b0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
86c0: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
86d0: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  0);.#endif.    s
86e0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
86f0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8700: 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79  ME_DECLTYPE, zTy
8710: 70 65 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54  pe, P4_TRANSIENT
8720: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
8730: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
8740: 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  LTYPE */.}../*.*
8750: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
8760: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
8770: 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65  he VDBE the name
8780: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
8790: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
87a0: 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  t.  This informa
87b0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
87c0: 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61  provide the.** a
87d0: 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e  zCol[] values in
87e0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a   the callback..*
87f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
8800: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
8810: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
8820: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
8830: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
8840: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
8850: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
8860: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
8870: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
8880: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
8890: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
88a0: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  t set */.){.  Vd
88b0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
88c0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20  pVdbe;.  int i, 
88d0: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
88e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
88f0: 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20   int fullNames, 
8900: 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66  shortNames;..#if
8910: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8920: 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
8930: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
8940: 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
8950: 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
8960: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
8970: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8980: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
8990: 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( v!=0 );.  if( 
89a0: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
89b0: 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 64  Set || v==0 || d
89c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
89d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
89e0: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
89f0: 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73  = 1;.  fullNames
8a00: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
8a10: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
8a20: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74  mes)!=0;.  short
8a30: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
8a40: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
8a50: 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  tColNames)!=0;. 
8a60: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
8a70: 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74  umCols(v, pEList
8a80: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28  ->nExpr);.  for(
8a90: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
8aa0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
8ab0: 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d  Expr *p;.    p =
8ac0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
8ad0: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  xpr;.    if( p==
8ae0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
8af0: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
8b00: 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
8b10: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
8b20: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8b30: 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  me;.      sqlite
8b40: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8b50: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8b60: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  ME, zName, strle
8b70: 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  n(zName));.     
8b80: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
8b90: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
8ba0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61  TK_COLUMN && pTa
8bb0: 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54  bList ){.      T
8bc0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
8bd0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
8be0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
8bf0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
8c00: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
8c10: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
8c20: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
8c30: 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b  rsor!=p->iTable;
8c40: 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73   j++){}.      as
8c50: 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74  sert( j<pTabList
8c60: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ->nSrc );.      
8c70: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
8c80: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
8c90: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
8ca0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
8cb0: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
8cc0: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
8cd0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
8ce0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
8cf0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
8d00: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
8d10: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  "rowid";.      }
8d20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
8d30: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
8d40: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
8d50: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
8d60: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66  shortNames && !f
8d70: 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73  ullNames && p->s
8d80: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
8d90: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  .z[0] ){.       
8da0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8db0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8dc0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72  NAME_NAME, (char
8dd0: 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e  *)p->span.z, p->
8de0: 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d  span.n);.      }
8df0: 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d  else if( fullNam
8e00: 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d  es || (!shortNam
8e10: 65 73 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  es && pTabList->
8e20: 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20  nSrc>1) ){.     
8e30: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
8e40: 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   0;.        char
8e50: 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20   *zTab;. .      
8e60: 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73    zTab = pTabLis
8e70: 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a  t->a[j].zAlias;.
8e80: 20 20 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c          if( full
8e90: 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30  Names || zTab==0
8ea0: 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e   ) zTab = pTab->
8eb0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73  zName;.        s
8ec0: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
8ed0: 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e  &zName, zTab, ".
8ee0: 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29  ", zCol, (char*)
8ef0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
8f00: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8f10: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8f20: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f  NAME, zName, P4_
8f30: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
8f40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8f50: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8f60: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8f70: 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73  ME_NAME, zCol, s
8f80: 74 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20  trlen(zCol));.  
8f90: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
8fa0: 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26  if( p->span.z &&
8fb0: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
8fc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8fd0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8fe0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
8ff0: 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e   (char*)p->span.
9000: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  z, p->span.n);. 
9010: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56       /* sqlite3V
9020: 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65  dbeCompressSpace
9030: 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20  (v, addr); */.  
9040: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
9050: 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20  har zName[30];. 
9060: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9070: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
9080: 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a   pTabList==0 );.
9090: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
90a0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4e  printf(sizeof(zN
90b0: 61 6d 65 29 2c 20 7a 4e 61 6d 65 2c 20 22 63 6f  ame), zName, "co
90c0: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20  lumn%d", i+1);. 
90d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
90e0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
90f0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
9100: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
9110: 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f    }.  generateCo
9120: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
9130: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
9140: 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  st);.}..#ifndef 
9150: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
9160: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
9170: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
9180: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
9190: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
91a0: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
91b0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
91c0: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
91d0: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
91e0: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
91f0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
9200: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
9210: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
9220: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9230: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
9240: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
9250: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9260: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
9270: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
9280: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
9290: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
92a0: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
92b0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
92c0: 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
92d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
92e0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
92f0: 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  /../*.** Forward
9300: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
9310: 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53  static int prepS
9320: 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 2a  electStmt(Parse*
9330: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a  , Select*);../*.
9340: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
9350: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
9360: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
9370: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
9380: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
9390: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
93a0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
93b0: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
93c0: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
93d0: 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
93e0: 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63  *zTabName, Selec
93f0: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
9400: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e  able *pTab;.  in
9410: 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69  t i, j;.  ExprLi
9420: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f  st *pEList;.  Co
9430: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
9440: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
9450: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
9460: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
9470: 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
9480: 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29  e, pSelect, 0) )
9490: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
94a0: 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 53    }..  while( pS
94b0: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20  elect->pPrior ) 
94c0: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
94d0: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28  t->pPrior;.  if(
94e0: 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
94f0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
9500: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
9510: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
9520: 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65  te3SelectResolve
9530: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
9540: 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
9550: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
9560: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
9570: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
9580: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
9590: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
95a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
95b0: 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
95c0: 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
95d0: 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69   zTabName ? sqli
95e0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
95f0: 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20  zTabName) : 0;. 
9600: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
9610: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61  t->pEList;.  pTa
9620: 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74  b->nCol = pEList
9630: 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ->nExpr;.  asser
9640: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20  t( pTab->nCol>0 
9650: 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20  );.  pTab->aCol 
9660: 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  = aCol = sqlite3
9670: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
9680: 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43   sizeof(pTab->aC
9690: 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f  ol[0])*pTab->nCo
96a0: 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  l);.  for(i=0, p
96b0: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62  Col=aCol; i<pTab
96c0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
96d0: 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  l++){.    Expr *
96e0: 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72  p, *pR;.    char
96f0: 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61   *zType;.    cha
9700: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
9710: 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c  t nName;.    Col
9720: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
9730: 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61   int cnt;.    Na
9740: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
9750: 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61     .    /* Get a
9760: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
9770: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
9780: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
9790: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
97a0: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
97b0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c   p->pRight==0 ||
97c0: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
97d0: 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  n.z==0 || p->pRi
97e0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21  ght->token.z[0]!
97f0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  =0 );.    if( (z
9800: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
9810: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
9820: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
9830: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
9840: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
9850: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
9860: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
9870: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
9880: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9890: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
98a0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d  }else if( p->op=
98b0: 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20 20 20 20  =TK_DOT .       
98c0: 20 20 20 20 20 20 20 26 26 20 28 70 52 3d 70 2d         && (pR=p-
98d0: 3e 70 52 69 67 68 74 29 21 3d 30 20 26 26 20 70  >pRight)!=0 && p
98e0: 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52  R->token.z && pR
98f0: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a  ->token.z[0] ){.
9900: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c        /* For col
9910: 75 6d 6e 73 20 6f 66 20 74 68 65 20 66 72 6f 6d  umns of the from
9920: 20 41 2e 42 20 75 73 65 20 42 20 61 73 20 74 68   A.B use B as th
9930: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
9940: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
9950: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 54 22 2c  Printf(db, "%T",
9960: 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20   &pR->token);.  
9970: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
9980: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
9990: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f  .z[0] ){.      /
99a0: 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e  * Use the origin
99b0: 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  al text of the c
99c0: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
99d0: 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a   as its name */.
99e0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
99f0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
9a00: 20 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29   "%T", &p->span)
9a10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9a20: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65 6c 73     /* If all els
9a30: 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20 75 70  e fails, make up
9a40: 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20   a name */.     
9a50: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
9a60: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c  MPrintf(db, "col
9a70: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20  umn%d", i+1);.  
9a80: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 4e 61    }.    if( !zNa
9a90: 6d 65 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  me || db->malloc
9aa0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
9ab0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9ac0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
9ad0: 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b  te3_free(zName);
9ae0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
9af0: 6c 65 74 65 54 61 62 6c 65 28 70 54 61 62 29 3b  leteTable(pTab);
9b00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
9b10: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9b20: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
9b30: 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  ;..    /* Make s
9b40: 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ure the column n
9b50: 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20  ame is unique.  
9b60: 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e  If the name is n
9b70: 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a  ot unique,.    *
9b80: 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67  * append a integ
9b90: 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73  er to the name s
9ba0: 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65  o that it become
9bb0: 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f  s unique..    */
9bc0: 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72  .    nName = str
9bd0: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  len(zName);.    
9be0: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
9bf0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
9c00: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
9c10: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
9c20: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
9c30: 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65       zName[nName
9c40: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  ] = 0;.        z
9c50: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
9c60: 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 3a 25 64  rintf(db, "%z:%d
9c70: 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29  ", zName, ++cnt)
9c80: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31  ;.        j = -1
9c90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  ;.        if( zN
9ca0: 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ame==0 ) break;.
9cb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9cc0: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
9cd0: 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47  zName;..    /* G
9ce0: 65 74 20 74 68 65 20 74 79 70 65 6e 61 6d 65 2c  et the typename,
9cf0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 2c 20   type affinity, 
9d00: 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
9d10: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 0a 20  quence for the. 
9d20: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20     ** column..  
9d30: 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
9d40: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
9d50: 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
9d60: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
9d70: 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 7a 54 79  t->pSrc;.    zTy
9d80: 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  pe = sqlite3DbSt
9d90: 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54  rDup(db, columnT
9da0: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20  ype(&sNC, p, 0, 
9db0: 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c  0, 0));.    pCol
9dc0: 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70 65 3b  ->zType = zType;
9dd0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
9de0: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
9df0: 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
9e00: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
9e10: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
9e20: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  rse, p);.    if(
9e30: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
9e40: 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71  pCol->zColl = sq
9e50: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
9e60: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
9e70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
9e80: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
9e90: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
9ea0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
9eb0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
9ec0: 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
9ed0: 20 62 79 20 64 6f 69 6e 67 20 74 68 65 20 66 6f   by doing the fo
9ee0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 69 6e 67  llowing.** thing
9ef0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s:.**.**    (1) 
9f00: 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
9f10: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
9f20: 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
9f30: 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
9f40: 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
9f50: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9f60: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
9f70: 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
9f80: 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
9f90: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
9fa0: 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
9fb0: 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
9fc0: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
9fd0: 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
9fe0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9ff0: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
a000: 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
a010: 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
a020: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
a030: 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
a040: 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
a050: 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
a060: 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
a070: 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
a080: 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
a090: 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
a0a0: 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
a0b0: 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
a0c0: 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
a0d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
a0e0: 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
a0f0: 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
a100: 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70  e presistent rep
a110: 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
a120: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
a130: 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
a140: 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
a150: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
a160: 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68  to accomodate th
a170: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
a180: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
a190: 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
a1a0: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
a1b0: 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
a1c0: 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74  *    (4)  Scan t
a1d0: 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
a1e0: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
a1f0: 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
a200: 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
a210: 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
a220: 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
a230: 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
a240: 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
a250: 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
a260: 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
a270: 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
a280: 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
a290: 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
a2a0: 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
a2b0: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
a2c0: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  TABLE..**.** Ret
a2d0: 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73  urn 0 on success
a2e0: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
a2f0: 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20  problems, leave 
a300: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
a310: 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e  .** in pParse an
a320: 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  d return non-zer
a330: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
a340: 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
a350: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
a360: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
a370: 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20   i, j, k, rc;.  
a380: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
a390: 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
a3a0: 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
a3b0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
a3c0: 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
a3d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a3e0: 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ..  if( p==0 || 
a3f0: 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 64 62  p->pSrc==0 || db
a400: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a410: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
a420: 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d    }.  pTabList =
a430: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
a440: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
a450: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
a460: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
a470: 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
a480: 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
a490: 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
a4a0: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
a4b0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
a4c0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
a4d0: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
a4e0: 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e  sors(pParse, p->
a4f0: 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  pSrc);..  /* Loo
a500: 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
a510: 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
a520: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
a530: 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
a540: 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
a550: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
a560: 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
a570: 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
a580: 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
a590: 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
a5a0: 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
a5b0: 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
a5c0: 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
a5d0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
a5e0: 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
a5f0: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
a600: 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
a610: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
a620: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  ab;.    if( pFro
a630: 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20  m->pTab!=0 ){.  
a640: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74      /* This stat
a650: 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64  ement has alread
a660: 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e  y been prepared.
a670: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
a680: 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67  ed.      ** to g
a690: 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  o further. */.  
a6a0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30      assert( i==0
a6b0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
a6c0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
a6d0: 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
a6e0: 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
a6f0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
a700: 59 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  Y.      /* A sub
a710: 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
a720: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
a730: 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
a740: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
a750: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  elect!=0 );.    
a760: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c    if( pFrom->zAl
a770: 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ias==0 ){.      
a780: 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20    pFrom->zAlias 
a790: 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  =.          sqli
a7a0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
a7b0: 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f  sqlite_subquery_
a7c0: 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 46 72  %p_", (void*)pFr
a7d0: 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
a7e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a7f0: 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
a800: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
a810: 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
a820: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
a830: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
a840: 63 74 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  ct(pParse, pFrom
a850: 2d 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d  ->zAlias, pFrom-
a860: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
a870: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
a880: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
a890: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a8a0: 2f 2a 20 54 68 65 20 69 73 45 70 68 65 6d 20 66  /* The isEphem f
a8b0: 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  lag indicates th
a8c0: 61 74 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  at the Table str
a8d0: 75 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 0a  ucture has been.
a8e0: 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63        ** dynamic
a8f0: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61  ally allocated a
a900: 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65 64 20  nd may be freed 
a910: 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e  at any time.  In
a920: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20   other words,.  
a930: 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20 6e      ** pTab is n
a940: 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ot pointing to a
a950: 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c   persistent tabl
a960: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
a970: 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20 2a   defines.      *
a980: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 63  * part of the sc
a990: 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70  hema. */.      p
a9a0: 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 3d 20 31  Tab->isEphem = 1
a9b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
a9c0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
a9d0: 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
a9e0: 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
a9f0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
aa00: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
aa10: 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
aa20: 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
aa30: 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
aa40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
aa50: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
aa60: 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70  0,pFrom->zName,p
aa70: 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  From->zDatabase)
aa80: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
aa90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
aaa0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
aab0: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
aac0: 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  f++;.#if !define
aad0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
aae0: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
aaf0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
ab00: 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
ab10: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
ab20: 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28  ct || IsVirtual(
ab30: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
ab40: 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72   /* We reach her
ab50: 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74  e if the named t
ab60: 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79  able is a really
ab70: 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   a view */.     
ab80: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69     if( sqlite3Vi
ab90: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
aba0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
abb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
abc0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
abd0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46          /* If pF
abe0: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  rom->pSelect!=0 
abf0: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
ac00: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20  dealing with a. 
ac10: 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77         ** view w
ac20: 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54  ithin a view.  T
ac30: 68 65 20 53 45 4c 45 43 54 20 73 74 72 75 63 74  he SELECT struct
ac40: 75 72 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ure has already 
ac50: 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  been.        ** 
ac60: 63 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f 75  copied by the ou
ac70: 74 65 72 20 76 69 65 77 20 73 6f 20 77 65 20 63  ter view so we c
ac80: 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79  an skip the copy
ac90: 20 73 74 65 70 20 68 65 72 65 0a 20 20 20 20 20   step here.     
aca0: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e     ** in the inn
acb0: 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20  er view..       
acc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
acd0: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pFrom->pSelect==
ace0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
acf0: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
ad00: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
ad10: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65  (db, pTab->pSele
ad20: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ct);.        }. 
ad30: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
ad40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
ad50: 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65  ocess NATURAL ke
ad60: 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61  ywords, and ON a
ad70: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
ad80: 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a   of joins..  */.
ad90: 20 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f 63    if( sqliteProc
ada0: 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20  essJoin(pParse, 
adb0: 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a  p) ) return 1;..
adc0: 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
add0: 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
ade0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
adf0: 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
ae00: 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
ae10: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
ae20: 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20  ables.  And for 
ae30: 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e  every TABLE.* in
ae40: 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20  sert the names. 
ae50: 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d   ** of all colum
ae60: 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68  ns in TABLE.  Th
ae70: 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65  e parser inserte
ae80: 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  d a special expr
ae90: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68  ession.  ** with
aea0: 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72   the TK_ALL oper
aeb0: 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a  ator for each "*
aec0: 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20  " that it found 
aed0: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
aee0: 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c  st..  ** The fol
aef0: 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
af00: 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
af10: 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73  he TK_ALL expres
af20: 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64  sions and expand
af30: 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74  .  ** each one t
af40: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
af50: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
af60: 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
af70: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f  ** The first loo
af80: 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f  p just checks to
af90: 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
afa0: 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74  e any "*" operat
afb0: 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65  ors.  ** that ne
afc0: 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20  ed expanding..  
afd0: 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
afe0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
aff0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
b000: 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d  E = pEList->a[k]
b010: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
b020: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  pE->op==TK_ALL )
b030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
b040: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
b050: 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20  & pE->pRight && 
b060: 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
b070: 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20  TK_ALL.         
b080: 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20  && pE->pLeft && 
b090: 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pE->pLeft->op==T
b0a0: 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20  K_ID ) break;.  
b0b0: 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69 66  }.  rc = 0;.  if
b0c0: 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ( k<pEList->nExp
b0d0: 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  r ){.    /*.    
b0e0: 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72  ** If we get her
b0f0: 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72  e it means the r
b100: 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69  esult set contai
b110: 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22  ns one or more "
b120: 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  *".    ** operat
b130: 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
b140: 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c   be expanded.  L
b150: 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
b160: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
b170: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
b180: 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20   set and expand 
b190: 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  them one by one.
b1a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75  .    */.    stru
b1b0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
b1c0: 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b   *a = pEList->a;
b1d0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
b1e0: 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  New = 0;.    int
b1f0: 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d   flags = pParse-
b200: 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  >db->flags;.    
b210: 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20  int longNames = 
b220: 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
b230: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
b240: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
b250: 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 73            (flags
b260: 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
b270: 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20  olNames)==0;..  
b280: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
b290: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
b2a0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
b2b0: 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
b2c0: 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
b2d0: 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20  =TK_ALL &&.     
b2e0: 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54        (pE->op!=T
b2f0: 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69  K_DOT || pE->pRi
b300: 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52  ght==0 || pE->pR
b310: 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ight->op!=TK_ALL
b320: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
b330: 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
b340: 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
b350: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  not need to be e
b360: 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20  xpanded..       
b370: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
b380: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
b390: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
b3a0: 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70   pNew, a[k].pExp
b3b0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
b3c0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
b3d0: 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
b3e0: 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  w->nExpr-1].zNam
b3f0: 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a  e = a[k].zName;.
b400: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b410: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
b420: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b430: 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
b440: 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  0;.        a[k].
b450: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
b460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b470: 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
b480: 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
b490: 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
b4a0: 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
b4b0: 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
b4c0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
b4d0: 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
b4e0: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
b4f0: 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
b500: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
b510: 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20  r *zTName;      
b520: 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
b530: 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
b540: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
b550: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
b560: 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pE->pLeft ){.   
b570: 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
b580: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
b590: 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e 70 4c  oken(db, &pE->pL
b5a0: 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  eft->token);.   
b5b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b5c0: 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30        zTName = 0
b5d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b5e0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
b5f0: 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
b600: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
b610: 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
b620: 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
b630: 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
b640: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
b650: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
b660: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pFrom->zAlias;.
b670: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
b680: 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61  abName==0 || zTa
b690: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a  bName[0]==0 ){ .
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
b6b0: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
b6c0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
b6d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
b6e0: 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61 6d  Name && (zTabNam
b6f0: 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65  e==0 || zTabName
b700: 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20  [0]==0 || .     
b710: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
b720: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d  te3StrICmp(zTNam
b730: 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29  e, zTabName)!=0)
b740: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b750: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
b760: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b770: 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20  tableSeen = 1;. 
b780: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
b790: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
b7a0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
b7b0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a    Expr *pExpr, *
b7c0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
b7d0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
b7e0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
b7f0: 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20  zName;..        
b800: 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75      /* If a colu
b810: 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  mn is marked as 
b820: 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e  'hidden' (curren
b830: 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c  tly only possibl
b840: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
b850: 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62   for virtual tab
b860: 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63  les), do not inc
b870: 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20 65  lude it in the e
b880: 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20  xpanded.        
b890: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65      ** result-se
b8a0: 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20  t list..        
b8b0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
b8c0: 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43     if( IsHiddenC
b8d0: 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
b8e0: 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  l[j]) ){.       
b8f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49 73         assert(Is
b900: 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a  Virtual(pTab));.
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
b920: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
b930: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
b940: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
b950: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
b960: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
b970: 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69  *pLeft = &pTabLi
b980: 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20  st->a[i-1];.    
b990: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
b9a0: 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65  Left[1].jointype
b9b0: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
b9c0: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
b9e0: 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e  umnIndex(pLeft->
b9f0: 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  pTab, zName)>=0 
ba00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
ba10: 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
ba20: 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
ba30: 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
ba40: 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
ba50: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
ba60: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  e on the right *
ba70: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
ba80: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
ba90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
baa0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
bab0: 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
bac0: 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e 67  (pLeft[1].pUsing
bad0: 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
baf0: 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
bb00: 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
bb10: 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
bb20: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
bb30: 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
bb40: 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
bb50: 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
bb60: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
bb70: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
bb90: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
bba0: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
bbb0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
bbc0: 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c  Parse, TK_ID, 0,
bbd0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
bbe0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d 3d      if( pRight==
bbf0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
bc00: 20 20 20 20 20 20 20 73 65 74 51 75 6f 74 65 64         setQuoted
bc10: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70  Token(pParse, &p
bc20: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e  Right->token, zN
bc30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
bc40: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26    if( zTabName &
bc50: 26 20 28 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20  & (longNames || 
bc60: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
bc70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
bc80: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
bc90: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
bca0: 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20  arse, TK_ID, 0, 
bcb0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
bcc0: 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
bcd0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bce0: 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
bcf0: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
bd00: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
bd10: 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Expr==0 ) break;
bd20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
bd30: 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50  etQuotedToken(pP
bd40: 61 72 73 65 2c 20 26 70 4c 65 66 74 2d 3e 74 6f  arse, &pLeft->to
bd50: 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a  ken, zTabName);.
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
bd70: 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73  tToken(&pExpr->s
bd80: 70 61 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  pan, .          
bd90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
bda0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
bdb0: 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
bdc0: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
bdd0: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
bde0: 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  .dyn = 1;.      
bdf0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
be00: 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  oken.z = 0;.    
be10: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
be20: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20  >token.n = 0;.  
be30: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
be40: 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30  r->token.dyn = 0
be50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
be60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
be70: 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
be80: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
be90: 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70   pExpr->span = p
bea0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Expr->token;.   
beb0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
bec0: 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 30 3b 0a  ->span.dyn = 0;.
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
bee0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
bef0: 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  ngNames ){.     
bf00: 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
bf10: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
bf20: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
bf30: 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45 78 70  ew, pExpr, &pExp
bf40: 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  r->span);.      
bf50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bf60: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
bf70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
bf80: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
bf90: 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 52  pNew, pExpr, &pR
bfa0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  ight->token);.  
bfb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
bfc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bfd0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
bfe0: 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
bff0: 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
c000: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
c010: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
c020: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
c030: 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e   table: %s", zTN
c040: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
c050: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c060: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c070: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
c080: 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
c090: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
c0a0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
c0b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c0c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c0d0: 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  zTName);.      }
c0e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
c0f0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
c100: 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  (pEList);.    p-
c110: 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
c120: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
c130: 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
c140: 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e  p->pEList && p->
c150: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
c160: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
c170: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
c180: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
c190: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
c1a0: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
c1b0: 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a  n result set");.
c1c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c1d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69  ERROR;.  }.#endi
c1e0: 66 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  f.  if( db->mall
c1f0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
c200: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
c210: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
c220: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 20  rc;.}../*.** pE 
c230: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c240: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 68  an expression wh
c250: 69 63 68 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ich is a single 
c260: 74 65 72 6d 20 69 6e 0a 2a 2a 20 4f 52 44 45 52  term in.** ORDER
c270: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
c280: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 74  clause..**.** At
c290: 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73 20   the point this 
c2a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
c2b0: 64 2c 20 77 65 20 61 6c 72 65 61 64 79 20 6b 6e  d, we already kn
c2c0: 6f 77 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 4f  ow that the.** O
c2d0: 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 73 20  RDER BY term is 
c2e0: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 69  not an integer i
c2f0: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 72 65  ndex into the re
c300: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 61 74 0a  sult set.  That.
c310: 2a 2a 20 63 61 73 65 65 20 69 73 20 68 61 6e 64  ** casee is hand
c320: 6c 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  led by the calli
c330: 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  ng routine..**.*
c340: 2a 20 49 66 20 70 45 20 69 73 20 61 20 77 65 6c  * If pE is a wel
c350: 6c 2d 66 6f 72 6d 65 64 20 65 78 70 72 65 73 73  l-formed express
c360: 69 6f 6e 20 61 6e 64 20 74 68 65 20 53 45 4c 45  ion and the SELE
c370: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
c380: 69 73 20 6e 6f 74 20 63 6f 6d 70 6f 75 6e 64 2c  is not compound,
c390: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 2e 20   then return 0. 
c3a0: 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
c3b0: 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72  to the.** caller
c3c0: 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20   that it should 
c3d0: 73 6f 72 74 20 62 79 20 74 68 65 20 76 61 6c 75  sort by the valu
c3e0: 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  e of the ORDER B
c3f0: 59 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  Y.** expression.
c400: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45  .**.** If the SE
c410: 4c 45 43 54 20 69 73 20 63 6f 6d 70 6f 75 6e 64  LECT is compound
c420: 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74  , then attempt t
c430: 6f 20 6d 61 74 63 68 20 70 45 20 61 67 61 69 6e  o match pE again
c440: 73 74 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65 74  st.** result set
c450: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
c460: 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  left-most SELECT
c470: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74   statement.  Ret
c480: 75 72 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  urn.** the index
c490: 20 69 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69   i of the matchi
c4a0: 6e 67 20 63 6f 6c 75 6d 6e 2c 20 61 73 20 61 6e  ng column, as an
c4b0: 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 74   indication to t
c4c0: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 68  he .** caller th
c4d0: 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f 72  at it should sor
c4e0: 74 20 62 79 20 74 68 65 20 69 2d 74 68 20 63 6f  t by the i-th co
c4f0: 6c 75 6d 6e 2e 20 20 49 66 20 74 68 65 72 65 20  lumn.  If there 
c500: 69 73 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c 20  is.** no match, 
c510: 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 6c 65  return -1 and le
c520: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
c530: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
c540: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61  */.static int ma
c550: 74 63 68 4f 72 64 65 72 42 79 54 65 72 6d 54 6f  tchOrderByTermTo
c560: 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
c570: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
c580: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c590: 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  t for error mess
c5a0: 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ages */.  Select
c5b0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20   *pSelect,   /* 
c5c0: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
c5d0: 6d 65 6e 74 20 77 69 74 68 20 74 68 65 20 4f 52  ment with the OR
c5e0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
c5f0: 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 20 20 20  .  Expr *pE,    
c600: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65        /* The spe
c610: 63 69 66 69 63 20 4f 52 44 45 52 20 42 59 20 74  cific ORDER BY t
c620: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  erm */.  int idx
c630: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ,           /* W
c640: 68 65 6e 20 4f 52 44 45 52 20 42 59 20 74 65 72  hen ORDER BY ter
c650: 6d 20 69 73 20 74 68 69 73 20 2a 2f 0a 20 20 69  m is this */.  i
c660: 6e 74 20 69 73 43 6f 6d 70 6f 75 6e 64 2c 20 20  nt isCompound,  
c670: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
c680: 73 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  s is a compound 
c690: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 75 38 20 2a  SELECT */.  u8 *
c6a0: 70 48 61 73 41 67 67 20 20 20 20 20 20 20 20 2f  pHasAgg        /
c6b0: 2a 20 54 72 75 65 20 69 66 20 65 78 70 72 65 73  * True if expres
c6c0: 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67  sion contains ag
c6d0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
c6e0: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c700: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
c710: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
c720: 73 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75  st;  /* The colu
c730: 6d 6e 73 20 6f 66 20 74 68 65 20 72 65 73 75 6c  mns of the resul
c740: 74 20 73 65 74 20 2a 2f 0a 20 20 4e 61 6d 65 43  t set */.  NameC
c750: 6f 6e 74 65 78 74 20 6e 63 3b 20 20 20 20 2f 2a  ontext nc;    /*
c760: 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
c770: 72 20 72 65 73 6f 6c 76 69 6e 67 20 70 45 20 2a  r resolving pE *
c780: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
c790: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
c7a0: 72 28 70 45 2c 20 26 69 29 3d 3d 30 20 29 3b 0a  r(pE, &i)==0 );.
c7b0: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
c7c0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f  ct->pEList;..  /
c7d0: 2a 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73  * If the term is
c7e0: 20 61 20 73 69 6d 70 6c 65 20 69 64 65 6e 74 69   a simple identi
c7f0: 66 69 65 72 20 74 68 61 74 20 74 72 79 20 74 6f  fier that try to
c800: 20 6d 61 74 63 68 20 74 68 61 74 20 69 64 65 6e   match that iden
c810: 74 69 66 69 65 72 0a 20 20 2a 2a 20 61 67 61 69  tifier.  ** agai
c820: 6e 73 74 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d  nst a column nam
c830: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
c840: 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
c850: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c  pE->op==TK_ID ||
c860: 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52   (pE->op==TK_STR
c870: 49 4e 47 20 26 26 20 70 45 2d 3e 74 6f 6b 65 6e  ING && pE->token
c880: 2e 7a 5b 30 5d 21 3d 27 5c 27 27 29 20 29 7b 0a  .z[0]!='\'') ){.
c890: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
c8a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
c8b0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 73    char *zCol = s
c8c0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
c8d0: 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e 74 6f 6b  ken(db, &pE->tok
c8e0: 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 43 6f  en);.    if( zCo
c8f0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  l==0 ){.      re
c900: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
c910: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
c920: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
c930: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
c940: 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  As = pEList->a[i
c950: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  ].zName;.      i
c960: 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c  f( zAs!=0 && sql
c970: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c  ite3StrICmp(zAs,
c980: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
c990: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
c9a0: 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  e(zCol);.       
c9b0: 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20   return i+1;.   
c9c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
c9d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c  qlite3_free(zCol
c9e0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  );.  }..  /* Res
c9f0: 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69  olve all names i
ca00: 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  n the ORDER BY t
ca10: 65 72 6d 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  erm expression. 
ca20: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6e 63   */.  memset(&nc
ca30: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6e 63 29 29  , 0, sizeof(nc))
ca40: 3b 0a 20 20 6e 63 2e 70 50 61 72 73 65 20 3d 20  ;.  nc.pParse = 
ca50: 70 50 61 72 73 65 3b 0a 20 20 6e 63 2e 70 53 72  pParse;.  nc.pSr
ca60: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
ca70: 3e 70 53 72 63 3b 0a 20 20 6e 63 2e 70 45 4c 69  >pSrc;.  nc.pELi
ca80: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 6e  st = pEList;.  n
ca90: 63 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a  c.allowAgg = 1;.
caa0: 20 20 6e 63 2e 6e 45 72 72 20 3d 20 30 3b 0a 20    nc.nErr = 0;. 
cab0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
cac0: 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 6e 63  ResolveNames(&nc
cad0: 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 69 66 28  , pE) ){.    if(
cae0: 20 69 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20   isCompound ){. 
caf0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
cb00: 72 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  rClear(pParse);.
cb10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
cb20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cb30: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
cb40: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 63 2e 68  }.  }.  if( nc.h
cb50: 61 73 41 67 67 20 26 26 20 70 48 61 73 41 67 67  asAgg && pHasAgg
cb60: 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 41 67 67   ){.    *pHasAgg
cb70: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
cb80: 46 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  For a compound S
cb90: 45 4c 45 43 54 2c 20 77 65 20 6e 65 65 64 20 74  ELECT, we need t
cba0: 6f 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74  o try to match t
cbb0: 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a  he ORDER BY.  **
cbc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69   expression agai
cbd0: 6e 73 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f  nst an expressio
cbe0: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
cbf0: 73 65 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  set.  */.  if( i
cc00: 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20  sCompound ){.   
cc10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
cc20: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
cc30: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
cc40: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
cc50: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
cc60: 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20  , pE) ){.       
cc70: 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20   return i+1;.   
cc80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
cc90: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
cca0: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64  *.** Analyze and
ccb0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
ccc0: 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  UP BY clause in 
ccd0: 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54 20  a simple SELECT 
cce0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 52 65  statement..** Re
ccf0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
cd00: 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a  of errors seen..
cd10: 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 74 65 72 6d  **.** Every term
cd20: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
cd30: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
cd40: 75 73 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  use needs to be 
cd50: 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
cd60: 2e 20 20 49 66 20 61 6e 79 20 65 78 70 72 65 73  .  If any expres
cd70: 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67  sion is an integ
cd80: 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  er constant, the
cd90: 6e 0a 2a 2a 20 74 68 61 74 20 65 78 70 72 65 73  n.** that expres
cda0: 73 69 6f 6e 20 69 73 20 72 65 70 6c 61 63 65 64  sion is replaced
cdb0: 20 62 79 20 74 68 65 20 63 6f 72 72 65 73 70 6f   by the correspo
cdc0: 6e 64 69 6e 67 20 0a 2a 2a 20 65 78 70 72 65 73  nding .** expres
cdd0: 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72 65  sion from the re
cde0: 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
cdf0: 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 4f  tic int processO
ce00: 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 50  rderGroupBy(.  P
ce10: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
ce20: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
ce30: 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20  context.  Leave 
ce40: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68  error messages h
ce50: 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ere */.  Select 
ce60: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f  *pSelect,      /
ce70: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
ce80: 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e  tement containin
ce90: 67 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a  g the clause */.
cea0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
ceb0: 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f  erBy,   /* The O
cec0: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
ced0: 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65   BY clause to be
cee0: 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
cef0: 69 6e 74 20 69 73 4f 72 64 65 72 2c 20 20 20 20  int isOrder,    
cf00: 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 4f        /* 1 for O
cf10: 52 44 45 52 20 42 59 2e 20 20 30 20 66 6f 72 20  RDER BY.  0 for 
cf20: 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 75 38  GROUP BY */.  u8
cf30: 20 2a 70 48 61 73 41 67 67 20 20 20 20 20 20 20   *pHasAgg       
cf40: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 54 52      /* Set to TR
cf50: 55 45 20 69 66 20 61 6e 79 20 74 65 72 6d 20 63  UE if any term c
cf60: 6f 6e 74 61 69 6e 73 20 61 6e 20 61 67 67 72 65  ontains an aggre
cf70: 67 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  gate */.){.  int
cf80: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
cf90: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
cfa0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
cfb0: 73 74 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65  st;..  if( pOrde
cfc0: 72 42 79 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  rBy==0 || pParse
cfd0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
cfe0: 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  ed ) return 0;.#
cff0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
d000: 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64 65  LUMN.  if( pOrde
d010: 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  rBy->nExpr>db->a
d020: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
d030: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
d040: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
d050: 79 70 65 20 3d 20 69 73 4f 72 64 65 72 20 3f 20  ype = isOrder ? 
d060: 22 4f 52 44 45 52 22 20 3a 20 22 47 52 4f 55 50  "ORDER" : "GROUP
d070: 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ";.    sqlite3Er
d080: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d090: 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
d0a0: 6e 20 25 73 20 42 59 20 63 6c 61 75 73 65 22 2c  n %s BY clause",
d0b0: 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 72 65 74   zType);.    ret
d0c0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 1;.  }.#endi
d0d0: 66 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  f.  pEList = pSe
d0e0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
d0f0: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
d100: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
d110: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
d120: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
d130: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69   i++){.    int i
d140: 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  Col;.    Expr *p
d150: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
d160: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
d170: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
d180: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
d190: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
d1a0: 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70  Col<=0 || iCol>p
d1b0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
d1c0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
d1d0: 61 72 20 2a 7a 54 79 70 65 20 3d 20 69 73 4f 72  ar *zType = isOr
d1e0: 64 65 72 20 3f 20 22 4f 52 44 45 52 22 20 3a 20  der ? "ORDER" : 
d1f0: 22 47 52 4f 55 50 22 3b 0a 20 20 20 20 20 20 20  "GROUP";.       
d200: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d210: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
d220: 20 20 20 20 20 22 25 72 20 25 73 20 42 59 20 74       "%r %s BY t
d230: 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  erm out of range
d240: 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20   - should be ". 
d250: 20 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65            "betwe
d260: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2b  en 1 and %d", i+
d270: 31 2c 20 7a 54 79 70 65 2c 20 70 45 4c 69 73 74  1, zType, pEList
d280: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
d290: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
d2a0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
d2b0: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6d 61 74 63       iCol = matc
d2c0: 68 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78  hOrderByTermToEx
d2d0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
d2e0: 53 65 6c 65 63 74 2c 20 70 45 2c 20 69 2b 31 2c  Select, pE, i+1,
d2f0: 20 30 2c 20 70 48 61 73 41 67 67 29 3b 0a 20 20   0, pHasAgg);.  
d300: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
d310: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
d320: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
d330: 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30  }.    if( iCol>0
d340: 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
d350: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 45 2d 3e 70  q *pColl = pE->p
d360: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  Coll;.      int 
d370: 66 6c 61 67 73 20 3d 20 70 45 2d 3e 66 6c 61 67  flags = pE->flag
d380: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
d390: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
d3a0: 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a  ExprDelete(pE);.
d3b0: 20 20 20 20 20 20 70 45 20 3d 20 73 71 6c 69 74        pE = sqlit
d3c0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
d3d0: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e  List->a[iCol-1].
d3e0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 4f  pExpr);.      pO
d3f0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
d400: 70 72 20 3d 20 70 45 3b 0a 20 20 20 20 20 20 69  pr = pE;.      i
d410: 66 28 20 70 45 20 26 26 20 70 43 6f 6c 6c 20 26  f( pE && pColl &
d420: 26 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  & flags ){.     
d430: 20 20 20 70 45 2d 3e 70 43 6f 6c 6c 20 3d 20 70     pE->pColl = p
d440: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 45  Coll;.        pE
d450: 2d 3e 66 6c 61 67 73 20 7c 3d 20 66 6c 61 67 73  ->flags |= flags
d460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d470: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
d480: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
d490: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72   and ORDER BY or
d4a0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
d4b0: 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61   in a SELECT sta
d4c0: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  tement.  Return.
d4d0: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
d4e0: 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a   errors seen..**
d4f0: 0a 2a 2a 20 49 66 20 69 54 61 62 6c 65 3e 30 20  .** If iTable>0 
d500: 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 4e 2d  then make the N-
d510: 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  th term of the O
d520: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 72  RDER BY clause r
d530: 65 66 65 72 20 74 6f 0a 2a 2a 20 74 68 65 20 4e  efer to.** the N
d540: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  -th column of ta
d550: 62 6c 65 20 69 54 61 62 6c 65 2e 0a 2a 2a 0a 2a  ble iTable..**.*
d560: 2a 20 49 66 20 69 54 61 62 6c 65 3d 3d 30 20 74  * If iTable==0 t
d570: 68 65 6e 20 74 72 61 6e 73 66 6f 72 6d 20 65 61  hen transform ea
d580: 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ch term of the O
d590: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
d5a0: 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 61 20  o refer.** to a 
d5b0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 65  column of the re
d5c0: 73 75 6c 74 20 73 65 74 20 62 79 20 6e 75 6d 62  sult set by numb
d5d0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
d5e0: 74 20 70 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e  t processCompoun
d5f0: 64 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  dOrderBy(.  Pars
d600: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d610: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d620: 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72  text.  Leave err
d630: 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65  or messages here
d640: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
d650: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54  elect,      /* T
d660: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
d670: 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ent containing t
d680: 68 65 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  he ORDER BY */. 
d690: 20 69 6e 74 20 69 54 61 62 6c 65 20 20 20 20 20   int iTable     
d6a0: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
d6b0: 20 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 6f   table for compo
d6c0: 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
d6d0: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
d6e0: 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  t i;.  ExprList 
d6f0: 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 45 78 70  *pOrderBy;.  Exp
d700: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
d710: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
d720: 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31  int moreToDo = 1
d730: 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  ;..  pOrderBy = 
d740: 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
d750: 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  y;.  if( pOrderB
d760: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
d770: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
d780: 64 62 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  db;.#if SQLITE_M
d790: 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
d7a0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e  pOrderBy->nExpr>
d7b0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
d7c0: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
d7d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d7e0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d7f0: 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
d800: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
d810: 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e");.    return 
d820: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  1;.  }.#endif.  
d830: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
d840: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
d850: 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  {.    pOrderBy->
d860: 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20  a[i].done = 0;. 
d870: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c   }.  while( pSel
d880: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
d890: 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65     pSelect = pSe
d8a0: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
d8b0: 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  }.  while( pSele
d8c0: 63 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20 29  ct && moreToDo )
d8d0: 7b 0a 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d  {.    moreToDo =
d8e0: 20 30 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   0;.    pEList =
d8f0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
d900: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
d910: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
d920: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
d930: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
d940: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
d950: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
d960: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 45 78  l = -1;.      Ex
d970: 70 72 20 2a 70 45 2c 20 2a 70 44 75 70 3b 0a 20  pr *pE, *pDup;. 
d980: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
d990: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63  y->a[i].done ) c
d9a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
d9b0: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
d9c0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
d9d0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
d9e0: 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
d9f0: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ol) ){.        i
da00: 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f  f( iCol<0 || iCo
da10: 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
da20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
da30: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
da40: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
da50: 20 20 20 22 25 72 20 4f 52 44 45 52 20 42 59 20     "%r ORDER BY 
da60: 74 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67  term out of rang
da70: 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a  e - should be ".
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 62 65               "be
da90: 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c  tween 1 and %d",
daa0: 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45   i+1, pEList->nE
dab0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
dac0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
dad0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
dae0: 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20  .        pDup = 
daf0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
db00: 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20 20 20  b, pE);.        
db10: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
db20: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
db30: 20 20 20 61 73 73 65 72 74 28 70 44 75 70 29 3b     assert(pDup);
db40: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20  .          iCol 
db50: 3d 20 6d 61 74 63 68 4f 72 64 65 72 42 79 54 65  = matchOrderByTe
db60: 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61  rmToExprList(pPa
db70: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 44  rse, pSelect, pD
db80: 75 70 2c 20 69 2b 31 2c 20 31 2c 20 30 29 3b 0a  up, i+1, 1, 0);.
db90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dba0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
dbb0: 65 74 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20  ete(pDup);.     
dbc0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
dbd0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
dbe0: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
dbf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
dc00: 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20   iCol>0 ){.     
dc10: 20 20 20 69 66 28 20 69 54 61 62 6c 65 20 29 7b     if( iTable ){
dc20: 0a 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 6f  .          pE->o
dc30: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
dc40: 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 54 61           pE->iTa
dc50: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
dc60: 20 20 20 20 20 20 20 20 70 45 2d 3e 69 41 67 67          pE->iAgg
dc70: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
dc80: 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69   pE->iColumn = i
dc90: 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  Col-1;.         
dca0: 20 70 45 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20   pE->pTab = 0;. 
dcb0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
dcc0: 20 20 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d          pE->op =
dcd0: 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20   TK_INTEGER;.   
dce0: 20 20 20 20 20 20 20 70 45 2d 3e 66 6c 61 67 73         pE->flags
dcf0: 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
dd00: 0a 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69  .          pE->i
dd10: 54 61 62 6c 65 20 3d 20 69 43 6f 6c 3b 0a 20 20  Table = iCol;.  
dd20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dd30: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
dd40: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  one = 1;.      }
dd50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 6f  else{.        mo
dd60: 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 20 20 20 20  reToDo = 1;.    
dd70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53    }.    }.    pS
dd80: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
dd90: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 66 6f  >pNext;.  }.  fo
dda0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
ddb0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
ddc0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
ddd0: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20 29  ->a[i].done==0 )
dde0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
ddf0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
de00: 22 25 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  "%r ORDER BY ter
de10: 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  m does not match
de20: 20 61 6e 79 20 22 0a 20 20 20 20 20 20 20 20 20   any ".         
de30: 20 20 20 22 63 6f 6c 75 6d 6e 20 69 6e 20 74 68     "column in th
de40: 65 20 72 65 73 75 6c 74 20 73 65 74 22 2c 20 69  e result set", i
de50: 2b 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  +1);.      retur
de60: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
de70: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
de80: 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
de90: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
dea0: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
deb0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
dec0: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
ded0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
dee0: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
def0: 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
df00: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
df10: 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
df20: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
df30: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
df40: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
df50: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
df60: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
df70: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56  pVdbe = sqlite3V
df80: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
df90: 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66 20 53  ->db);.#ifndef S
dfa0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
dfb0: 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20  .    if( v ){.  
dfc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dfd0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63  ddOp0(v, OP_Trac
dfe0: 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
dff0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
e000: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
e010: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
e020: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
e030: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
e040: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
e050: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
e060: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
e070: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
e080: 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  et hold the expr
e090: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
e0a0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
e0b0: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
e0c0: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
e0d0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
e0e0: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
e0f0: 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
e100: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
e110: 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
e120: 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
e130: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
e140: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
e150: 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
e160: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
e170: 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
e180: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
e190: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
e1a0: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
e1b0: 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
e1c0: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
e1d0: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
e1e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
e1f0: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
e200: 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
e210: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
e220: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
e230: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
e240: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
e250: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
e260: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
e270: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
e280: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
e290: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
e2a0: 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75  s.** (usually bu
e2b0: 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29  t not always -1)
e2c0: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
e2d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
e2e0: 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
e2f0: 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21  t!=0 or pOffset!
e300: 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
e310: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
e320: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
e330: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
e340: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
e350: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
e360: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
e370: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
e380: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
e390: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
e3a0: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
e3b0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
e3c0: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
e3d0: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
e3e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
e3f0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
e400: 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
e410: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
e420: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
e430: 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72  fset;.  int addr
e440: 31 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  1;.  if( p->iLim
e450: 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  it ) return;..  
e460: 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  /* .  ** "LIMIT 
e470: 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
e480: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
e490: 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
e4a0: 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74  ontraversy about
e4b0: 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
e4c0: 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
e4d0: 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
e4e0: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
e4f0: 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
e500: 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
e510: 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
e520: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
e530: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
e540: 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20  iLimit = iLimit 
e550: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
e560: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
e570: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
e580: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
e590: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
e5a0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e5b0: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  rse, p->pLimit, 
e5c0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c  iLimit);.    sql
e5d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
e5e0: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
e5f0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 56 64 62  iLimit);.    Vdb
e600: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
e610: 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
e620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e630: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp2(v, OP_IfZe
e640: 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65  ro, iLimit, iBre
e650: 61 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ak);.  }.  if( p
e660: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
e670: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f   p->iOffset = iO
e680: 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  ffset = ++pParse
e690: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20  ->nMem;.    if( 
e6a0: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
e6b0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b     pParse->nMem+
e6c0: 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  +;   /* Allocate
e6d0: 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73 74   an extra regist
e6e0: 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66  er for limit+off
e6f0: 73 65 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  set */.    }.   
e700: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
e710: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
e720: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
e730: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  rn;.    sqlite3E
e740: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
e750: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66  p->pOffset, iOff
e760: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
e770: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
e780: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66  P_MustBeInt, iOf
e790: 66 73 65 74 29 3b 0a 20 20 20 20 56 64 62 65 43  fset);.    VdbeC
e7a0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
e7b0: 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
e7c0: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
e7d0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e7e0: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
e7f0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
e800: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e810: 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66 66  Integer, 0, iOff
e820: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
e830: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
e840: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 69 66 28   addr1);.    if(
e850: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
e860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e870: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c  ddOp3(v, OP_Add,
e880: 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74   iLimit, iOffset
e890: 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20  , iOffset+1);.  
e8a0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e8b0: 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45  (v, "LIMIT+OFFSE
e8c0: 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72  T"));.      addr
e8d0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
e8e0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
e8f0: 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  s, iLimit);.    
e900: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e910: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
e920: 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31  r, -1, iOffset+1
e930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e940: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
e950: 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20  addr1);.    }.  
e960: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
e970: 61 74 65 20 61 20 76 69 72 74 75 61 6c 20 69 6e  ate a virtual in
e980: 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 73  dex to use for s
e990: 6f 72 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  orting..*/.stati
e9a0: 63 20 76 6f 69 64 20 63 72 65 61 74 65 53 6f 72  c void createSor
e9b0: 74 69 6e 67 49 6e 64 65 78 28 50 61 72 73 65 20  tingIndex(Parse 
e9c0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
e9d0: 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  *p, ExprList *pO
e9e0: 72 64 65 72 42 79 29 7b 0a 20 20 69 66 28 20 70  rderBy){.  if( p
e9f0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
ea00: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 61 73 73  nt addr;.    ass
ea10: 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 69  ert( pOrderBy->i
ea20: 45 43 75 72 73 6f 72 3d 3d 30 20 29 3b 0a 20 20  ECursor==0 );.  
ea30: 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
ea40: 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
ea50: 54 61 62 2b 2b 3b 0a 20 20 20 20 61 64 64 72 20  Tab++;.    addr 
ea60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ea70: 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
ea80: 65 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  e, OP_OpenEpheme
ea90: 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eab0: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
eac0: 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  sor, pOrderBy->n
ead0: 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 61 73 73  Expr+1);.    ass
eae0: 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
eaf0: 45 70 68 6d 5b 32 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[2] == -1 );
eb00: 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
eb10: 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[2] = addr;.
eb20: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
eb30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
eb40: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
eb50: 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
eb60: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
eb70: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
eb80: 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
eb90: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75  n of.** the resu
eba0: 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63  lt set for the c
ebb0: 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73  ompound-select s
ebc0: 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52  tatement "p".  R
ebd0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a  eturn NULL if.**
ebe0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
ebf0: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
ec00: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
ec10: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
ec20: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
ec30: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
ec40: 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  ect is taken fro
ec50: 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  m the.** left-mo
ec60: 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73  st term of the s
ec70: 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61  elect that has a
ec80: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
ec90: 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  nce..*/.static C
eca0: 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c  ollSeq *multiSel
ecb0: 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ectCollSeq(Parse
ecc0: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
ecd0: 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
ece0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b    CollSeq *pRet;
ecf0: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
ed00: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d   ){.    pRet = m
ed10: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
ed20: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  q(pParse, p->pPr
ed30: 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65  ior, iCol);.  }e
ed40: 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  lse{.    pRet = 
ed50: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65  0;.  }.  if( pRe
ed60: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74  t==0 ){.    pRet
ed70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
ed80: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
ed90: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
eda0: 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  .pExpr);.  }.  r
edb0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
edc0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
edd0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
ede0: 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  ECT */../* Forwa
edf0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
ee00: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
ee10: 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
ee20: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ee30: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
ee40: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
ee50: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
ee60: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
ee70: 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
ee80: 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
ee90: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
eea0: 44 65 73 74 2c 20 20 20 20 2f 2a 20 57 68 61 74  Dest,    /* What
eeb0: 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
eec0: 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 63  y results */.  c
eed0: 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
eee0: 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74       /* If eDest
eef0: 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   is SRT_Union, t
ef00: 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
ef10: 6e 67 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64  ng */.);...#ifnd
ef20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
ef30: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
ef40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ef50: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
ef60: 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e  rocess a compoun
ef70: 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f  d query form fro
ef80: 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65  m.** two or more
ef90: 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65   separate querie
efa0: 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55  s using UNION, U
efb0: 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54  NION ALL, EXCEPT
efc0: 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43  , or.** INTERSEC
efd0: 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e  T.**.** "p" poin
efe0: 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ts to the right-
eff0: 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20  most of the two 
f000: 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75  queries.  the qu
f010: 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65  ery on the.** le
f020: 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e  ft is p->pPrior.
f030: 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79    The left query
f040: 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61   could also be a
f050: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a   compound query.
f060: 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  ** in which case
f070: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
f080: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63  ll be called rec
f090: 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a  ursively. .**.**
f0a0: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
f0b0: 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
f0c0: 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  are to be writte
f0d0: 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61  n into a destina
f0e0: 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20  tion.** of type 
f0f0: 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d  eDest with param
f100: 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  eter iParm..**.*
f110: 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f  * Example 1:  Co
f120: 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77  nsider a three-w
f130: 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20  ay compound SQL 
f140: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
f150: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
f160: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
f170: 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT b FROM t2 UNI
f180: 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  ON SELECT c FROM
f190: 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73   t3.**.** This s
f1a0: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
f1b0: 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73  ed up as follows
f1c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
f1d0: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20  CT c FROM t3.** 
f1e0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60       |.**      `
f1f0: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62  ----->  SELECT b
f200: 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20   FROM t2.**     
f210: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
f220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60                 `
f230: 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  ------>  SELECT 
f240: 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20  a FROM t1.**.** 
f250: 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68  The arrows in th
f260: 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20  e diagram above 
f270: 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65  represent the Se
f280: 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e  lect.pPrior poin
f290: 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68  ter..** So if th
f2a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
f2b0: 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61  lled with p equa
f2c0: 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72  l to the t3 quer
f2d0: 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f  y, then.** pPrio
f2e0: 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32  r will be the t2
f2f0: 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77   query.  p->op w
f300: 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20  ill be TK_UNION 
f310: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
f320: 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20  .** Notice that 
f330: 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
f340: 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73  ay SQLite parses
f350: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
f360: 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  s, the.** indivi
f370: 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77  dual selects alw
f380: 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c  ays group from l
f390: 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f  eft to right..*/
f3a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
f3b0: 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  iSelect(.  Parse
f3c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
f3d0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
f3e0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
f3f0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
f400: 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
f410: 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
f420: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
f430: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
f440: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
f450: 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
f460: 6c 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  lts */.  char *a
f470: 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ff             /
f480: 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52  * If eDest is SR
f490: 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66  T_Union, the aff
f4a0: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
f4b0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
f4c0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75  LITE_OK;   /* Su
f4d0: 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
f4e0: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
f4f0: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
f500: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
f510: 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
f520: 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
f530: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f550: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
f560: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
f570: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
f580: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f590: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
f5a0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
f5b0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
f5c0: 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
f5d0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
f5e0: 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 61 53 65  n p */.  int aSe
f5f0: 74 50 32 5b 32 5d 3b 20 20 20 20 20 20 20 20 2f  tP2[2];        /
f600: 2a 20 53 65 74 20 50 32 20 76 61 6c 75 65 20 6f  * Set P2 value o
f610: 66 20 74 68 65 73 65 20 6f 70 20 74 6f 20 6e 75  f these op to nu
f620: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
f630: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74 50 32 20  */.  int nSetP2 
f640: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
f650: 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e  mber of slots in
f660: 20 61 53 65 74 50 32 5b 5d 20 75 73 65 64 20 2a   aSetP2[] used *
f670: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
f680: 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
f690: 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
f6a0: 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53  stination */.  S
f6b0: 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d  elect *pDelete =
f6c0: 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66   0;  /* Chain of
f6d0: 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20   simple selects 
f6e0: 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 0a 20 20  to delete */..  
f6f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
f700: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
f710: 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
f720: 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
f730: 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
f740: 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
f750: 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
f760: 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
f770: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
f780: 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
f790: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
f7a0: 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
f7b0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
f7c0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
f7d0: 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20  d;.  }.  pPrior 
f7e0: 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
f7f0: 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
f800: 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f  Rightmost!=pPrio
f810: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
f820: 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
f830: 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t==p->pRightmost
f840: 20 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72   );.  if( pPrior
f850: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
f860: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f870: 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20  g(pParse,"ORDER 
f880: 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  BY clause should
f890: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
f8a0: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
f8b0: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
f8c0: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
f8d0: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
f8e0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
f8f0: 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d   }.  if( pPrior-
f900: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >pLimit ){.    s
f910: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f920: 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61  Parse,"LIMIT cla
f930: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
f940: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
f950: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
f960: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
f970: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
f980: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f990: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
f9a0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
f9b0: 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65  have a valid que
f9c0: 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e  ry engine.  If n
f9d0: 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ot, create a new
f9e0: 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d   one..  */.  v =
f9f0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
fa00: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
fa10: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
fa20: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
fa30: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
fa40: 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  }..  /* Create t
fa50: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
fa60: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
fa70: 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
fa80: 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
fa90: 3b 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65  ;.  if( dest.eDe
faa0: 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
fab0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
fac0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
fad0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fae0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
faf0: 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 50 61  emeral, dest.iPa
fb00: 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  rm, p->pEList->n
fb10: 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e  Expr);.    dest.
fb20: 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c  eDest = SRT_Tabl
fb30: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  e;.  }..  /* Mak
fb40: 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43  e sure all SELEC
fb50: 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  Ts in the statem
fb60: 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ent have the sam
fb70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
fb80: 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ents.  ** in the
fb90: 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ir result sets..
fba0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
fbb0: 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
fbc0: 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
fbd0: 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
fbe0: 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr!=pPrior->pE
fbf0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
fc00: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
fc10: 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
fc20: 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
fc30: 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
fc40: 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20  .      " do not 
fc50: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
fc60: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
fc70: 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f  olumns", selectO
fc80: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
fc90: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
fca0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
fcb0: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 23 69 66 20 31  _end;.  }..#if 1
fcc0: 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
fcd0: 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  By ){.    return
fce0: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
fcf0: 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  rBy(pParse, p, p
fd00: 44 65 73 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a  Dest, aff);.  }.
fd10: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
fd20: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
fd30: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
fd40: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
fd50: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 64  nts..  */.  pOrd
fd60: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
fd70: 42 79 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  By;.  switch( p-
fd80: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
fd90: 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  TK_ALL: {.      
fda0: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
fdb0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
fdc0: 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ddr = 0;.       
fdd0: 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
fde0: 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20  ->pLimit );.    
fdf0: 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d      pPrior->pLim
fe00: 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
fe10: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
fe20: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
fe30: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72 63  fset;.        rc
fe40: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
fe50: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
fe60: 20 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c   &dest, 0, 0, 0,
fe70: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70   aff);.        p
fe80: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
fe90: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
fea0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
feb0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
fec0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
fed0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
fee0: 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50   }.        p->pP
fef0: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
ff00: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
ff10: 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
ff20: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
ff30: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
ff40: 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
ff50: 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
ff60: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
ff70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ff80: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
ff90: 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >iLimit);.      
ffa0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
ffb0: 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20  (v, "Jump ahead 
ffc0: 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64  if LIMIT reached
ffd0: 22 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  "));.        }. 
ffe0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
fff0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
10000 2c 20 70 2c 20 26 64 65 73 74 2c 20 30 2c 20 30  , p, &dest, 0, 0
10010 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
10020 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
10030 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
10040 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
10050 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
10060 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
10070 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
10080 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
10090 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
100a0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
100b0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
100c0 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
100d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
100e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
100f0 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e      /* For UNION
10100 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42   ALL ... ORDER B
10110 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  Y fall through t
10120 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20  o the next case 
10130 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
10140 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
10150 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
10160 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
10170 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
10180 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
10190 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
101a0 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
101b0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  */.      int op 
101c0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65  = 0;      /* One
101d0 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
101e0 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
101f0 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
10200 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
10210 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
10220 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
10230 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
10240 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
10250 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
10260 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
10270 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
10280 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
10290 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
102a0 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
102b0 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a  est uniondest;..
102c0 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
102d0 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20  p->op==TK_ALL ? 
102e0 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f  SRT_Table : SRT_
102f0 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  Union;.      if(
10300 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69   dest.eDest==pri
10310 6f 72 4f 70 20 26 26 20 70 4f 72 64 65 72 42 79  orOp && pOrderBy
10320 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69  ==0 && !p->pLimi
10330 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74  t && !p->pOffset
10340 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
10350 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
10360 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
10370 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
10380 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
10390 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
103a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
103b0 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
103c0 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  iParm;.      }el
103d0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
103e0 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
103f0 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
10400 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
10410 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
10420 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
10430 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
10440 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
10450 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
10460 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
10470 20 69 66 28 20 70 72 6f 63 65 73 73 43 6f 6d 70   if( processComp
10480 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50 61 72  oundOrderBy(pPar
10490 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62 29  se, p, unionTab)
104a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
104b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
104c0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
104d0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
104e0 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
104f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10500 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
10510 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  meral, unionTab,
10520 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
10530 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54 5f 54 61   priorOp==SRT_Ta
10540 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ble ){.         
10550 20 61 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c   assert( nSetP2<
10560 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73  sizeof(aSetP2)/s
10570 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29  izeof(aSetP2[0])
10580 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 53   );.          aS
10590 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d  etP2[nSetP2++] =
105a0 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 7d   addr;.        }
105b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
105c0 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
105d0 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
105e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   );.          p-
105f0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
10600 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
10610 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
10620 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 31 3b 0a  ->usesEphm = 1;.
10630 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10640 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49    createSortingI
10650 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20  ndex(pParse, p, 
10660 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
10670 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
10680 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
10690 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
106a0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
106b0 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
106c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
106d0 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
106e0 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
106f0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
10700 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64  DestInit(&uniond
10710 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  est, priorOp, un
10720 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 72  ionTab);.      r
10730 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
10740 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
10750 2c 20 26 75 6e 69 6f 6e 64 65 73 74 2c 20 30 2c  , &uniondest, 0,
10760 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
10770 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10780 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
10790 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
107a0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
107b0 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
107c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
107d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
107e0 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
107f0 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
10800 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53  _EXCEPT:  op = S
10810 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65  RT_Except;   bre
10820 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
10830 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70  e TK_UNION:   op
10840 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20   = SRT_Union;   
10850 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10860 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
10870 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65    op = SRT_Table
10880 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
10890 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
108a0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
108b0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
108c0 20 20 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f        p->disallo
108d0 77 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  wOrderBy = pOrde
108e0 72 42 79 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c  rBy!=0;.      pL
108f0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
10900 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
10910 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
10920 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
10930 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
10940 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  set = 0;.      u
10950 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
10960 20 6f 70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   op;.      rc = 
10970 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
10980 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
10990 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  est, 0, 0, 0, af
109a0 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65  f);.      /* Que
109b0 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
109c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
109d0 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
109e0 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
109f0 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
10a00 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
10a10 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
10a20 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
10a30 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73  leak. */.      s
10a40 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
10a50 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79  lete(p->pOrderBy
10a60 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
10a70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
10a80 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
10a90 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
10aa0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
10ab0 65 72 42 79 3b 0a 20 20 20 20 20 20 73 71 6c 69  erBy;.      sqli
10ac0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
10ad0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
10ae0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
10af0 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
10b00 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
10b10 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
10b20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  = 0;.      p->iO
10b30 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
10b40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
10b50 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
10b60 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
10b70 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  }...      /* Con
10b80 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e  vert the data in
10b90 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
10ba0 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76  able into whatev
10bb0 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  er form.      **
10bc0 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
10bd0 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
10be0 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20       */      .  
10bf0 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
10c00 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75  st!=priorOp || u
10c10 6e 69 6f 6e 54 61 62 21 3d 64 65 73 74 2e 69 50  nionTab!=dest.iP
10c20 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arm ){.        i
10c30 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
10c40 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
10c50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
10c60 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
10c70 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
10c80 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
10c90 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
10ca0 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
10cb0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
10cc0 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
10cd0 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
10ce0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
10cf0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
10d00 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
10d10 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
10d20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10d30 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
10d40 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
10d50 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43  l(v);.        iC
10d60 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
10d70 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
10d80 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
10d90 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
10da0 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
10db0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10dc0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10dd0 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61  _Rewind, unionTa
10de0 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  b, iBreak);.    
10df0 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
10e00 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
10e10 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
10e20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
10e30 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
10e40 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  List, unionTab, 
10e50 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
10e60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10e70 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
10e80 42 79 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69  By, -1, &dest, i
10e90 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29  Cont, iBreak, 0)
10ea0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10eb0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
10ec0 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
10ed0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10ee0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
10ef0 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
10f00 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  art);.        sq
10f10 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
10f20 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
10f30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10f40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10f50 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
10f60 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
10f70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10f80 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
10f90 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20  TERSECT: {.     
10fa0 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
10fb0 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
10fc0 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
10fd0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
10fe0 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
10ff0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
11000 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
11010 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
11020 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20        int r1;.. 
11030 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
11040 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
11050 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
11060 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
11070 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
11080 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
11090 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
110a0 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
110b0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
110c0 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
110d0 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
110e0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
110f0 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
11100 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
11110 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
11120 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
11130 70 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f  processCompoundO
11140 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70  rderBy(pParse, p
11150 2c 20 74 61 62 31 29 20 29 7b 0a 20 20 20 20 20  , tab1) ){.     
11160 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
11170 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
11180 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
11190 7d 0a 20 20 20 20 20 20 63 72 65 61 74 65 53 6f  }.      createSo
111a0 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73  rtingIndex(pPars
111b0 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b  e, p, pOrderBy);
111c0 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ..      addr = s
111d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
111e0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
111f0 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a  eral, tab1, 0);.
11200 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
11210 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
11220 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
11230 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
11240 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
11250 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e   p->pRightmost->
11260 75 73 65 73 45 70 68 6d 20 3d 20 31 3b 0a 20 20  usesEphm = 1;.  
11270 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
11280 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20  EList );..      
11290 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
112a0 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
112b0 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
112c0 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
112d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
112e0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
112f0 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  t(&intersectdest
11300 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
11310 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  1);.      rc = s
11320 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
11330 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e  rse, pPrior, &in
11340 74 65 72 73 65 63 74 64 65 73 74 2c 20 30 2c 20  tersectdest, 0, 
11350 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
11360 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
11370 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
11380 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
11390 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
113a0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
113b0 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72  LECT into tempor
113c0 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22  ary table "tab2"
113d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
113e0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
113f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
11400 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
11410 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b2, 0);.      as
11420 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
11430 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29  nEphm[1] == -1 )
11440 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
11450 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64  penEphm[1] = add
11460 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
11470 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
11480 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
11490 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
114a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
114b0 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
114c0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
114d0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
114e0 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 50 61  ntersectdest.iPa
114f0 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20  rm = tab2;.     
11500 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
11510 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
11520 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 30  intersectdest, 0
11530 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
11540 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
11550 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
11560 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
11570 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
11580 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
11590 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
115a0 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
115b0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
115c0 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
115d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
115e0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
115f0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11600 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
11610 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
11620 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
11630 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
11640 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
11650 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
11660 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
11670 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
11680 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
11690 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
116a0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c  k ){.        Sel
116b0 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
116c0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
116d0 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
116e0 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
116f0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
11700 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
11710 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
11720 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
11730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11740 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
11750 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11760 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20  ;.      iCont = 
11770 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
11780 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63  abel(v);.      c
11790 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
117a0 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
117b0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
117c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
117d0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
117e0 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ab1, iBreak);.  
117f0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
11800 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
11810 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  e);.      iStart
11820 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
11830 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65  dOp2(v, OP_RowKe
11840 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20  y, tab1, r1);.  
11850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11860 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 46  ddOp3(v, OP_NotF
11870 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
11880 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  t, r1);.      sq
11890 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
118a0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
118b0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
118c0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
118d0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
118e0 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  1, p->pEList->nE
118f0 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
11900 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
11910 72 42 79 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20  rBy, -1, &dest, 
11920 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30  iCont, iBreak, 0
11930 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11940 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
11950 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
11960 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11970 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
11980 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20  tab1, iStart);. 
11990 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
119a0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
119b0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
119c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
119d0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
119e0 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
119f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11a00 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
11a10 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
11a20 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
11a30 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
11a40 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
11a50 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
11a60 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20  s.  */.  nCol = 
11a70 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
11a80 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 65 74 50  ;.  while( nSetP
11a90 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  2 ){.    sqlite3
11aa0 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
11ab0 61 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50 32 5d  aSetP2[--nSetP2]
11ac0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20  , nCol);.  }..  
11ad0 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
11ae0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
11af0 73 65 64 20 62 79 20 65 69 74 68 65 72 20 74 68  sed by either th
11b00 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
11b10 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79  e or.  ** by any
11b20 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
11b30 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
11b40 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
11b50 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
11b60 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
11b70 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
11b80 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
11b90 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68  bles.  Invoke th
11ba0 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20  e.  ** ORDER BY 
11bb0 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74 68  processing if th
11bc0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
11bd0 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  BY clause..  **.
11be0 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
11bf0 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
11c00 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
11c10 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
11c20 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
11c30 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
11c40 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
11c50 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
11c60 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
11c70 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
11c80 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
11c90 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
11ca0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
11cb0 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
11cc0 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
11cd0 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
11ce0 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 75  pOrderBy || p->u
11cf0 73 65 73 45 70 68 6d 20 29 7b 0a 20 20 20 20 69  sesEphm ){.    i
11d00 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11d20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
11d30 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
11d40 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
11d50 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
11d60 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
11d70 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
11d80 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11da0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
11db0 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
11dc0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
11dd0 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  int nKeyCol;    
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11df0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
11e00 65 73 20 69 6e 20 70 4b 65 79 49 6e 66 6f 2d 3e  es in pKeyInfo->
11e10 61 43 6f 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f  aCol[] */.    Co
11e20 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
11e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11e40 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
11e50 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
11e60 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ll[] */.    Coll
11e70 53 65 71 20 2a 2a 61 43 6f 70 79 3b 20 20 20 20  Seq **aCopy;    
11e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
11e90 6f 70 79 20 6f 66 20 70 4b 65 79 49 6e 66 6f 2d  opy of pKeyInfo-
11ea0 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 0a 20 20 20  >aColl[] */..   
11eb0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
11ec0 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
11ed0 20 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20   nKeyCol = nCol 
11ee0 2b 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70 4f  + (pOrderBy ? pO
11ef0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20  rderBy->nExpr : 
11f00 30 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  0);.    pKeyInfo
11f10 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
11f20 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
11f30 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
11f40 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
11f50 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 4b 65 79  (*pKeyInfo)+nKey
11f60 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  Col*(sizeof(Coll
11f70 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20  Seq*) + 1));.   
11f80 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29   if( !pKeyInfo )
11f90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
11fa0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
11fb0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
11fc0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20  ct_end;.    }.. 
11fd0 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63     pKeyInfo->enc
11fe0 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
11ff0 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  b);.    pKeyInfo
12000 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b  ->nField = nCol;
12010 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61  ..    for(i=0, a
12020 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  pColl=pKeyInfo->
12030 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  aColl; i<nCol; i
12040 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20  ++, apColl++){. 
12050 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d       *apColl = m
12060 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
12070 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
12080 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61  .      if( 0==*a
12090 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
120a0 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73   *apColl = pPars
120b0 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
120c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
120d0 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
120e0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
120f0 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
12100 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12110 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
12120 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
12130 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
12140 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
12150 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
12160 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
12170 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
12180 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
12190 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
121a0 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
121b0 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
121c0 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
121d0 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
121e0 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
121f0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
12200 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
12210 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
12220 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
12230 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
12240 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
12250 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
12260 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12270 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
12280 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49  dr, (char*)pKeyI
12290 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
122a0 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
122b0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
122c0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
122d0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
122e0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
122f0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
12300 69 74 65 6d 20 2a 70 4f 54 65 72 6d 20 3d 20 70  item *pOTerm = p
12310 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20 20  OrderBy->a;.    
12320 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 45 78    int nOrderByEx
12330 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  pr = pOrderBy->n
12340 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
12350 61 64 64 72 3b 0a 20 20 20 20 20 20 75 38 20 2a  addr;.      u8 *
12360 70 53 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20  pSortOrder;..   
12370 20 20 20 2f 2a 20 52 65 75 73 65 20 74 68 65 20     /* Reuse the 
12380 73 61 6d 65 20 70 4b 65 79 49 6e 66 6f 20 66 6f  same pKeyInfo fo
12390 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  r the ORDER BY a
123a0 73 20 77 61 73 20 75 73 65 64 20 61 62 6f 76 65  s was used above
123b0 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68   for.      ** th
123c0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
123d0 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 45  t statements.  E
123e0 78 63 65 70 74 20 77 65 20 68 61 76 65 20 74 6f  xcept we have to
123f0 20 63 68 61 6e 67 65 20 6f 75 74 20 74 68 65 0a   change out the.
12400 20 20 20 20 20 20 2a 2a 20 70 4b 65 79 49 6e 66        ** pKeyInf
12410 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65  o->aColl[] value
12420 73 2e 20 20 53 6f 6d 65 20 6f 66 20 74 68 65 20  s.  Some of the 
12430 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73 20 77  aColl[] values w
12440 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ill be.      ** 
12450 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e 73  reused when cons
12460 74 72 75 63 74 69 6e 67 20 74 68 65 20 70 4b 65  tructing the pKe
12470 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f 52  yInfo for the OR
12480 44 45 52 20 42 59 2c 20 73 6f 20 6d 61 6b 65 0a  DER BY, so make.
12490 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 2e        ** a copy.
124a0 20 20 53 75 66 66 69 63 69 65 6e 74 20 73 70 61    Sufficient spa
124b0 63 65 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20  ce to hold both 
124c0 74 68 65 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73  the nCol entries
124d0 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68   for.      ** th
124e0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
124f0 74 20 61 6e 64 20 74 68 65 20 6e 4f 72 64 65 72  t and the nOrder
12500 62 79 45 78 70 72 20 65 6e 74 72 69 65 73 20 66  byExpr entries f
12510 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  or the ORDER BY.
12520 20 20 20 20 20 20 2a 2a 20 77 61 73 20 61 6c 6c        ** was all
12530 6f 63 61 74 65 64 20 61 62 6f 76 65 2e 20 20 42  ocated above.  B
12540 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 6f  ut we need to mo
12550 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ve the compound 
12560 73 65 6c 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  select.      ** 
12570 65 6e 74 72 69 65 73 20 6f 75 74 20 6f 66 20 74  entries out of t
12580 68 65 20 77 61 79 20 62 65 66 6f 72 65 20 63 6f  he way before co
12590 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 4f  nstructing the O
125a0 52 44 45 52 20 42 59 20 65 6e 74 72 69 65 73 2e  RDER BY entries.
125b0 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20 74  .      ** Move t
125c0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
125d0 63 74 20 65 6e 74 72 69 65 73 20 69 6e 74 6f 20  ct entries into 
125e0 61 43 6f 70 79 5b 5d 20 77 68 65 72 65 20 74 68  aCopy[] where th
125f0 65 79 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20  ey can be.      
12600 2a 2a 20 61 63 63 65 73 73 65 64 20 61 6e 64 20  ** accessed and 
12610 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e 73  reused when cons
12620 74 72 75 63 74 69 6e 67 20 74 68 65 20 4f 52 44  tructing the ORD
12630 45 52 20 42 59 20 65 6e 74 72 69 65 73 2e 0a 20  ER BY entries.. 
12640 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
12650 6e 43 6f 6c 20 6d 69 67 68 74 20 62 65 20 67 72  nCol might be gr
12660 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 6c 65  eater than or le
12670 73 73 20 74 68 61 6e 20 6e 4f 72 64 65 72 42 79  ss than nOrderBy
12680 45 78 70 72 0a 20 20 20 20 20 20 2a 2a 20 77 65  Expr.      ** we
12690 20 68 61 76 65 20 74 6f 20 75 73 65 20 6d 65 6d   have to use mem
126a0 6d 6f 76 65 28 29 20 77 68 65 6e 20 64 6f 69 6e  move() when doin
126b0 67 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20 20  g the copy..    
126c0 20 20 2a 2f 0a 20 20 20 20 20 20 61 43 6f 70 79    */.      aCopy
126d0 20 3d 20 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43   = &pKeyInfo->aC
126e0 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 45 78 70 72  oll[nOrderByExpr
126f0 5d 3b 0a 20 20 20 20 20 20 70 53 6f 72 74 4f 72  ];.      pSortOr
12700 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  der = pKeyInfo->
12710 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
12720 2a 29 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d 3b 0a  *)&aCopy[nCol];.
12730 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 61 43        memmove(aC
12740 6f 70 79 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  opy, pKeyInfo->a
12750 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f  Coll, nCol*sizeo
12760 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 0a 20  f(CollSeq*));.. 
12770 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d 20 70 4b       apColl = pK
12780 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20  eyInfo->aColl;. 
12790 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
127a0 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 20 69 2b  nOrderByExpr; i+
127b0 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20 61 70 43  +, pOTerm++, apC
127c0 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72 64 65  oll++, pSortOrde
127d0 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  r++){.        Ex
127e0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 54 65  pr *pExpr = pOTe
127f0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
12800 20 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e 66     if( (pExpr->f
12810 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
12820 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  late) ){.       
12830 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
12840 2d 3e 70 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20  ->pColl!=0 );.  
12850 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
12860 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a  = pExpr->pColl;.
12870 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
12880 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c           *apColl
12890 20 3d 20 61 43 6f 70 79 5b 70 45 78 70 72 2d 3e   = aCopy[pExpr->
128a0 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20  iColumn];.      
128b0 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 53 6f    }.        *pSo
128c0 72 74 4f 72 64 65 72 20 3d 20 70 4f 54 65 72 6d  rtOrder = pOTerm
128d0 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
128e0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
128f0 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t( p->pRightmost
12900 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==p );.      ass
12910 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
12920 45 70 68 6d 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20  Ephm[2]>=0 );.  
12930 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 61 64      addr = p->ad
12940 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3b 0a 20  drOpenEphm[2];. 
12950 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12960 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
12970 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  , p->pOrderBy->n
12980 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 20 20 70  Expr+2);.      p
12990 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
129a0 3d 20 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 0a  = nOrderByExpr;.
129b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
129c0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
129d0 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  r, (char*)pKeyIn
129e0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
129f0 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 70  ANDOFF);.      p
12a00 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20  KeyInfo = 0;.   
12a10 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
12a20 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76  ail(pParse, p, v
12a30 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
12a40 70 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  pr, &dest);.    
12a50 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  }..    sqlite3_f
12a60 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ree(pKeyInfo);. 
12a70 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
12a80 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69  _end:.  pDest->i
12a90 4d 65 6d 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b  Mem = dest.iMem;
12aa0 0a 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d  .  pDest->nMem =
12ab0 20 64 65 73 74 2e 6e 4d 65 6d 3b 0a 20 20 73 71   dest.nMem;.  sq
12ac0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
12ad0 65 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  e(pDelete);.  re
12ae0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
12af0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12b00 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
12b10 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
12b20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
12b30 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
12b40 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
12b50 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
12b60 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
12b70 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
12b80 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
12b90 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 4d  ained in pIn->iM
12ba0 65 6d 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a  em.  There are.*
12bb0 2a 20 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75  * pIn->nMem colu
12bc0 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74  mns to be output
12bd0 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72  .  pDest is wher
12be0 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f  e the output sho
12bf0 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a  uld.** be sent..
12c00 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20  **.** regReturn 
12c10 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
12c20 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f   the register ho
12c30 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  lding the subrou
12c40 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61  tine.** return a
12c50 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ddress..**.** If
12c60 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
12c70 69 74 20 69 73 20 61 20 74 68 65 20 66 69 72 73  it is a the firs
12c80 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
12c90 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
12ca0 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
12cb0 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
12cc0 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
12cd0 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
12ce0 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
12cf0 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
12d00 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
12d10 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
12d20 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
12d30 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
12d40 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
12d50 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
12d60 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
12d70 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
12d80 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
12d90 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
12da0 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
12db0 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
12dc0 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
12dd0 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
12de0 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
12df0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12e00 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
12e10 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
12e20 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
12e30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
12e40 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
12e50 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
12e60 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
12e70 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
12e80 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
12e90 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
12ea0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
12eb0 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
12ec0 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
12ed0 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
12ee0 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
12ef0 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
12f00 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
12f10 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
12f20 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
12f30 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
12f40 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
12f50 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
12f60 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
12f70 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
12f80 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
12f90 69 6e 74 20 70 34 74 79 70 65 2c 20 20 20 20 20  int p4type,     
12fa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
12fb0 34 20 74 79 70 65 20 66 6f 72 20 70 4b 65 79 49  4 type for pKeyI
12fc0 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  nfo */.  int iBr
12fd0 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
12fe0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
12ff0 20 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49   we hit the LIMI
13000 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  T */.){.  Vdbe *
13010 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
13020 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  e;.  int iContin
13030 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  ue;.  int addr;.
13040 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
13050 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13060 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 61 64   return 0;..  ad
13070 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
13080 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
13090 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71    iContinue = sq
130a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
130b0 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70  el(v);..  /* Sup
130c0 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
130d0 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45   for UNION, EXCE
130e0 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43  PT, and INTERSEC
130f0 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  T .  */.  if( re
13100 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74  gPrev ){.    int
13110 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20   j1, j2;.    j1 
13120 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13130 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
13140 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 6a   regPrev);.    j
13150 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
13160 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
13170 61 72 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  are, pIn->iMem, 
13180 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
13190 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  nMem,.          
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131b0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
131c0 6e 66 6f 2c 20 70 34 74 79 70 65 29 3b 0a 20 20  nfo, p4type);.  
131d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
131e0 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
131f0 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  j2+2, iContinue,
13200 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69   j2+2);.    sqli
13210 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
13220 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69  v, j1);.    sqli
13230 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
13240 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65  pParse, pIn->iMe
13250 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  m, regPrev+1, pI
13260 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 73 71  n->nMem);.    sq
13270 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13280 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
13290 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a  , regPrev);.  }.
132a0 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74  .  /* Suppress t
132b0 68 65 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  he the first OFF
132c0 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74  SET entries if t
132d0 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45  here is an OFFSE
132e0 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  T clause.  */.  
132f0 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
13300 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20   iContinue);..  
13310 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65  switch( pDest->e
13320 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  Dest ){.    /* S
13330 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
13340 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
13350 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
13360 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
13370 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
13380 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
13390 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
133a0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
133b0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
133c0 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
133d0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
133e0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
133f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
13400 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
13410 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d  n->iMem, pIn->nM
13420 65 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  em, r1);.      s
13430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13440 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
13450 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72   pDest->iParm, r
13460 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
13470 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
13480 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  P_Insert, pDest-
13490 3e 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b  >iParm, r1, r2);
134a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
134b0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
134c0 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
134d0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
134e0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
134f0 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
13500 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
13510 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
13520 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13530 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
13540 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
13550 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
13560 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
13570 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
13580 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
13590 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a  onstruct,.    **
135a0 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75   then there shou
135b0 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69  ld be a single i
135c0 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
135d0 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20  .  Write this.  
135e0 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74    ** item into t
135f0 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74  he set table wit
13600 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20  h bogus data..  
13610 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
13620 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
13630 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73  nt r1;.      ass
13640 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d  ert( pIn->nMem==
13650 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66  1 );.      p->af
13660 66 69 6e 69 74 79 20 3d 20 0a 20 20 20 20 20 20  finity = .      
13670 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
13680 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c  eAffinity(p->pEL
13690 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
136a0 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
136b0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
136c0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
136d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
136e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
136f0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
13700 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c  d, pIn->iMem, 1,
13710 20 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74   r1, &p->affinit
13720 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  y, 1);.      sql
13730 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
13740 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
13750 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31  se, pIn->iMem, 1
13760 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13770 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13780 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73  _IdxInsert, pDes
13790 74 2d 3e 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t->iParm, r1);. 
137a0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
137b0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
137c0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
137d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
137e0 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
137f0 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
13800 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
13810 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
13820 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
13830 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
13840 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13850 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
13860 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74  nteger, 1, pDest
13870 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  ->iParm);.      
13880 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
13890 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
138a0 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
138b0 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
138c0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
138d0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
138e0 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
138f0 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
13900 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
13910 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
13920 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
13930 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
13940 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
13950 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
13960 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
13970 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
13980 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
13990 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65  assert( pIn->nMe
139a0 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  m==1 );.      sq
139b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
139c0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
139d0 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  Mem, pDest->iPar
139e0 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
139f0 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
13a00 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
13a10 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
13a20 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
13a30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
13a40 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
13a50 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
13a60 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74  /..    /* Send t
13a70 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63  he data to the c
13a80 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
13a90 20 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74   or to a subrout
13aa0 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20  ine.  In the.   
13ab0 20 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75   ** case of a su
13ac0 62 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75  broutine, the su
13ad0 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20  broutine itself 
13ae0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
13af0 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e  or.    ** poppin
13b00 67 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20  g the data from 
13b10 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
13b20 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  /.    case SRT_C
13b30 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  oroutine: {.    
13b40 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d 65    if( pDest->iMe
13b50 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
13b60 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71  pDest->iMem = sq
13b70 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
13b80 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
13b90 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 44  Mem);.        pD
13ba0 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d  est->nMem = pIn-
13bb0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >nMem;.      }. 
13bc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13bd0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
13be0 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73   pIn->iMem, pDes
13bf0 74 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e  t->iMem, pDest->
13c00 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  nMem);.      sql
13c10 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13c20 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
13c30 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  t->iParm);.     
13c40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
13c50 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c     case SRT_Call
13c60 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 73 71  back: {.      sq
13c70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13c80 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
13c90 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d   pIn->iMem, pIn-
13ca0 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71  >nMem);.      sq
13cb0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
13cc0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
13cd0 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  rse, pIn->iMem, 
13ce0 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  pIn->nMem);.    
13cf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
13d00 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
13d10 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
13d20 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64  ).    /* Discard
13d30 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
13d40 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
13d50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13d60 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20  s inside.    ** 
13d70 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52  the body of a TR
13d80 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70  IGGER.  The purp
13d90 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65  ose of such sele
13da0 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20  cts is to call. 
13db0 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e     ** user-defin
13dc0 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ed functions tha
13dd0 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65  t have side effe
13de0 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  cts.  We do not 
13df0 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75  care.    ** abou
13e00 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73  t the actual res
13e10 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
13e20 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ct..    */.    d
13e30 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
13e40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
13e50 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
13e60 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
13e70 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
13e80 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
13e90 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
13ea0 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
13eb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13ec0 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70  (v, OP_AddImm, p
13ed0 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20  ->iLimit, -1);. 
13ee0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13ef0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp2(v, OP_IfZer
13f00 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
13f10 72 65 61 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  reak);.  }..  /*
13f20 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
13f30 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
13f40 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
13f50 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
13f60 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
13f70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13f80 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
13f90 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
13fa0 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
13fb0 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
13fc0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
13fd0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
13fe0 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
13ff0 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
14000 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
14010 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
14020 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
14030 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
14040 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
14050 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
14060 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
14070 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
14080 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
14090 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
140a0 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
140b0 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
140c0 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
140d0 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
140e0 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
140f0 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
14100 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
14110 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
14120 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
14130 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
14140 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
14150 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
14160 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
14170 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
14180 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
14190 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
141a0 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
141b0 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
141c0 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
141d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
141e0 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
141f0 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
14200 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
14210 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
14220 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
14230 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
14240 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
14250 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
14260 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
14270 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
14280 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
142a0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
142b0 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
142c0 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
142d0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
142e0 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
142f0 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
14300 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
14310 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
14320 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
14330 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
14340 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
14350 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
14360 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
14370 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
14380 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
14390 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
143a0 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
143b0 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
143c0 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
143d0 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
143e0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
143f0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
14400 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
14410 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
14420 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
14430 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
14440 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
14450 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
14460 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
14470 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
14480 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
14490 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
144a0 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
144b0 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
144c0 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
144d0 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
144e0 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
144f0 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
14500 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
14510 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
14520 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
14530 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
14540 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
14550 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
14560 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
14570 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
14580 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
14590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
145a0 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
145b0 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
145c0 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
145d0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
145e0 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
145f0 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
14600 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
14610 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
14620 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
14630 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
14640 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
14650 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
14660 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
14670 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
14680 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
14690 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
146a0 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
146b0 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
146c0 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
146d0 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
146e0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
146f0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
14700 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
14710 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
14720 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
14730 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
14740 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
14750 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
14760 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
14770 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
14780 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
14790 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
147a0 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
147b0 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
147c0 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
147d0 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
147e0 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
147f0 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
14800 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
14810 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
14820 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
14830 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
14840 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
14850 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
14860 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
14870 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
14880 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
14890 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
148a0 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
148b0 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
148c0 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
148d0 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
148e0 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
148f0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
14900 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
14910 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
14920 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
14930 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
14940 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
14950 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
14960 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
14970 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
14980 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
14990 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
149a0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
149b0 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
149c0 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
149d0 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
149e0 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
149f0 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
14a00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
14a10 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
14a20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
14a30 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
14a40 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
14a50 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
14a60 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
14a70 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
14a80 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
14a90 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
14aa0 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
14ab0 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
14ac0 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
14ad0 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
14ae0 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
14af0 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
14b00 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
14b10 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
14b20 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
14b30 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
14b40 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
14b50 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
14b60 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
14b70 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
14b80 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
14b90 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
14ba0 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
14bb0 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
14bc0 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
14bd0 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
14be0 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
14bf0 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
14c00 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
14c10 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
14c20 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
14c30 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
14c40 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
14c50 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
14c60 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
14c70 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
14c80 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
14c90 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
14ca0 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
14cb0 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
14cc0 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
14cd0 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
14ce0 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
14cf0 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
14d00 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
14d10 45 6f 66 42 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  EofB..*/.static 
14d20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
14d30 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
14d40 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
14d50 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
14d60 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
14d70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
14d80 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
14d90 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
14da0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
14db0 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
14dc0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
14dd0 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
14de0 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66  ts */.  char *af
14df0 66 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f             /*
14e00 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54   If eDest is SRT
14e10 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69  _Union, the affi
14e20 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
14e30 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
14e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
14e50 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
14e60 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
14e70 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
14e80 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
14e90 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
14ea0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
14eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
14ec0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
14ed0 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
14ee0 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20  lectDest destA; 
14ef0 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
14f00 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
14f10 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65   A */.  SelectDe
14f20 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a  st destB;     /*
14f30 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
14f40 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a   coroutine B */.
14f50 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20    int regAddrA; 
14f60 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
14f70 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
14f80 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
14f90 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45  ne */.  int regE
14fa0 6f 66 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ofA;          /*
14fb0 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74   Flag to indicat
14fc0 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 41 20  e when select-A 
14fd0 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20  is complete */. 
14fe0 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20   int regAddrB;  
14ff0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
15000 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
15010 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
15020 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f  e */.  int regEo
15030 66 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fB;          /* 
15040 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65  Flag to indicate
15050 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 42 20 69   when select-B i
15060 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20  s complete */.  
15070 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b  int addrSelectA;
15080 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
15090 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
150a0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
150b0 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b  int addrSelectB;
150c0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
150d0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
150e0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
150f0 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20  int regOutA;    
15100 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
15110 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
15120 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
15130 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
15140 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20  egOutB;         
15150 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
15160 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
15170 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
15180 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
15190 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tA;         /* A
151a0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
151b0 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
151c0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
151d0 75 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utB;         /* 
151e0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
151f0 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
15200 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
15210 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofA;         /*
15220 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
15230 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74  select-A-exhaust
15240 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
15250 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
15260 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
15270 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
15280 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
15290 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
152a0 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
152b0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
152c0 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
152d0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
152e0 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
152f0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
15300 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
15310 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
15320 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
15330 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
15340 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
15350 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
15360 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
15370 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
15380 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
15390 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
153a0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
153b0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
153c0 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
153d0 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
153e0 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
153f0 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
15400 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
15410 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
15420 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
15430 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
15440 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
15450 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
15460 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
15470 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
15480 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
15490 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
154a0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
154b0 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
154c0 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
154d0 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
154e0 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
154f0 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
15500 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
15510 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20  */.  int j1;    
15520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
15530 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
15540 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
15550 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
15560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15570 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
15580 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
15590 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
155a0 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
155b0 20 2a 70 4b 65 79 44 75 70 3b 20 20 20 20 20 2f   *pKeyDup;     /
155c0 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
155d0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
155e0 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
155f0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
15600 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
15610 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
15620 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
15630 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
15640 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
15650 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
15660 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
15670 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
15680 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
15690 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
156a0 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
156b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
156c0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
156d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
156e0 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
156f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
15700 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
15710 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
15720 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
15730 0a 20 20 75 38 20 4e 6f 74 55 73 65 64 3b 20 20  .  u8 NotUsed;  
15740 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d           /* Dumm
15750 79 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 0a  y variables */..
15760 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
15770 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 64 62  derBy!=0 );.  db
15780 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
15790 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
157a0 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  be;.  if( v==0 )
157b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
157c0 4f 4d 45 4d 3b 0a 20 20 6c 61 62 65 6c 45 6e 64  OMEM;.  labelEnd
157d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
157e0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
157f0 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
15800 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
15810 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
15820 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
15830 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
15840 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
15850 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
15860 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
15870 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
15880 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
15890 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
158a0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
158b0 20 20 20 69 66 28 20 70 72 6f 63 65 73 73 43 6f     if( processCo
158c0 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50  mpoundOrderBy(pP
158d0 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20  arse, p, 0) ){. 
158e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
158f0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
15900 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70      nOrderBy = p
15910 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
15920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72    }else{.    nOr
15930 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  derBy = 0;.  }. 
15940 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72   /* For operator
15950 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  s other than UNI
15960 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74  ON ALL we have t
15970 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
15980 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  .  ** the ORDER 
15990 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73  BY clause covers
159a0 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
159b0 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
159c0 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74  Add.  ** terms t
159d0 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
159e0 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61  lause as necessa
159f0 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ry..  */.  if( o
15a00 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
15a10 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61   for(i=1; db->ma
15a20 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26  llocFailed==0 &&
15a30 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   i<=p->pEList->n
15a40 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
15a50 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 4f 72    for(j=0; j<nOr
15a60 64 65 72 42 79 3b 20 6a 2b 2b 29 7b 0a 20 20 20  derBy; j++){.   
15a70 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d       Expr *pTerm
15a80 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a   = pOrderBy->a[j
15a90 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
15aa0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
15ab0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
15ac0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15ad0 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  ( (pTerm->flags 
15ae0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d  & EP_IntValue)!=
15af0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
15b00 20 70 54 65 72 6d 2d 3e 69 54 61 62 6c 65 3d 3d   pTerm->iTable==
15b10 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
15b20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
15b30 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
15b40 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
15b50 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
15b60 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52  arse, TK_INTEGER
15b70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
15b80 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
15b90 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
15ba0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
15bb0 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
15bc0 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
15bd0 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20     pNew->iTable 
15be0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  = i;.        pOr
15bf0 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
15c00 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
15c10 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
15c20 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 20 20  pNew, 0);.      
15c30 20 20 6e 4f 72 64 65 72 42 79 2b 2b 3b 0a 20 20    nOrderBy++;.  
15c40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15c50 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
15c60 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
15c70 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
15c80 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
15c90 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
15ca0 70 65 72 6d 75 74 61 74 69 6f 6e 20 69 6e 20 6f  permutation in o
15cb0 72 64 65 72 20 74 6f 20 63 6f 6d 70 61 72 69 73  rder to comparis
15cc0 6f 6e 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ons to determine
15cd0 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a   if the next.  *
15ce0 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73  * row of results
15cf0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65   comes from sele
15d00 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20  ctA or selectB. 
15d10 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63   Also add explic
15d20 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  it.  ** collatio
15d30 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ns to the ORDER 
15d40 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
15d50 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
15d60 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a   subqueries.  **
15d70 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e   to the right an
15d80 64 20 74 68 65 20 6c 65 66 74 20 61 72 65 20 65  d the left are e
15d90 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75  valuated, they u
15da0 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  se the correct. 
15db0 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20   ** collation.. 
15dc0 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d   */.  aPermute =
15dd0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
15de0 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69  Raw(db, sizeof(i
15df0 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20  nt)*nOrderBy);. 
15e00 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b   if( aPermute ){
15e10 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15e20 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
15e30 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
15e40 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  m = pOrderBy->a[
15e50 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
15e60 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 6f  assert( pTerm->o
15e70 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b  p==TK_INTEGER );
15e80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
15e90 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45  pTerm->flags & E
15ea0 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 29  P_IntValue)!=0 )
15eb0 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65  ;.      aPermute
15ec0 5b 69 5d 20 3d 20 70 54 65 72 6d 2d 3e 69 54 61  [i] = pTerm->iTa
15ed0 62 6c 65 2d 31 3b 0a 20 20 20 20 20 20 61 73 73  ble-1;.      ass
15ee0 65 72 74 28 20 61 50 65 72 6d 75 74 65 5b 69 5d  ert( aPermute[i]
15ef0 3e 3d 30 20 26 26 20 61 50 65 72 6d 75 74 65 5b  >=0 && aPermute[
15f00 69 5d 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  i]<p->pEList->nE
15f10 78 70 72 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xpr );.    }.   
15f20 20 70 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20 20   pKeyMerge =.   
15f30 20 20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c     sqlite3DbMall
15f40 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
15f50 28 2a 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f 72  (*pKeyMerge)+nOr
15f60 64 65 72 42 79 2a 28 73 69 7a 65 6f 66 28 43 6f  derBy*(sizeof(Co
15f70 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 20  llSeq*)+1));.   
15f80 20 69 66 28 20 70 4b 65 79 4d 65 72 67 65 20 29   if( pKeyMerge )
15f90 7b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67  {.      pKeyMerg
15fa0 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  e->aSortOrder = 
15fb0 28 75 38 2a 29 26 70 4b 65 79 4d 65 72 67 65 2d  (u8*)&pKeyMerge-
15fc0 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d  >aColl[nOrderBy]
15fd0 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67  ;.      pKeyMerg
15fe0 65 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f 72 64  e->nField = nOrd
15ff0 65 72 42 79 3b 0a 20 20 20 20 20 20 70 4b 65 79  erBy;.      pKey
16000 4d 65 72 67 65 2d 3e 65 6e 63 20 3d 20 45 4e 43  Merge->enc = ENC
16010 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  (db);.      for(
16020 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
16030 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   i++){.        C
16040 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
16050 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65         Expr *pTe
16060 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  rm = pOrderBy->a
16070 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
16080 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
16090 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
160a0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ate ){.         
160b0 20 70 43 6f 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e   pColl = pTerm->
160c0 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  pColl;.        }
160d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
160e0 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
160f0 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
16100 65 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b 69  e, p, aPermute[i
16110 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54  ]);.          pT
16120 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  erm->flags |= EP
16130 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
16140 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 43         pTerm->pC
16150 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  oll = pColl;.   
16160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
16170 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b  KeyMerge->aColl[
16180 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
16190 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61      pKeyMerge->a
161a0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
161b0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
161c0 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d  rtOrder;.      }
161d0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
161e0 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
161f0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  0;.  }..  /* Rea
16200 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  ttach the ORDER 
16210 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  BY clause to the
16220 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
16230 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
16240 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d  derBy;.  pPrior-
16250 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
16260 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
16270 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65  Parse->db, pOrde
16280 72 42 79 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  rBy);..  /* Allo
16290 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20  cate a range of 
162a0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
162b0 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49  ers and the KeyI
162c0 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20  nfo needed.  ** 
162d0 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68  for the logic th
162e0 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69  at removes dupli
162f0 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73  cate result rows
16300 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f   when the.  ** o
16310 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
16320 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
16330 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20  ERSECT (but not 
16340 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f  UNION ALL)..  */
16350 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
16360 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76  L ){.    regPrev
16370 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
16380 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
16390 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
163a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72  .    assert( nOr
163b0 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 29 3b 0a  derBy>=nExpr );.
163c0 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 73 71      regPrev = sq
163d0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
163e0 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b  e(pParse, nExpr+
163f0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
16400 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16410 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50  Integer, 0, regP
16420 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75  rev);.    pKeyDu
16430 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
16440 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20  locZero(db,.    
16450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
16460 7a 65 6f 66 28 2a 70 4b 65 79 44 75 70 29 20 2b  zeof(*pKeyDup) +
16470 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43   nExpr*(sizeof(C
16480 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20  ollSeq*)+1) );. 
16490 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29     if( pKeyDup )
164a0 7b 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d  {.      pKeyDup-
164b0 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
164c0 38 2a 29 26 70 4b 65 79 44 75 70 2d 3e 61 43 6f  8*)&pKeyDup->aCo
164d0 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20  ll[nExpr];.     
164e0 20 70 4b 65 79 44 75 70 2d 3e 6e 46 69 65 6c 64   pKeyDup->nField
164f0 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20   = nExpr;.      
16500 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d 20 45  pKeyDup->enc = E
16510 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f  NC(db);.      fo
16520 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
16530 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  i++){.        pK
16540 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  eyDup->aColl[i] 
16550 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
16560 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
16570 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  i);.        pKey
16580 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Dup->aSortOrder[
16590 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
165a0 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a      }.  }. .  /*
165b0 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65   Separate the le
165c0 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74  ft and the right
165d0 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20   query from one 
165e0 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70  another.  */.  p
165f0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
16600 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f  pPrior->pRightmo
16610 73 74 20 3d 20 30 3b 0a 20 20 70 72 6f 63 65 73  st = 0;.  proces
16620 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  sOrderGroupBy(pP
16630 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
16640 65 72 42 79 2c 20 31 2c 20 26 4e 6f 74 55 73 65  erBy, 1, &NotUse
16650 64 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  d);.  if( pPrior
16660 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
16670 20 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47     processOrderG
16680 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
16690 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
166a0 4f 72 64 65 72 42 79 2c 20 31 2c 20 26 4e 6f 74  OrderBy, 1, &Not
166b0 55 73 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Used);.  }..  /*
166c0 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
166d0 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
166e0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
166f0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
16700 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
16710 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
16720 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
16730 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
16740 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
16750 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
16760 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
16770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16780 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
16790 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
167a0 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
167b0 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
167c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167d0 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
167e0 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
167f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16800 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
16810 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
16820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
16830 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
16840 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
16850 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
16860 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
16870 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71  pLimit = 0;.  sq
16880 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
16890 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70  p->pOffset);.  p
168a0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->pOffset = 0;..
168b0 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70    regAddrA = ++p
168c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
168d0 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73  egEofA = ++pPars
168e0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64  e->nMem;.  regAd
168f0 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drB = ++pParse->
16900 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20  nMem;.  regEofB 
16910 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
16920 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
16930 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
16940 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
16950 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
16960 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
16970 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
16980 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
16990 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
169a0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
169b0 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
169c0 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
169d0 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68   /* Jump past th
169e0 65 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75  e various subrou
169f0 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74  tines and corout
16a00 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e  ines to the main
16a10 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70  .  ** merge loop
16a20 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c  .  */.  j1 = sql
16a30 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
16a40 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64  , OP_Goto);.  ad
16a50 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69  drSelectA = sqli
16a60 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
16a70 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65  dr(v);...  /* Ge
16a80 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
16a90 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
16aa0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
16ab0 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ent to the.  ** 
16ac0 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  left of the comp
16ad0 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20  ound operator - 
16ae0 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a  the "A" select..
16af0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
16b00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
16b10 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  n coroutine for 
16b20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
16b30 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
16b40 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20   = regLimitA;.  
16b50 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
16b60 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
16b70 65 73 74 41 2c 20 30 2c 20 30 2c 20 30 2c 20 30  estA, 0, 0, 0, 0
16b80 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16b90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
16ba0 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 41  eger, 1, regEofA
16bb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16bc0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
16bd0 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
16be0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
16bf0 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74  ((v, "End corout
16c00 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c  ine for left SEL
16c10 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65  ECT"));..  /* Ge
16c20 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
16c30 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
16c40 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
16c50 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65  ent on .  ** the
16c60 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22   right - the "B"
16c70 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61   select.  */.  a
16c80 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c  ddrSelectB = sql
16c90 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
16ca0 64 64 72 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f  ddr(v);.  VdbeNo
16cb0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  opComment((v, "B
16cc0 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66  egin coroutine f
16cd0 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22  or right SELECT"
16ce0 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74  ));.  savedLimit
16cf0 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
16d00 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d  savedOffset = p-
16d10 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69  >iOffset;.  p->i
16d20 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
16d30 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  B;.  p->iOffset 
16d40 3d 20 30 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  = 0;  .  sqlite3
16d50 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
16d60 2c 20 26 64 65 73 74 42 2c 20 30 2c 20 30 2c 20  , &destB, 0, 0, 
16d70 30 2c 20 30 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d  0, 0);.  p->iLim
16d80 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b  it = savedLimit;
16d90 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
16da0 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73  savedOffset;.  s
16db0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16dc0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
16dd0 31 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73  1, regEofB);.  s
16de0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16df0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
16e00 67 41 64 64 72 42 29 3b 0a 20 20 56 64 62 65 4e  gAddrB);.  VdbeN
16e10 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
16e20 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  End coroutine fo
16e30 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29  r right SELECT")
16e40 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
16e50 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
16e60 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
16e70 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
16e80 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he A.  ** select
16e90 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
16ea0 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
16eb0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
16ec0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
16ed0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
16ee0 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41  ut routine for A
16ef0 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20  "));.  addrOutA 
16f00 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
16f10 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
16f20 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
16f30 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70      p, &destA, p
16f40 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20  Dest, regOutA,. 
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f60 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
16f70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
16f80 44 4f 46 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  DOFF, labelEnd);
16f90 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  .  .  /* Generat
16fa0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
16fb0 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
16fc0 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
16fd0 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he B.  ** select
16fe0 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
16ff0 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
17000 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
17010 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
17020 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
17030 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62  UNION ){.    Vdb
17040 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
17050 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
17060 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61   for B"));.    a
17070 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61  ddrOutB = genera
17080 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
17090 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
170a0 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
170b0 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65  destB, pDest, re
170c0 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20  gOutB,.         
170d0 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
170e0 20 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59   pKeyDup, P4_KEY
170f0 49 4e 46 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62  INFO_STATIC, lab
17100 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f  elEnd);.  }..  /
17110 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
17120 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
17130 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
17140 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20  from select A.  
17150 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
17160 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
17170 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69  n select B remai
17180 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ns..  */.  VdbeN
17190 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
171a0 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  eof-A subroutine
171b0 22 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  "));.  if( op==T
171c0 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
171d0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
171e0 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73      addrEofA = s
171f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17200 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
17210 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c  labelEnd);.  }el
17220 73 65 7b 20 20 0a 20 20 20 20 61 64 64 72 45 6f  se{  .    addrEo
17230 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
17240 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
17250 20 72 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45   regEofB, labelE
17260 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nd);.    sqlite3
17270 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17280 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
17290 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20   addrOutB);.    
172a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
172b0 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
172c0 65 67 41 64 64 72 42 29 3b 0a 20 20 20 20 73 71  egAddrB);.    sq
172d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
172e0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
172f0 64 64 72 45 6f 66 41 29 3b 0a 20 20 7d 0a 0a 20  ddrEofA);.  }.. 
17300 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
17310 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
17320 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
17330 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a  s from select B.
17340 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
17350 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
17360 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d   in select A rem
17370 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
17380 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
17390 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
173a0 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20  B = addrEofA;.  
173b0 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
173c0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
173d0 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69   "eof-B subrouti
173e0 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
173f0 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofB = sqlite3Vdb
17400 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
17410 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c  , regEofA, label
17420 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  End);.    sqlite
17430 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17440 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
17450 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
17460 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17470 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
17480 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73  regAddrA);.    s
17490 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
174a0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
174b0 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a  addrEofB);.  }..
174c0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
174d0 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
174e0 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
174f0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
17500 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
17510 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
17520 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
17530 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17540 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
17550 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
17560 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17570 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
17580 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
17590 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
175a0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
175b0 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73  , addrEofA);.  s
175c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
175d0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
175e0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
175f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
17600 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
17610 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
17620 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
17630 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
17640 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
17650 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
17660 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
17670 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
17680 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
17690 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
176a0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
176b0 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
176c0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
176d0 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
176e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
176f0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
17700 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73  regAddrA);.    s
17710 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17720 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
17730 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  fA, addrEofA);. 
17740 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17750 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
17760 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
17770 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
17780 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
17790 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e  e the case of A>
177a0 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
177b0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
177c0 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  gt-B subroutine"
177d0 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d  ));.  addrAgtB =
177e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
177f0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
17800 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
17810 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
17820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17830 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
17840 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
17850 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  OutB);.  }.  sql
17860 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
17870 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
17880 64 64 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrB);.  sqlite3
17890 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
178a0 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64  _If, regEofB, ad
178b0 64 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74  drEofB);.  sqlit
178c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
178d0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
178e0 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  lCmpr);..  /* Th
178f0 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63  is code runs onc
17900 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
17910 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  everything..  */
17920 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
17930 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
17940 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17950 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
17960 2c 20 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20  , 0, regEofA);. 
17970 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17980 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
17990 2c 20 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20  , 0, regEofB);. 
179a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
179b0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
179c0 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 53 65  regAddrA, addrSe
179d0 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  lectA);.  sqlite
179e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
179f0 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72  P_Gosub, regAddr
17a00 42 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b  B, addrSelectB);
17a10 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17a20 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
17a30 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41  egEofA, addrEofA
17a40 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
17a50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
17a60 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f   regEofB, addrEo
17a70 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65  fB);..  /* Imple
17a80 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65  ment the main me
17a90 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
17aa0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
17ab0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
17ac0 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cmpr);.  sqlite3
17ad0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
17ae0 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c  _Permutation, 0,
17af0 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50   0, 0, (char*)aP
17b00 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52  ermute, P4_INTAR
17b10 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  RAY);.  sqlite3V
17b20 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
17b30 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69  Compare, destA.i
17b40 4d 65 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c  Mem, destB.iMem,
17b50 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
17b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b70 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
17b80 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
17b90 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c  _HANDOFF);.  sql
17ba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17bb0 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41  , OP_Jump, addrA
17bc0 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61  ltB, addrAeqB, a
17bd0 64 64 72 41 67 74 42 29 3b 0a 0a 20 20 2f 2a 20  ddrAgtB);..  /* 
17be0 52 65 6c 65 61 73 65 20 74 65 6d 70 6f 72 61 72  Release temporar
17bf0 79 20 72 65 67 69 73 74 65 72 73 0a 20 20 2a 2f  y registers.  */
17c00 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29  .  if( regPrev )
17c10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  {.    sqlite3Rel
17c20 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
17c30 61 72 73 65 2c 20 72 65 67 50 72 65 76 2c 20 6e  arse, regPrev, n
17c40 4f 72 64 65 72 42 79 2b 31 29 3b 0a 20 20 7d 0a  OrderBy+1);.  }.
17c50 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
17c60 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  e this point in 
17c70 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61  order to termina
17c80 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  te the query..  
17c90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
17ca0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
17cb0 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a  labelEnd);..  /*
17cc0 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
17cd0 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  of output column
17ce0 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  s.  */.  if( pDe
17cf0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 43  st->eDest==SRT_C
17d00 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 53  allback ){.    S
17d10 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
17d20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c  pPrior;.    whil
17d30 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
17d40 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
17d50 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
17d60 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
17d70 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
17d80 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
17d90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73  .  }..  /* Reass
17da0 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75  embly the compou
17db0 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74  nd query so that
17dc0 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
17dd0 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
17de0 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
17df0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
17e00 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
17e10 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
17e20 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f 72  Delete(p->pPrior
17e30 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69  );.  }.  p->pPri
17e40 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20 20  or = pPrior;..  
17e50 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
17e60 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
17e70 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
17e80 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
17e90 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
17ea0 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 72 65 74 75  ies ****/.  retu
17eb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17ec0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17ed0 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 20 46 6f 72  OMIT_VIEW./* For
17ee0 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e  ward Declaration
17ef0 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
17f00 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 73   substExprList(s
17f10 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73  qlite3*, ExprLis
17f20 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73  t*, int, ExprLis
17f30 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  t*);.static void
17f40 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c   substSelect(sql
17f50 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c  ite3*, Select *,
17f60 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a   int, ExprList *
17f70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  );../*.** Scan t
17f80 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
17f90 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
17fa0 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
17fb0 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
17fc0 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
17fd0 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
17fe0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
17ff0 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
18000 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
18010 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
18020 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
18030 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
18040 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
18050 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
18060 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
18070 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
18080 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
18090 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
180a0 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
180b0 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
180c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
180d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
180e0 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
180f0 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
18100 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
18110 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
18120 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
18130 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
18140 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73  e make the neces
18150 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
18160 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
18170 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
18180 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
18190 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
181a0 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
181b0 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
181c0 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
181d0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
181e0 64 20 73 75 62 73 74 45 78 70 72 28 0a 20 20 73  d substExpr(.  s
181f0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
18200 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
18210 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68  loc errors to th
18220 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  is connection */
18230 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
18240 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69         /* Expr i
18250 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75  n which substitu
18260 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20  tion occurs */. 
18270 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
18280 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
18290 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20   be substituted 
182a0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
182b0 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73  EList    /* Subs
182c0 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69 6f  titute expressio
182d0 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ns */.){.  if( p
182e0 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
182f0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
18300 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
18310 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
18320 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
18330 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
18340 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
18350 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
18360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18370 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
18380 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
18390 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69  t!=0 && pExpr->i
183a0 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e  Column<pEList->n
183b0 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Expr );.      as
183c0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
183d0 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
183e0 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78  pRight==0 && pEx
183f0 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
18400 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c        pNew = pEL
18410 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43  ist->a[pExpr->iC
18420 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20  olumn].pExpr;.  
18430 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
18440 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  !=0 );.      pEx
18450 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f  pr->op = pNew->o
18460 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
18470 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
18480 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
18490 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  >pLeft = sqlite3
184a0 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65 77  ExprDup(db, pNew
184b0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
184c0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
184d0 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
184e0 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
184f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
18500 28 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69 67 68  (db, pNew->pRigh
18510 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
18520 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  ( pExpr->pList==
18530 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
18540 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  ->pList = sqlite
18550 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
18560 20 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20   pNew->pList);. 
18570 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
18580 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c  le = pNew->iTabl
18590 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e;.      pExpr->
185a0 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61  pTab = pNew->pTa
185b0 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  b;.      pExpr->
185c0 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e  iColumn = pNew->
185d0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
185e0 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65  Expr->iAgg = pNe
185f0 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73  w->iAgg;.      s
18600 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
18610 64 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65  db, &pExpr->toke
18620 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29  n, &pNew->token)
18630 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
18640 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45  okenCopy(db, &pE
18650 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77  xpr->span, &pNew
18660 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70  ->span);.      p
18670 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Expr->pSelect = 
18680 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
18690 28 64 62 2c 20 70 4e 65 77 2d 3e 70 53 65 6c 65  (db, pNew->pSele
186a0 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ct);.      pExpr
186b0 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e  ->flags = pNew->
186c0 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  flags;.    }.  }
186d0 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
186e0 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
186f0 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
18700 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
18710 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
18720 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
18730 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
18740 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78  stSelect(db, pEx
18750 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61  pr->pSelect, iTa
18760 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
18770 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
18780 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  db, pExpr->pList
18790 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
187a0 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
187b0 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
187c0 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st(.  sqlite3 *d
187d0 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
187e0 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
187f0 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70  rs here */.  Exp
18800 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
18810 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61    /* List to sca
18820 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74  n and in which t
18830 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
18840 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  es */.  int iTab
18850 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
18860 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
18870 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
18880 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
18890 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
188a0 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  values */.){.  i
188b0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
188c0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
188d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
188e0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
188f0 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62      substExpr(db
18900 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
18910 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  xpr, iTable, pEL
18920 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  ist);.  }.}.stat
18930 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
18940 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
18950 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
18960 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
18970 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65  ors here */.  Se
18980 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
18990 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
189a0 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20  tement in which 
189b0 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
189c0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tions */.  int i
189d0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
189e0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72  /* Table to be r
189f0 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70  eplaced */.  Exp
18a00 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
18a10 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
18a20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  values */.){.  i
18a30 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
18a40 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
18a50 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69  db, p->pEList, i
18a60 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
18a70 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
18a80 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
18a90 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
18aa0 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
18ab0 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  t(db, p->pOrderB
18ac0 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
18ad0 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28  t);.  substExpr(
18ae0 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
18af0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
18b00 0a 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c  .  substExpr(db,
18b10 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62   p->pWhere, iTab
18b20 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
18b30 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
18b40 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65  ->pPrior, iTable
18b50 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e  , pEList);.}.#en
18b60 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
18b70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
18b80 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
18b90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
18ba0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18bb0 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
18bc0 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
18bd0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65   in order to spe
18be0 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  ed.** execution.
18bf0 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69    It returns 1 i
18c00 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
18c10 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
18c20 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63  lattening.** occ
18c30 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
18c40 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
18c50 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
18c60 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
18c70 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
18c80 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
18c90 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
18ca0 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
18cb0 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
18cc0 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
18cd0 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
18ce0 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
18cf0 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
18d00 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
18d10 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
18d20 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
18d30 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
18d40 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
18d50 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
18d60 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
18d70 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
18d80 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
18d90 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
18da0 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
18db0 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
18dc0 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
18dd0 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
18de0 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
18df0 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
18e00 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
18e10 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
18e20 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
18e30 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
18e40 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
18e50 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
18e60 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
18e70 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
18e80 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
18e90 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
18ea0 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
18eb0 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
18ec0 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
18ed0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
18ee0 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
18ef0 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
18f00 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
18f10 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
18f20 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
18f30 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
18f40 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
18f50 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
18f60 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
18f70 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
18f80 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
18f90 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
18fa0 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
18fb0 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
18fc0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
18fd0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
18fe0 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
18ff0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
19000 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
19010 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
19020 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
19030 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
19040 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
19050 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
19060 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
19070 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
19080 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
19090 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
190a0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
190b0 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
190c0 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  in, or.**       
190d0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
190e0 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f   not itself a jo
190f0 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30  in.  (Ticket #30
19100 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  6).**.**   (4)  
19110 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
19120 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
19130 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
19140 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
19150 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20  *.**   (5)  The 
19160 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
19170 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
19180 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
19190 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
191a0 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
191b0 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20  *.**   (6)  The 
191c0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
191d0 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
191e0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
191f0 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
19200 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a       DISTINCT..*
19210 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20  *.**   (7)  The 
19220 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46  subquery has a F
19230 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
19240 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
19250 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
19260 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
19270 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
19280 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
19290 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
192a0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
192b0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
192c0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
192d0 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
192e0 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
192f0 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73  .**  (10)  The s
19300 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
19310 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
19320 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
19330 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
19340 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
19350 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
19360 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
19370 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
19380 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
19390 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
193a0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54  ..**.**  (12)  T
193b0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
193c0 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ot the right ter
193d0 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  m of a LEFT OUTE
193e0 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a  R JOIN or the.**
193f0 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
19400 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
19410 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62 79  ause.  (added by
19420 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a   ticket #350).**
19430 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
19440 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
19450 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
19460 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a 2a  oth use LIMIT.**
19470 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73  .**  (14)  The s
19480 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
19490 20 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a   use OFFSET.**.*
194a0 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74  *  (15)  The out
194b0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
194c0 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
194d0 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65  nd select or the
194e0 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
194f0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ery does not hav
19500 65 20 62 6f 74 68 20 61 6e 20 4f 52 44 45 52 20  e both an ORDER 
19510 42 59 20 61 6e 64 20 61 20 4c 49 4d 49 54 20 63  BY and a LIMIT c
19520 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  lause..**       
19530 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33   (See ticket #23
19540 33 39 29 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  39).**.**  (16) 
19550 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
19560 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
19570 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71  gate or the subq
19580 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20  uery does.**    
19590 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20      not contain 
195a0 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b  ORDER BY.  (Tick
195b0 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20  et #2942)  This 
195c0 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74  used to not matt
195d0 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74  er.**        unt
195e0 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64  il we introduced
195f0 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61   the group_conca
19600 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a  t() function.  .
19610 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65  **.**  (17)  The
19620 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f   sub-query is no
19630 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  t a compound sel
19640 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20  ect, or it is a 
19650 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20  UNION ALL .**   
19660 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c       compound cl
19670 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74  ause made up ent
19680 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67  irely of non-agg
19690 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20  regate queries, 
196a0 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74  and .**        t
196b0 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a  he parent query:
196c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
196d0 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  * is not itself 
196e0 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
196f0 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20  nd select,.**   
19700 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
19710 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
19720 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20  DISTINCT query, 
19730 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
19740 2a 20 68 61 73 20 6e 6f 20 6f 74 68 65 72 20 74  * has no other t
19750 61 62 6c 65 73 20 6f 72 20 73 75 62 2d 73 65 6c  ables or sub-sel
19760 65 63 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ects in the FROM
19770 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
19780 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e 74        The parent
19790 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d   and sub-query m
197a0 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45  ay contain WHERE
197b0 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63   clauses. Subjec
197c0 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72  t to.**        r
197d0 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29 20  ules (11), (13) 
197e0 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d  and (14), they m
197f0 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ay also contain 
19800 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20  ORDER BY,.**    
19810 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46      LIMIT and OF
19820 46 53 45 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  FSET clauses..**
19830 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
19840 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
19850 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
19860 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
19870 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
19880 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
19890 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
198a0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
198b0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
198c0 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
198d0 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
198e0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
198f0 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
19900 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
19910 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
19920 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
19930 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
19940 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
19950 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
19960 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
19970 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
19980 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
19990 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
199a0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
199b0 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
199c0 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
199d0 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
199e0 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
199f0 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
19a00 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
19a10 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
19a20 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
19a30 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
19a40 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
19a50 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
19a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19a70 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72   parent or outer
19a80 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
19a90 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
19aa0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
19ab0 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d  ndex in p->pSrc-
19ac0 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65  >a[] of the inne
19ad0 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  r subquery */.  
19ae0 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20  int isAgg,      
19af0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
19b00 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65  outer SELECT use
19b10 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
19b20 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73  tions */.  int s
19b30 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20  ubqueryIsAgg    
19b40 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
19b50 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
19b60 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
19b70 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
19b80 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
19b90 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
19ba0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
19bb0 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74   Select *pParent
19bc0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  ;.  Select *pSub
19bd0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
19be0 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
19bf0 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65  ubquery" */.  Se
19c00 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20  lect *pSub1;    
19c10 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
19c20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65  the rightmost se
19c30 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72  lect in sub-quer
19c40 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
19c50 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
19c60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
19c70 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
19c80 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
19c90 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
19ca0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
19cb0 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
19cc0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
19cd0 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
19ce0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
19cf0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
19d00 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
19d10 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
19d20 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
19d30 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
19d40 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
19d50 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
19d60 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
19d70 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
19d80 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
19d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19da0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
19db0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
19dc0 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
19dd0 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
19de0 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
19df0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
19e00 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  db;..  /* Check 
19e10 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
19e20 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
19e30 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
19e40 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  not..  */.  if( 
19e50 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
19e60 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
19e70 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
19e80 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
19e90 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
19ea0 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
19eb0 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
19ec0 5d 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  ];.  pSub = pSub
19ed0 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  item->pSelect;. 
19ee0 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30   assert( pSub!=0
19ef0 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20   );.  if( isAgg 
19f00 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
19f10 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19f30 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20  Restriction (1) 
19f40 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65   */.  if( subque
19f50 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d  ryIsAgg && pSrc-
19f60 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e  >nSrc>1 ) return
19f70 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
19f80 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20  Restriction (2) 
19f90 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20   */.  pSubSrc = 
19fa0 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73  pSub->pSrc;.  as
19fb0 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b  sert( pSubSrc );
19fc0 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76  .  /* Prior to v
19fd0 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68  ersion 3.1.2, wh
19fe0 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
19ff0 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69  SET had to be si
1a000 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a  mple constants,.
1a010 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61    ** not arbitra
1a020 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c  ry expresssions,
1a030 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65   we allowed some
1a040 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49   combining of LI
1a050 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
1a060 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79   ** because they
1a070 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74   could be comput
1a080 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1a090 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49  me.  But when LI
1a0a0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
1a0b0 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74   ** became arbit
1a0c0 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73  rary expressions
1a0d0 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64  , we were forced
1a0e0 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74   to add restrict
1a0f0 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61  ions (13).  ** a
1a100 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66  nd (14). */.  if
1a110 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1a120 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  & p->pLimit ) re
1a130 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1a140 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1a150 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66  ion (13) */.  if
1a160 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20  ( pSub->pOffset 
1a170 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a190 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1a1a0 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66  ion (14) */.  if
1a1b0 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  ( p->pRightmost 
1a1c0 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  && pSub->pLimit 
1a1d0 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
1a1e0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
1a1f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a220 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35   Restriction (15
1a230 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) */.  }.  if( p
1a240 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  SubSrc->nSrc==0 
1a250 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a270 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1a280 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 28   (7)  */.  if( (
1a290 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74  pSub->isDistinct
1a2a0 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   || pSub->pLimit
1a2b0 29 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ) .         && (
1a2c0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
1a2d0 69 73 41 67 67 29 20 29 7b 20 20 20 20 20 20 20  isAgg) ){       
1a2e0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1a2f0 6e 73 20 28 34 29 28 35 29 28 38 29 28 39 29 20  ns (4)(5)(8)(9) 
1a300 2a 2f 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  */.     return 0
1a310 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69  ;       .  }.  i
1a320 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  f( p->isDistinct
1a330 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
1a340 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  g ) return 0;   
1a350 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1a360 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 69  tion (6)  */.  i
1a370 66 28 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f  f( (p->disallowO
1a380 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f 72  rderBy || p->pOr
1a390 64 65 72 42 79 29 20 26 26 20 70 53 75 62 2d 3e  derBy) && pSub->
1a3a0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1a3b0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3e0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1a3f0 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a  ion (11) */.  }.
1a400 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70    if( isAgg && p
1a410 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  Sub->pOrderBy ) 
1a420 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1a430 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1a440 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a  riction (16) */.
1a450 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
1a460 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62  n 3:  If the sub
1a470 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c  query is a join,
1a480 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
1a490 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a  ubquery is .  **
1a4a0 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65   not used as the
1a4b0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
1a4c0 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e  f an outer join.
1a4d0 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68    Examples of wh
1a4e0 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e  y this.  ** is n
1a4f0 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1a500 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1a510 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1a520 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
1a530 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1a540 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1a550 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1a560 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1a570 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1a580 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
1a590 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
1a5a0 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
1a5b0 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
1a5c0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72 63  */.  if( pSubSrc
1a5d0 2d 3e 6e 53 72 63 3e 31 20 26 26 20 28 70 53 75  ->nSrc>1 && (pSu
1a5e0 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bitem->jointype 
1a5f0 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
1a600 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1a610 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
1a620 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68  ction 12:  If th
1a630 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
1a640 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1a650 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a  of a left outer.
1a660 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20    ** join, make 
1a670 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
1a680 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
1a690 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65  lause..  ** An e
1a6a0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
1a6b0 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
1a6c0 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
1a6d0 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
1a6e0 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  TER JOIN (SELECT
1a6f0 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
1a700 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20   t2.x>0).  **.  
1a710 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
1a720 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
1a730 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
1a740 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
1a750 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
1a760 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a  2) WHERE t2.x>0.
1a770 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68    **.  ** But th
1a780 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69  e t2.x>0 test wi
1a790 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f  ll always fail o
1a7a0 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20  n a NULL row of 
1a7b0 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65  t2, which.  ** e
1a7c0 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65  ffectively conve
1a7d0 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f  rts the OUTER JO
1a7e0 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52  IN into an INNER
1a7f0 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66   JOIN..  */.  if
1a800 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69  ( (pSubitem->joi
1a810 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
1a820 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 57  )!=0 && pSub->pW
1a830 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72  here!=0 ){.    r
1a840 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
1a850 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
1a860 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  7: If the sub-qu
1a870 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1a880 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69  d SELECT, then i
1a890 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  t must.  ** use 
1a8a0 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41  only the UNION A
1a8b0 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64  LL operator. And
1a8c0 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d   none of the sim
1a8d0 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69  ple select queri
1a8e0 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b  es.  ** that mak
1a8f0 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e  e up the compoun
1a900 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c  d SELECT are all
1a910 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65  owed to be aggre
1a920 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74  gate or distinct
1a930 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
1a940 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1a950 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
1a960 28 20 70 2d 3e 70 50 72 69 6f 72 20 7c 7c 20 69  ( p->pPrior || i
1a970 73 41 67 67 20 7c 7c 20 70 2d 3e 69 73 44 69 73  sAgg || p->isDis
1a980 74 69 6e 63 74 20 7c 7c 20 70 53 72 63 2d 3e 6e  tinct || pSrc->n
1a990 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  Src!=1 ){.      
1a9a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1a9b0 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53      for(pSub1=pS
1a9c0 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31  ub; pSub1; pSub1
1a9d0 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b  =pSub1->pPrior){
1a9e0 0a 20 20 20 20 20 20 69 66 28 20 70 53 75 62 31  .      if( pSub1
1a9f0 2d 3e 69 73 41 67 67 20 7c 7c 20 70 53 75 62 31  ->isAgg || pSub1
1aa00 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 0a 20 20  ->isDistinct .  
1aa10 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e       || (pSub1->
1aa20 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d  pPrior && pSub1-
1aa30 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a  >op!=TK_ALL) ){.
1aa40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1aa50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1aa60 20 20 7d 0a 0a 20 20 70 50 61 72 73 65 2d 3e 7a    }..  pParse->z
1aa70 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53  AuthContext = pS
1aa80 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  ubitem->zName;. 
1aa90 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1aaa0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1aab0 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
1aac0 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  );.  pParse->zAu
1aad0 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
1aae0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  edAuthContext;..
1aaf0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
1ab00 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1ab10 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
1ab20 6d 65 6e 74 2c 20 74 68 65 6e 20 69 74 20 6d 75  ment, then it mu
1ab30 73 74 20 62 65 0a 20 20 2a 2a 20 61 20 55 4e 49  st be.  ** a UNI
1ab40 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70  ON ALL and the p
1ab50 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74  arent query must
1ab60 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
1ab70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1ab80 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
1ab90 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
1aba0 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
1abb0 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
1abc0 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
1abd0 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
1abe0 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
1abf0 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
1ac00 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 20  .  ** creates N 
1ac10 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
1ac20 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f  rent query witho
1ac30 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  ut any ORDER BY,
1ac40 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20   LIMIT or .  ** 
1ac50 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61  OFFSET clauses a
1ac60 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f  nd joins them to
1ac70 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73   the left-hand-s
1ac80 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ide of the origi
1ac90 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55  nal.  ** using U
1aca0 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
1acb0 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
1acc0 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
1acd0 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20   of simple.  ** 
1ace0 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
1acf0 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s in the compoun
1ad00 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a  d sub-query..  *
1ad10 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75  /.  for(pSub=pSu
1ad20 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b  b->pPrior; pSub;
1ad30 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
1ad40 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  or){.    Select 
1ad50 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c  *pNew;.    ExprL
1ad60 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
1ad70 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
1ad80 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20   Expr *pLimit = 
1ad90 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45  p->pLimit;.    E
1ada0 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20 70  xpr *pOffset = p
1adb0 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 53  ->pOffset;.    S
1adc0 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20  elect *pPrior = 
1add0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  p->pPrior;.    p
1ade0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
1adf0 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b      p->pSrc = 0;
1ae00 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
1ae10 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69   0;.    p->pLimi
1ae20 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20  t = 0;.    pNew 
1ae30 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
1ae40 75 70 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  up(db, p);.    p
1ae50 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50  New->pPrior = pP
1ae60 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72  rior;.    p->pPr
1ae70 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ior = pNew;.    
1ae80 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
1ae90 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 6f  rderBy;.    p->o
1aea0 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20  p = TK_ALL;.    
1aeb0 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
1aec0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
1aed0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70  pLimit;.    p->p
1aee0 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
1aef0 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d  ;.    p->pRightm
1af00 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  ost = 0;.    pNe
1af10 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  w->pRightmost = 
1af20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
1af30 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
1af40 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c  int, it means fl
1af50 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
1af60 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20  itted for the.  
1af70 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  ** iFrom-th entr
1af80 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
1af90 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65  ause in the oute
1afa0 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
1afb0 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
1afc0 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1afd0 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
1afe0 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
1aff0 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70  .  for(pParent=p
1b000 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65  ; pParent; pPare
1b010 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69  nt=pParent->pPri
1b020 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  or, pSub=pSub->p
1b030 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20  Prior){.    int 
1b040 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
1b050 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74  c->nSrc;.    int
1b060 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
1b070 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75     pSubSrc = pSu
1b080 62 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 53 72  b->pSrc;.    pSr
1b090 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  c = pParent->pSr
1b0a0 63 3b 0a 0a 20 20 20 20 2f 2a 20 4d 6f 76 65 20  c;..    /* Move 
1b0b0 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
1b0c0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
1b0d0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
1b0e0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 46 52 4f  e.    ** the FRO
1b0f0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1b100 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
1b110 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
1b120 20 72 65 6d 65 6d 62 65 72 0a 20 20 20 20 2a 2a   remember.    **
1b130 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
1b140 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69  er for the origi
1b150 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20  nal outer query 
1b160 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a  FROM element in.
1b170 20 20 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20      ** iParent. 
1b180 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
1b190 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
1b1a0 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
1b1b0 65 6e 74 20 63 6f 64 65 0a 20 20 20 20 2a 2a 20  ent code.    ** 
1b1c0 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73  will scan expres
1b1d0 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f  sions looking fo
1b1e0 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65  r iParent refere
1b1f0 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65  nces and replace
1b200 0a 20 20 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  .    ** those re
1b210 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
1b220 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
1b230 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
1b240 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 20 20  bquery FROM.    
1b250 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61  ** elements we a
1b260 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69  re now copying i
1b270 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1b280 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ( pSrc ){.      
1b290 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63  pSubitem = &pSrc
1b2a0 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  ->a[iFrom];.    
1b2b0 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62    nSubSrc = pSub
1b2c0 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 20  Src->nSrc;.     
1b2d0 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62   jointype = pSub
1b2e0 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  item->jointype;.
1b2f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
1b300 65 74 65 54 61 62 6c 65 28 70 53 75 62 69 74 65  eteTable(pSubite
1b310 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20  m->pTab);.      
1b320 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 75  sqlite3_free(pSu
1b330 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
1b340 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b350 5f 66 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  _free(pSubitem->
1b360 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
1b370 6c 69 74 65 33 5f 66 72 65 65 28 70 53 75 62 69  lite3_free(pSubi
1b380 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1b390 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54      pSubitem->pT
1b3a0 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ab = 0;.      pS
1b3b0 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
1b3c0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 75  e = 0;.      pSu
1b3d0 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30  bitem->zName = 0
1b3e0 3b 0a 20 20 20 20 20 20 70 53 75 62 69 74 65 6d  ;.      pSubitem
1b3f0 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
1b400 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 75 62    }.    if( nSub
1b410 53 72 63 21 3d 31 20 7c 7c 20 21 70 53 72 63 20  Src!=1 || !pSrc 
1b420 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 74  ){.      int ext
1b430 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20 31  ra = nSubSrc - 1
1b440 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 28 70  ;.      for(i=(p
1b450 53 72 63 3f 31 3a 30 29 3b 20 69 3c 6e 53 75 62  Src?1:0); i<nSub
1b460 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
1b470 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65     pSrc = sqlite
1b480 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64  3SrcListAppend(d
1b490 62 2c 20 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a  b, pSrc, 0, 0);.
1b4a0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 72 63          if( pSrc
1b4b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1b4c0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
1b4d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   0;.          re
1b4e0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
1b4f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1b500 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1b510 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28  pSrc;.      for(
1b520 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
1b530 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20  i-extra>=iFrom; 
1b540 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i--){.        pS
1b550 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d  rc->a[i] = pSrc-
1b560 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20  >a[i-extra];.   
1b570 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
1b580 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
1b590 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  c; i++){.      p
1b5a0 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
1b5b0 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
1b5c0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
1b5d0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c  SubSrc->a[i], 0,
1b5e0 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d   sizeof(pSubSrc-
1b5f0 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  >a[i]));.    }. 
1b600 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d     pSrc->a[iFrom
1b610 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  ].jointype = joi
1b620 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
1b630 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
1b640 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
1b650 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
1b660 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
1b670 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
1b680 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
1b690 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1b6a0 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
1b6b0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1b6c0 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
1b6d0 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
1b6e0 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
1b6f0 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
1b700 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
1b710 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1b730 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
1b740 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
1b750 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
1b760 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
1b770 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
1b780 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
1b790 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1b7a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
1b7b0 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
1b7c0 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
1b7d0 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
1b7e0 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
1b7f0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
1b800 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
1b810 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
1b820 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
1b830 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
1b840 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
1b850 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20     */.    pList 
1b860 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  = pParent->pELis
1b870 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
1b880 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1b890 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
1b8a0 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69   *pExpr;.      i
1b8b0 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
1b8c0 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70  Name==0 && (pExp
1b8d0 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
1b8e0 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d  pExpr)->span.z!=
1b8f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  0 ){.        pLi
1b900 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
1b910 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1b920 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
1b930 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 45 78  p(db, (char*)pEx
1b940 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70  pr->span.z, pExp
1b950 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  r->span.n);.    
1b960 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75    }.    }.    su
1b970 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1b980 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c  pParent->pEList,
1b990 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1b9a0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
1b9b0 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20   isAgg ){.      
1b9c0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1b9d0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75  , pParent->pGrou
1b9e0 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  pBy, iParent, pS
1b9f0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1ba00 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
1ba10 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1ba20 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
1ba30 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
1ba40 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1ba50 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1ba60 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1ba70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
1ba80 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1ba90 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
1baa0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
1bab0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1bac0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
1bad0 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  f( pParent->pOrd
1bae0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 75  erBy ){.      su
1baf0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1bb00 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1bb10 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
1bb20 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
1bb30 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1bb40 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70  Where ){.      p
1bb50 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
1bb60 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
1bb70 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65  >pWhere);.    }e
1bb80 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72  lse{.      pWher
1bb90 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
1bba0 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
1bbb0 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gg ){.      asse
1bbc0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  rt( pParent->pHa
1bbd0 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ving==0 );.     
1bbe0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1bbf0 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  g = pParent->pWh
1bc00 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
1bc10 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  nt->pWhere = pWh
1bc20 65 72 65 3b 0a 20 20 20 20 20 20 73 75 62 73 74  ere;.      subst
1bc30 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1bc40 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
1bc50 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1bc60 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1bc70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
1bc80 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
1bc90 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
1bca0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1bcd0 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61  up(db, pSub->pHa
1bce0 76 69 6e 67 29 29 3b 0a 20 20 20 20 20 20 61 73  ving));.      as
1bcf0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1bd00 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
1bd10 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72      pParent->pGr
1bd20 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
1bd30 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
1bd40 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  Sub->pGroupBy);.
1bd50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bd60 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1bd70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20  Parent->pWhere, 
1bd80 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1bd90 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  EList);.      pP
1bda0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
1bdb0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
1bdc0 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  b, pParent->pWhe
1bdd0 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20  re, pWhere);.   
1bde0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65   }.  .    /* The
1bdf0 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
1be00 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
1be10 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
1be20 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
1be30 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
1be40 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a  stinct. .    */.
1be50 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 69 73 44      pParent->isD
1be60 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 65 6e  istinct = pParen
1be70 74 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c  t->isDistinct ||
1be80 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63   pSub->isDistinc
1be90 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20  t;.  .    /*.   
1bea0 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46   ** SELECT ... F
1beb0 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
1bec0 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62  LIMIT a OFFSET b
1bed0 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54  ) LIMIT x OFFSET
1bee0 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   y;.    **.    *
1bef0 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64  * One is tempted
1bf00 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61   to try to add a
1bf10 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e   and b to combin
1bf20 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42  e the limits.  B
1bf30 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64  ut this.    ** d
1bf40 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20  oes not work if 
1bf50 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20  either limit is 
1bf60 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f  negative..    */
1bf70 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1bf80 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70  Limit ){.      p
1bf90 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d  Parent->pLimit =
1bfa0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20   pSub->pLimit;. 
1bfb0 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69       pSub->pLimi
1bfc0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
1bfd0 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c  ..  /* Finially,
1bfe0 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20   delete what is 
1bff0 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71  left of the subq
1c000 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a  uery and return.
1c010 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20    ** success..  
1c020 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  */.  sqlite3Sele
1c030 63 74 44 65 6c 65 74 65 28 70 53 75 62 31 29 3b  ctDelete(pSub1);
1c040 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
1c050 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1c060 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
1c070 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
1c080 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1c090 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
1c0a0 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69  rgument to see i
1c0b0 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69 6e  f it.** is a min
1c0c0 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
1c0d0 79 2e 20 52 65 74 75 72 6e 20 57 48 45 52 45 5f  y. Return WHERE_
1c0e0 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57  ORDERBY_MIN or W
1c0f0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1c100 20 69 66 20 0a 2a 2a 20 69 74 20 69 73 2c 20 6f   if .** it is, o
1c110 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 41  r 0 otherwise. A
1c120 74 20 70 72 65 73 65 6e 74 2c 20 61 20 71 75 65  t present, a que
1c130 72 79 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ry is considered
1c140 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d 69 6e 28   to be.** a min(
1c150 29 2f 6d 61 78 28 29 20 71 75 65 72 79 20 69 66  )/max() query if
1c160 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65  :.**.**   1. The
1c170 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 6f  re is a single o
1c180 62 6a 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f  bject in the FRO
1c190 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
1c1a0 20 20 32 2e 20 54 68 65 72 65 20 69 73 20 61 20    2. There is a 
1c1b0 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73 69 6f  single expressio
1c1c0 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
1c1d0 73 65 74 2c 20 61 6e 64 20 69 74 20 69 73 0a 2a  set, and it is.*
1c1e0 2a 20 20 20 20 20 20 65 69 74 68 65 72 20 6d 69  *      either mi
1c1f0 6e 28 78 29 20 6f 72 20 6d 61 78 28 78 29 2c 20  n(x) or max(x), 
1c200 77 68 65 72 65 20 78 20 69 73 20 61 20 63 6f 6c  where x is a col
1c210 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  umn reference..*
1c220 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 69 6e  /.static int min
1c230 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20 2a  MaxQuery(Parse *
1c240 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
1c250 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  p){.  Expr *pExp
1c260 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r;.  ExprList *p
1c270 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
1c280 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74  t;..  if( pEList
1c290 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
1c2a0 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
1c2b0 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45 78 70  Y_NORMAL;.  pExp
1c2c0 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  r = pEList->a[0]
1c2d0 2e 70 45 78 70 72 3b 0a 20 20 70 45 4c 69 73 74  .pExpr;.  pEList
1c2e0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
1c2f0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
1c300 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
1c310 4e 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30 20 7c  N || pEList==0 |
1c320 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  | pEList->nExpr!
1c330 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
1c340 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30   if( pEList->a[0
1c350 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ].pExpr->op!=TK_
1c360 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  AGG_COLUMN ) ret
1c370 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
1c380 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66 28 20  Y_NORMAL;.  if( 
1c390 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  pExpr->token.n!=
1c3a0 33 20 29 20 72 65 74 75 72 6e 20 57 48 45 52 45  3 ) return WHERE
1c3b0 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
1c3c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
1c3d0 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45  rNICmp((char*)pE
1c3e0 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69  xpr->token.z,"mi
1c3f0 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  n",3)==0 ){.    
1c400 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  return WHERE_ORD
1c410 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73  ERBY_MIN;.  }els
1c420 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
1c430 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78  NICmp((char*)pEx
1c440 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78  pr->token.z,"max
1c450 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ",3)==0 ){.    r
1c460 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
1c470 52 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72  RBY_MAX;.  }.  r
1c480 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
1c490 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f  RBY_NORMAL;.}../
1c4a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c4b0 65 20 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e  e resolves any n
1c4c0 61 6d 65 73 20 75 73 65 64 20 69 6e 20 74 68 65  ames used in the
1c4d0 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
1c4e0 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53  he.** supplied S
1c4f0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1c500 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   If the SELECT s
1c510 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72  tatement being r
1c520 65 73 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20  esolved.** is a 
1c530 73 75 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e  sub-select, then
1c540 20 70 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70   pOuterNC is a p
1c550 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61  ointer to the Na
1c560 6d 65 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66  meContext .** of
1c570 20 74 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45   the parent SELE
1c580 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CT..*/.int sqlit
1c590 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
1c5a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1c5b0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
1c5c0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
1c5d0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c5f0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1c600 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
1c610 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
1c620 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
1c630 54 68 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63  The outer name c
1c640 6f 6e 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e  ontext. May be N
1c650 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ULL. */.){.  Exp
1c660 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
1c670 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1c680 74 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20  t set. */.  int 
1c690 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1c6a0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f         /* For-lo
1c6b0 6f 70 20 76 61 72 69 61 62 6c 65 20 75 73 65 64  op variable used
1c6c0 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
1c6d0 63 65 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ces */.  NameCon
1c6e0 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
1c6f0 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d      /* Local nam
1c700 65 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  e-context */.  E
1c710 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
1c720 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  y;        /* The
1c730 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
1c740 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
1c750 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75  s routine has ru
1c760 6e 20 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e  n before, return
1c770 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f   immediately. */
1c780 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f  .  if( p->isReso
1c790 6c 76 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  lved ){.    asse
1c7a0 72 74 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b  rt( !pOuterNC );
1c7b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1c7c0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  TE_OK;.  }.  p->
1c7d0 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a  isResolved = 1;.
1c7e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68  .  /* If there h
1c7f0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
1c800 20 65 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68   errors, do noth
1c810 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  ing. */.  if( pP
1c820 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a  arse->nErr>0 ){.
1c830 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c840 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
1c850 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 73  /* Prepare the s
1c860 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e  elect statement.
1c870 20 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20   This call will 
1c880 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72  allocate all cur
1c890 73 6f 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72  sors.  ** requir
1c8a0 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
1c8b0 20 74 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71   tables and subq
1c8c0 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
1c8d0 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  OM clause..  */.
1c8e0 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74    if( prepSelect
1c8f0 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20  Stmt(pParse, p) 
1c900 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1c910 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1c920 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68  .  /* Resolve th
1c930 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
1c940 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
1c950 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54  FFSET clauses. T
1c960 68 65 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  hese.  ** are no
1c970 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66  t allowed to ref
1c980 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c  er to any names,
1c990 20 73 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74   so pass an empt
1c9a0 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20  y NameContext.. 
1c9b0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e   */.  memset(&sN
1c9c0 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
1c9d0 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  ));.  sNC.pParse
1c9e0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28   = pParse;.  if(
1c9f0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
1ca00 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
1ca10 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20  ->pLimit) ||.   
1ca20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65     sqlite3ExprRe
1ca30 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
1ca40 20 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a   p->pOffset) ){.
1ca50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ca60 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
1ca70 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f  /* Set up the lo
1ca80 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  cal name-context
1ca90 20 74 6f 20 70 61 73 73 20 74 6f 20 45 78 70 72   to pass to Expr
1caa0 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74  ResolveNames() t
1cab0 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74  o.  ** resolve t
1cac0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  he expression-li
1cad0 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61  st..  */.  sNC.a
1cae0 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 73  llowAgg = 1;.  s
1caf0 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d  NC.pSrcList = p-
1cb00 3e 70 53 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65  >pSrc;.  sNC.pNe
1cb10 78 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a  xt = pOuterNC;..
1cb20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d    /* Resolve nam
1cb30 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  es in the result
1cb40 20 73 65 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73   set. */.  pELis
1cb50 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
1cb60 20 69 66 28 20 21 70 45 4c 69 73 74 20 29 20 72   if( !pEList ) r
1cb70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1cb80 4f 52 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  OR;.  for(i=0; i
1cb90 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
1cba0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
1cbb0 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  pX = pEList->a[i
1cbc0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
1cbd0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
1cbe0 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
1cbf0 58 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  X) ){.      retu
1cc00 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1cc10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1cc20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1cc30 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1cc40 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  ions in the resu
1cc50 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47  lt-set, and no G
1cc60 52 4f 55 50 20 42 59 20 0a 20 20 2a 2a 20 65 78  ROUP BY .  ** ex
1cc70 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74  pression, do not
1cc80 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65   allow aggregate
1cc90 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20  s in any of the 
1cca0 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
1ccb0 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
1ccc0 28 20 21 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20  ( !p->isAgg );. 
1ccd0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
1cce0 47 72 6f 75 70 42 79 3b 0a 20 20 69 66 28 20 70  GroupBy;.  if( p
1ccf0 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68  GroupBy || sNC.h
1cd00 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e  asAgg ){.    p->
1cd10 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c  isAgg = 1;.  }el
1cd20 73 65 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f  se{.    sNC.allo
1cd30 77 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  wAgg = 0;.  }.. 
1cd40 20 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20   /* If a HAVING 
1cd50 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e  clause is presen
1cd60 74 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  t, then there mu
1cd70 73 74 20 62 65 20 61 20 47 52 4f 55 50 20 42 59  st be a GROUP BY
1cd80 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
1cd90 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26  if( p->pHaving &
1cda0 26 20 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  & !pGroupBy ){. 
1cdb0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1cdc0 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52  sg(pParse, "a GR
1cdd0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
1cde0 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
1cdf0 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72   HAVING");.    r
1ce00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1ce10 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  OR;.  }..  /* Ad
1ce20 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
1ce30 20 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d   list to the nam
1ce40 65 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65  e-context before
1ce50 20 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a   parsing the.  *
1ce60 2a 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  * other expressi
1ce70 6f 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ons in the SELEC
1ce80 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  T statement. Thi
1ce90 73 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a  s is so that.  *
1cea0 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
1ceb0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1cec0 65 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66  e (etc.) can ref
1ced0 65 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e  er to expression
1cee0 73 20 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65  s by.  ** aliase
1cef0 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
1cf00 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  set..  **.  ** M
1cf10 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74  inor point: If t
1cf20 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
1cf30 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
1cf40 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a  sion will be.  *
1cf50 2a 20 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66  * re-evaluated f
1cf60 6f 72 20 65 61 63 68 20 72 65 66 65 72 65 6e 63  or each referenc
1cf70 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  e to it..  */.  
1cf80 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e  sNC.pEList = p->
1cf90 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71  pEList;.  if( sq
1cfa0 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
1cfb0 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
1cfc0 57 68 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 73  Where) ||.     s
1cfd0 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
1cfe0 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
1cff0 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
1d000 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1d010 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ROR;.  }.  if( p
1d020 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
1d030 20 20 20 69 66 28 20 70 72 6f 63 65 73 73 4f 72     if( processOr
1d040 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1d050 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
1d060 79 2c 20 31 2c 20 26 73 4e 43 2e 68 61 73 41 67  y, 1, &sNC.hasAg
1d070 67 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  g) ){.      retu
1d080 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1d090 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1d0a0 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
1d0b0 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
1d0c0 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 26 73 4e  pGroupBy, 0, &sN
1d0d0 43 2e 68 61 73 41 67 67 29 20 29 7b 0a 20 20 20  C.hasAgg) ){.   
1d0e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1d0f0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1d100 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1d110 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1d120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1d130 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
1d140 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 47 52  Make sure the GR
1d150 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f  OUP BY clause do
1d160 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
1d170 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1d180 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
1d190 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
1d1a0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1d1b0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20  tem *pItem;.  . 
1d1c0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
1d1d0 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69  m=pGroupBy->a; i
1d1e0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
1d1f0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1d200 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
1d210 61 73 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d  asProperty(pItem
1d220 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29  ->pExpr, EP_Agg)
1d230 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1d240 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1d250 73 65 2c 20 22 61 67 67 72 65 67 61 74 65 20 66  se, "aggregate f
1d260 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  unctions are not
1d270 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20   allowed in ".  
1d280 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 47            "the G
1d290 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 22 29  ROUP BY clause")
1d2a0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1d2b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1d2c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d2d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1d2e0 73 20 6f 6e 65 20 53 45 4c 45 43 54 20 6f 66 20  s one SELECT of 
1d2f0 61 20 63 6f 6d 70 6f 75 6e 64 2c 20 62 65 20 73  a compound, be s
1d300 75 72 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 6e  ure to resolve n
1d310 61 6d 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ames.  ** in the
1d320 20 6f 74 68 65 72 20 53 45 4c 45 43 54 73 2e 0a   other SELECTs..
1d330 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50    */.  if( p->pP
1d340 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rior ){.    retu
1d350 72 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  rn sqlite3Select
1d360 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
1d370 70 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 75 74 65  p->pPrior, pOute
1d380 72 4e 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rNC);.  }else{. 
1d390 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d3a0 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
1d3b0 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
1d3c0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
1d3d0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67  r..**.** The agg
1d3e0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
1d3f0 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d  or is a set of m
1d400 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74  emory cells that
1d410 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65   hold.** interme
1d420 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68  diate results wh
1d430 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  ile calculating 
1d440 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
1d450 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73  his.** routine s
1d460 69 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c  imply stores NUL
1d470 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f  Ls in all of tho
1d480 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e  se memory cells.
1d490 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d4a0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
1d4b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d4c0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1d4d0 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
1d4e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1d4f0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1d500 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
1d510 46 75 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67  Func;.  if( pAgg
1d520 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67  Info->nFunc+pAgg
1d530 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30  Info->nColumn==0
1d540 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1d550 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1d560 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
1d570 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  mn; i++){.    sq
1d580 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d590 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
1d5a0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
1d5b0 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f  .iMem);.  }.  fo
1d5c0 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f  r(pFunc=pAggInfo
1d5d0 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c  ->aFunc, i=0; i<
1d5e0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1d5f0 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a   i++, pFunc++){.
1d600 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d610 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1d620 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d  , 0, pFunc->iMem
1d630 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  );.    if( pFunc
1d640 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
1d650 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
1d660 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
1d670 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70  .      if( pE->p
1d680 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  List==0 || pE->p
1d690 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
1d6a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d6b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1d6c0 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e 20 61  , "DISTINCT in a
1d6d0 67 67 72 65 67 61 74 65 20 6d 75 73 74 20 62 65  ggregate must be
1d6e0 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20 20   followed ".    
1d6f0 20 20 20 20 20 20 20 22 62 79 20 61 6e 20 65 78         "by an ex
1d700 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20  pression");.    
1d710 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74      pFunc->iDist
1d720 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
1d730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d740 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1d750 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
1d760 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1d770 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pE->pList);.    
1d780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d790 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
1d7a0 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63  Ephemeral, pFunc
1d7b0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20  ->iDistinct, 0, 
1d7c0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1d7e0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
1d7f0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
1d800 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1d810 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
1d820 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46  voke the OP_AggF
1d830 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66  inalize opcode f
1d840 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61  or every aggrega
1d850 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  te function.** i
1d860 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  n the AggInfo st
1d870 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
1d880 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65  ic void finalize
1d890 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72  AggFunctions(Par
1d8a0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
1d8b0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
1d8c0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1d8d0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1d8e0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
1d8f0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
1d900 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
1d910 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
1d920 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1d930 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
1d940 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1d950 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c   = pF->pExpr->pL
1d960 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ist;.    sqlite3
1d970 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1d980 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
1d990 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
1d9a0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30  st->nExpr : 0, 0
1d9b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d9c0 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
1d9d0 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
1d9e0 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  CDEF);.  }.}../*
1d9f0 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61  .** Update the a
1da00 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72  ccumulator memor
1da10 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61  y cells for an a
1da20 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f  ggregate based o
1da30 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
1da40 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
1da50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1da60 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
1da70 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
1da80 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
1da90 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
1daa0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1dab0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1dac0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
1dad0 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67  *pF;.  struct Ag
1dae0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a  gInfo_col *pC;..
1daf0 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
1db00 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f  ctMode = 1;.  fo
1db10 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
1db20 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
1db30 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
1db40 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e  +, pF++){.    in
1db50 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  t nArg;.    int 
1db60 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20  addrNext = 0;.  
1db70 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20    int regAgg;.  
1db80 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1db90 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70  t = pF->pExpr->p
1dba0 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  List;.    if( pL
1dbb0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72  ist ){.      nAr
1dbc0 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  g = pList->nExpr
1dbd0 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
1dbe0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1dbf0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72  ange(pParse, nAr
1dc00 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1dc10 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
1dc20 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  t(pParse, pList,
1dc30 20 72 65 67 41 67 67 2c 20 30 29 3b 0a 20 20 20   regAgg, 0);.   
1dc40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
1dc50 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  rg = 0;.      re
1dc60 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  gAgg = 0;.    }.
1dc70 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
1dc80 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
1dc90 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
1dca0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1dcb0 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  l(v);.      asse
1dcc0 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
1dcd0 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
1dce0 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44  t(pParse, pF->iD
1dcf0 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78  istinct, addrNex
1dd00 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20  t, 1, regAgg);. 
1dd10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
1dd20 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c  >pFunc->needColl
1dd30 53 65 71 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  Seq ){.      Col
1dd40 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
1dd50 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
1dd60 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1dd70 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  em;.      int j;
1dd80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1dd90 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70  List!=0 );  /* p
1dda0 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70  List!=0 if pF->p
1ddb0 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65  Func->needCollSe
1ddc0 71 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 20  q is true */.   
1ddd0 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
1dde0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f  m=pList->a; !pCo
1ddf0 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b  ll && j<nArg; j+
1de00 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1de10 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1de20 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1de30 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
1de40 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
1de50 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
1de60 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
1de70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
1de80 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
1de90 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1dea0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1deb0 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30  CollSeq, 0, 0, 0
1dec0 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
1ded0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
1dee0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1def0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1df00 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41  AggStep, 0, regA
1df10 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20  gg, pF->iMem,.  
1df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df30 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
1df40 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
1df50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1df60 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 6e 41  beChangeP5(v, nA
1df70 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
1df80 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1df90 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
1dfa0 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
1dfb0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1dfc0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1dfd0 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
1dfe0 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65  ;.    if( addrNe
1dff0 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  xt ){.      sqli
1e000 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1e010 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29  bel(v, addrNext)
1e020 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
1e030 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
1e040 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
1e050 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
1e060 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
1e070 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e080 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
1e090 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
1e0a0 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
1e0b0 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
1e0c0 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a  ;.}..#if 0./*.**
1e0d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1e0e0 73 20 75 73 65 64 20 77 68 65 6e 20 61 20 53 45  s used when a SE
1e0f0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
1e100 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  s used to create
1e110 20 61 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20   a.** temporary 
1e120 74 61 62 6c 65 20 66 6f 72 20 69 74 65 72 61 74  table for iterat
1e130 69 6e 67 20 74 68 72 6f 75 67 68 20 77 68 65 6e  ing through when
1e140 20 72 75 6e 6e 69 6e 67 20 61 6e 20 49 4e 53 54   running an INST
1e150 45 41 44 20 4f 46 0a 2a 2a 20 55 50 44 41 54 45  EAD OF.** UPDATE
1e160 20 6f 72 20 49 4e 53 54 45 41 44 20 4f 46 20 44   or INSTEAD OF D
1e170 45 4c 45 54 45 20 74 72 69 67 67 65 72 2e 20 0a  ELETE trigger. .
1e180 2a 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c  **.** If possibl
1e190 65 2c 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  e, the SELECT st
1e1a0 61 74 65 6d 65 6e 74 20 69 73 20 6d 6f 64 69 66  atement is modif
1e1b0 69 65 64 20 73 6f 20 74 68 61 74 20 4e 55 4c 4c  ied so that NULL
1e1c0 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 73   values.** are s
1e1d0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 74 65 6d  tored in the tem
1e1e0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 66 6f 72  porary table for
1e1f0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 6f 72   all columns for
1e200 20 77 68 69 63 68 20 74 68 65 20 0a 2a 2a 20 63   which the .** c
1e210 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
1e220 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73   in argument mas
1e230 6b 20 69 73 20 6e 6f 74 20 73 65 74 2e 20 49 66  k is not set. If
1e240 20 6d 61 73 6b 20 74 61 6b 65 73 20 74 68 65 0a   mask takes the.
1e250 2a 2a 20 73 70 65 63 69 61 6c 20 76 61 6c 75 65  ** special value
1e260 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
1e270 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 61 72  n all columns ar
1e280 65 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2f 0a  e populated..*/.
1e290 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1e2a0 63 74 4d 61 73 6b 28 50 61 72 73 65 20 2a 70 50  ctMask(Parse *pP
1e2b0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
1e2c0 20 75 33 32 20 6d 61 73 6b 29 7b 0a 20 20 69 66   u32 mask){.  if
1e2d0 28 20 70 20 26 26 20 21 70 2d 3e 70 50 72 69 6f  ( p && !p->pPrio
1e2e0 72 20 26 26 20 21 70 2d 3e 69 73 44 69 73 74 69  r && !p->isDisti
1e2f0 6e 63 74 20 26 26 20 6d 61 73 6b 21 3d 30 78 66  nct && mask!=0xf
1e300 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 45  fffffff ){.    E
1e310 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
1e320 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1e330 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
1e340 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c 20  olve(pParse, p, 
1e350 30 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d  0);.    pEList =
1e360 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20   p->pEList;.    
1e370 66 6f 72 28 69 3d 30 3b 20 70 45 4c 69 73 74 20  for(i=0; pEList 
1e380 26 26 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  && i<pEList->nEx
1e390 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29  pr && i<32; i++)
1e3a0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 28 6d 61  {.      if( !(ma
1e3b0 73 6b 26 28 28 75 33 32 29 31 3c 3c 69 29 29 20  sk&((u32)1<<i)) 
1e3c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e3d0 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 4c  e3ExprDelete(pEL
1e3e0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
1e3f0 3b 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74  ;.        pEList
1e400 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
1e410 71 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73  qlite3Expr(pPars
1e420 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  e->db, TK_NULL, 
1e430 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
1e440 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  }.    }.  }.}.#e
1e450 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
1e460 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
1e470 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73  e given SELECT s
1e480 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
1e490 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
1e4a0 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76  distributed in v
1e4b0 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65  arious ways depe
1e4c0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
1e4d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1e4e0 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
1e4f0 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
1e500 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73  by argument pDes
1e510 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t.** as follows:
1e520 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74  .**.**     pDest
1e530 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73 75 6c  ->eDest    Resul
1e540 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  t.**     -------
1e550 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
1e560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e580 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ----.**     SRT_
1e590 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f  Callback    Invo
1e5a0 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ke the callback 
1e5b0 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
1e5c0 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
1e5d0 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20  *     SRT_Mem   
1e5e0 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72 73        Store firs
1e5f0 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f  t result in memo
1e600 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69  ry cell pDest->i
1e610 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
1e620 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20 53  RT_Set         S
1e630 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
1e640 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20 70 44  keys of table pD
1e650 65 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20  est->iParm. .** 
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e670 20 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66      Apply the af
1e680 66 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66  finity pDest->af
1e690 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74  finity before st
1e6a0 6f 72 69 6e 67 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  oring them..**.*
1e6b0 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20  *     SRT_Union 
1e6c0 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
1e6d0 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20  lts as a key in 
1e6e0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
1e6f0 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  e pDest->iParm..
1e700 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
1e710 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65  cept      Remove
1e720 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68   results from th
1e730 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1e740 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  e pDest->iParm..
1e750 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61  **.**     SRT_Ta
1e760 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20  ble       Store 
1e770 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f  results in tempo
1e780 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
1e790 2d 3e 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  ->iParm.**.**   
1e7a0 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20    SRT_EphemTab  
1e7b0 20 20 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70    Create an temp
1e7c0 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73  orary table pDes
1e7d0 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20 73 74 6f  t->iParm and sto
1e7e0 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  re.**           
1e7f0 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65            the re
1e800 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68 65 20  sult there. The 
1e810 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 6f  cursor is left o
1e820 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20 20  pen after.**    
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e840 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
1e850 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74  *     SRT_Corout
1e860 69 6e 65 20 20 20 49 6e 76 6f 6b 65 20 61 20 63  ine   Invoke a c
1e870 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 63 6f 6d  o-routine to com
1e880 70 75 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  pute a single ro
1e890 77 20 6f 66 20 0a 2a 2a 20 20 20 20 20 20 20 20  w of .**        
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
1e8b0 20 72 65 73 75 6c 74 0a 2a 2a 0a 2a 2a 20 20 20   result.**.**   
1e8c0 20 20 53 52 54 5f 45 78 69 73 74 73 20 20 20 20    SRT_Exists    
1e8d0 20 20 53 74 6f 72 65 20 61 20 31 20 69 6e 20 6d    Store a 1 in m
1e8e0 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74  emory cell pDest
1e8f0 2d 3e 69 50 61 72 6d 20 69 66 20 74 68 65 20 72  ->iParm if the r
1e900 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  esult.**        
1e910 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
1e920 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a   is not empty..*
1e930 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44 69 73  *.**     SRT_Dis
1e940 63 61 72 64 20 20 20 20 20 54 68 72 6f 77 20 74  card     Throw t
1e950 68 65 20 72 65 73 75 6c 74 73 20 61 77 61 79 2e  he results away.
1e960 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73  .**.** See the s
1e970 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29  electInnerLoop()
1e980 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 20   function for a 
1e990 63 61 6e 6f 6e 69 63 61 6c 20 6c 69 73 74 69 6e  canonical listin
1e9a0 67 20 6f 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c  g of the .** all
1e9b0 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65  owed values of e
1e9c0 44 65 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d  Dest and their m
1e9d0 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  eanings..**.** T
1e9e0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1e9f0 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
1ea00 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
1ea10 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
1ea20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
1ea30 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
1ea40 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1ea50 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
1ea60 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
1ea70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ea80 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
1ea90 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
1eaa0 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
1eab0 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
1eac0 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
1ead0 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20   do that..**.** 
1eae0 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72  The pParent, par
1eaf0 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61  entTab, and *pPa
1eb00 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61  rentAgg fields a
1eb10 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20  re filled in if 
1eb20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69  this.** SELECT i
1eb30 73 20 61 20 73 75 62 71 75 65 72 79 2e 20 20 54  s a subquery.  T
1eb40 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
1eb50 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  try to combine t
1eb60 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69  his SELECT.** wi
1eb70 74 68 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f  th its parent to
1eb80 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66   form a single f
1eb90 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73  lat query.  In s
1eba0 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68  o doing, it migh
1ebb0 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20  t.** change the 
1ebc0 70 61 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f  parent query fro
1ebd0 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  m a non-aggregat
1ebe0 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74  e to an aggregat
1ebf0 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20  e query..** For 
1ec00 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65  that reason, the
1ec10 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67   pParentAgg flag
1ec20 20 69 73 20 70 61 73 73 65 64 20 61 73 20 61 20   is passed as a 
1ec30 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a  pointer, so it.*
1ec40 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64  * can be changed
1ec50 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20  ..**.** Example 
1ec60 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  1:   The meaning
1ec70 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74 20   of the pParent 
1ec80 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
1ec90 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1eca0 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43  M t1 JOIN (SELEC
1ecb0 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52  T x, count(*) FR
1ecc0 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a  OM t2) JOIN t3;.
1ecd0 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20 20  **    \         
1ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
1ecf0 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
1ed00 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f  ______/        /
1ed10 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20  .**     \       
1ed20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed50 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  .**      \______
1ed60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
1ed70 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
1ed80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
1ed90 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1eda0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
1edb0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1edc0 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68   first.   For th
1edd0 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72  at call,.** pPar
1ede0 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ent will be NULL
1edf0 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20 70 72  .  During the pr
1ee00 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20  ocessing of the 
1ee10 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74 68 69  outer query, thi
1ee20 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  s .** routine is
1ee30 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
1ee40 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ely to handle th
1ee50 65 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72  e subquery.  For
1ee60 20 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a   the recursive.*
1ee70 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20  * call, pParent 
1ee80 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68  will point to th
1ee90 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
1eea0 42 65 63 61 75 73 65 20 74 68 65 20 73 75 62 71  Because the subq
1eeb0 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73  uery is.** the s
1eec0 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e  econd element in
1eed0 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
1eee0 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61 62  n, the parentTab
1eef0 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a   parameter will.
1ef00 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e 64  ** be 1 (the 2nd
1ef10 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e   value of a 0-in
1ef20 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f  dexed array.).*/
1ef30 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
1ef40 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
1ef50 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
1ef60 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
1ef70 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
1ef80 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1ef90 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
1efa0 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
1efb0 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ed. */.  SelectD
1efc0 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
1efd0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
1efe0 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73  th the query res
1eff0 75 6c 74 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ults */.  Select
1f000 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20   *pParent,      
1f010 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
1f020 43 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69  CT for which thi
1f030 73 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79  s is a sub-query
1f040 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74   */.  int parent
1f050 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab,         /* 
1f060 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74  Index in pParent
1f070 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71  ->pSrc of this q
1f080 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  uery */.  int *p
1f090 50 61 72 65 6e 74 41 67 67 2c 20 20 20 20 20 20  ParentAgg,      
1f0a0 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72   /* True if pPar
1f0b0 65 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61  ent uses aggrega
1f0c0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
1f0d0 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20    char *aff     
1f0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65           /* If e
1f0f0 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f  Dest is SRT_Unio
1f100 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  n, the affinity 
1f110 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
1f120 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
1f130 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1f140 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
1f150 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
1f160 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
1f170 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
1f180 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
1f190 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1f1a0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
1f1b0 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
1f1c0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1f1d0 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
1f1e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1f1f0 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
1f200 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
1f210 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1f220 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  pEList;      /* 
1f230 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
1f240 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
1f250 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1f260 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
1f270 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
1f280 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
1f290 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
1f2a0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1f2b0 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
1f2c0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
1f2d0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
1f2e0 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
1f2f0 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
1f300 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
1f310 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
1f320 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
1f330 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
1f340 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
1f350 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20  pr *pHaving;    
1f360 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49       /* The HAVI
1f370 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  NG clause.  May 
1f380 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
1f390 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20   isDistinct;    
1f3a0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1f3b0 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
1f3c0 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
1f3d0 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74  /.  int distinct
1f3e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ;          /* Ta
1f3f0 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74  ble to use for t
1f400 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20  he distinct set 
1f410 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
1f420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1f430 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
1f440 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
1f450 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  n */.  int addrS
1f460 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a  ortIndex;     /*
1f470 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f   Address of an O
1f480 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
1f490 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
1f4a0 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66   AggInfo sAggInf
1f4b0 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  o;      /* Infor
1f4c0 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61  mation used by a
1f4d0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
1f4e0 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20   */.  int iEnd; 
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f500 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65  Address of the e
1f510 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  nd of the query 
1f520 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1f530 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
1f540 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1f550 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20  ection */..  db 
1f560 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1f570 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  if( p==0 || db->
1f580 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
1f590 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
1f5a0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1f5b0 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
1f5c0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1f5d0 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
1f5e0 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
1f5f0 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
1f600 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
1f610 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a  of(sAggInfo));..
1f620 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
1f630 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
1f640 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
1f650 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70  (pDest) ){.    p
1f660 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
1f670 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 73 65  .    /* In these
1f680 20 63 61 73 65 73 20 74 68 65 20 44 49 53 54 49   cases the DISTI
1f690 4e 43 54 20 6f 70 65 72 61 74 6f 72 20 6d 61 6b  NCT operator mak
1f6a0 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
1f6b0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   to the.    ** r
1f6c0 65 73 75 6c 74 73 2c 20 73 6f 20 72 65 6d 6f 76  esults, so remov
1f6d0 65 20 69 74 20 69 66 20 69 74 20 77 65 72 65 20  e it if it were 
1f6e0 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
1f6f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65  /.    assert(pDe
1f700 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
1f710 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e  xists || pDest->
1f720 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e  eDest==SRT_Union
1f730 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
1f740 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1f750 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73  T_Except || pDes
1f760 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
1f770 73 63 61 72 64 29 3b 0a 20 20 20 20 70 2d 3e 69  scard);.    p->i
1f780 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  sDistinct = 0;. 
1f790 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1f7a0 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50  SelectResolve(pP
1f7b0 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20  arse, p, 0) ){. 
1f7c0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
1f7d0 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72  nd;.  }.  p->pOr
1f7e0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1f7f0 3b 0a 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f  ;...  /* Make lo
1f800 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68  cal copies of th
1f810 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72  e parameters for
1f820 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a   this query..  *
1f830 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  /.  pTabList = p
1f840 2d 3e 70 53 72 63 3b 0a 20 20 69 73 41 67 67 20  ->pSrc;.  isAgg 
1f850 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 70 45  = p->isAgg;.  pE
1f860 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
1f870 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  ;.  if( pEList==
1f880 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
1f890 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  end;..  /* .  **
1f8a0 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74   Do not even att
1f8b0 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65  empt to generate
1f8c0 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20   any code if we 
1f8d0 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65  have already see
1f8e0 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65  n.  ** errors be
1f8f0 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
1f900 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20  e starts..  */. 
1f910 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1f920 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  r>0 ) goto selec
1f930 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 4f 52 44  t_end;..  /* ORD
1f940 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64  ER BY is ignored
1f950 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e   for some destin
1f960 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
1f970 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
1f980 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
1f990 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
1f9a0 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
1f9b0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
1f9c0 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
1f9d0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1f9e0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
1f9f0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1fa00 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1fa10 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
1fa20 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
1fa30 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
1fa40 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
1fa50 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1fa60 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1fa70 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1fa80 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
1fa90 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
1faa0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1fab0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
1fac0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1fad0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
1fae0 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
1faf0 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
1fb00 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
1fb10 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
1fb20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a    int isAggSub;.
1fb30 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
1fb40 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  = pItem->zName;.
1fb50 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
1fb60 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70   || pItem->isPop
1fb70 75 6c 61 74 65 64 20 29 20 63 6f 6e 74 69 6e 75  ulated ) continu
1fb80 65 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  e;.    if( zName
1fb90 21 3d 30 20 29 7b 20 20 20 2f 2a 20 41 6e 20 73  !=0 ){   /* An s
1fba0 71 6c 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20  ql view */.     
1fbb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
1fbc0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
1fbd0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1fbe0 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61  ntext;.      pPa
1fbf0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1fc00 74 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  t = zName;.     
1fc10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
1fc20 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
1fc30 65 2c 20 70 53 75 62 2c 20 30 29 3b 0a 20 20 20  e, pSub, 0);.   
1fc40 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68     pParse->zAuth
1fc50 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64  Context = zSaved
1fc60 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20  AuthContext;.   
1fc70 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1fc80 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
1fc90 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
1fca0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72    }..    /* Incr
1fcb0 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
1fcc0 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
1fcd0 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
1fce0 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
1fcf0 2a 2a 20 74 72 65 65 20 72 65 66 65 72 65 64 20  ** tree refered 
1fd00 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
1fd10 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
1fd20 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
1fd30 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
1fd40 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
1fd50 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
1fd60 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
1fd70 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
1fd80 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
1fd90 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
1fda0 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
1fdb0 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
1fdc0 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
1fdd0 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
1fde0 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
1fdf0 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
1fe00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
1fe10 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
1fe20 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
1fe30 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
1fe40 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1fe50 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1fe60 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
1fe70 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e  into the parent.
1fe80 20 2a 2f 0a 20 20 20 20 69 73 41 67 67 53 75 62   */.    isAggSub
1fe90 20 3d 20 70 53 75 62 2d 3e 69 73 41 67 67 3b 0a   = pSub->isAgg;.
1fea0 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53      if( flattenS
1feb0 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
1fec0 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41  p, i, isAgg, isA
1fed0 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20  ggSub) ){.      
1fee0 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a  if( isAggSub ){.
1fef0 20 20 20 20 20 20 20 20 70 2d 3e 69 73 41 67 67          p->isAgg
1ff00 20 3d 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20   = isAgg = 1;.  
1ff10 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20      }.      i = 
1ff20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
1ff30 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
1ff40 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
1ff50 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20  , SRT_EphemTab, 
1ff60 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
1ff70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
1ff80 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75  lect(pParse, pSu
1ff90 62 2c 20 26 64 65 73 74 2c 20 70 2c 20 69 2c 20  b, &dest, p, i, 
1ffa0 26 69 73 41 67 67 2c 20 30 29 3b 0a 20 20 20 20  &isAgg, 0);.    
1ffb0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  }.    if( pParse
1ffc0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
1ffd0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1ffe0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
1fff0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  end;.    }.    p
20000 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
20010 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
20020 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20  xprHeight(p);.  
20030 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
20040 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49  pSrc;.    if( !I
20050 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
20060 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
20070 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
20080 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20  rderBy;.    }.  
20090 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  }.  pEList = p->
200a0 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20  pEList;.#endif. 
200b0 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
200c0 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  ere;.  pGroupBy 
200d0 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
200e0 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
200f0 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74 69  aving;.  isDisti
20100 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
20110 6e 63 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nct;..#ifndef SQ
20120 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
20130 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49  ND_SELECT.  /* I
20140 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61  f there is are a
20150 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65   sequence of que
20160 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72  ries, do the ear
20170 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e  lier ones first.
20180 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
20190 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
201a0 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
201b0 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  0 ){.      Selec
201c0 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68  t *pLoop, *pRigh
201d0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
201e0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20   cnt = 0;.      
201f0 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a 20 20  int mxSelect;.  
20200 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
20210 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
20220 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74  oop->pPrior, cnt
20230 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  ++){.        pLo
20240 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  op->pRightmost =
20250 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   p;.        pLoo
20260 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67 68  p->pNext = pRigh
20270 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67 68  t;.        pRigh
20280 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20  t = pLoop;.     
20290 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c 65 63   }.      mxSelec
202a0 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  t = db->aLimit[S
202b0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
202c0 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a 20 20  OUND_SELECT];.  
202d0 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65 63 74      if( mxSelect
202e0 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65 63 74   && cnt>mxSelect
202f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20300 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
20310 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65  se, "too many te
20320 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20  rms in compound 
20330 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20 20  SELECT");.      
20340 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
20350 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
20360 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
20370 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
20380 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 23 65 6e  t, aff);.  }.#en
20390 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  dif..  /* If wri
203a0 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
203b0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
203c0 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
203d0 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
203e0 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
203f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20400 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
20410 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74  if( checkForMult
20420 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72  iColumnSelectErr
20430 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  or(pParse, pDest
20440 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
20450 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
20460 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ect_end;.  }.#en
20470 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73  dif..  /* If pos
20480 73 69 62 6c 65 2c 20 72 65 77 72 69 74 65 20 74  sible, rewrite t
20490 68 65 20 71 75 65 72 79 20 74 6f 20 75 73 65 20  he query to use 
204a0 47 52 4f 55 50 20 42 59 20 69 6e 73 74 65 61 64  GROUP BY instead
204b0 20 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a 20 20   of DISTINCT..  
204c0 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20  ** GROUP BY may 
204d0 75 73 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49  use an index, DI
204e0 53 54 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65  STINCT never doe
204f0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
20500 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 21  >isDistinct && !
20510 70 2d 3e 69 73 41 67 67 20 26 26 20 21 70 2d 3e  p->isAgg && !p->
20520 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
20530 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
20540 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
20550 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  (db, p->pEList);
20560 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
20570 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
20580 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d   p->isDistinct =
20590 20 30 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e   0;.    isDistin
205a0 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ct = 0;.  }..  /
205b0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
205c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
205d0 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74  , then this sort
205e0 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d  ing.  ** index m
205f0 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e  ight end up bein
20600 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
20610 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a  data can be .  *
20620 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70  * extracted in p
20630 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  re-sorted order.
20640 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
20650 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a   case, then the.
20660 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65    ** OP_OpenEphe
20670 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
20680 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  n will be change
20690 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
206a0 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67  once.  ** we fig
206b0 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
206c0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
206d0 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  s not needed.  T
206e0 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  he addrSortIndex
206f0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69  .  ** variable i
20700 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69  s used to facili
20710 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65  tate that change
20720 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
20730 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
20740 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
20750 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
20760 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
20770 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
20780 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72  rBy);.    pOrder
20790 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70  By->iECursor = p
207a0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
207b0 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
207c0 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74  hm[2] = addrSort
207d0 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71  Index =.      sq
207e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
207f0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
20800 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
20810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20820 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
20830 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  or, pOrderBy->nE
20840 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20  xpr+2, 0,.      
20850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20860 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
20870 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
20880 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
20890 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74  se{.    addrSort
208a0 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
208b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
208c0 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
208d0 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
208e0 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
208f0 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
20900 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
20910 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
20920 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
20930 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
20940 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73  nEphemeral, pDes
20950 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74  t->iParm, pEList
20960 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
20970 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
20980 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64  ter..  */.  iEnd
20990 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
209a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f  keLabel(v);.  co
209b0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
209c0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
209d0 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  End);..  /* Open
209e0 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
209f0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
20a00 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
20a10 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69  */.  if( isDisti
20a20 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  nct ){.    KeyIn
20a30 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
20a40 20 20 61 73 73 65 72 74 28 20 69 73 41 67 67 20    assert( isAgg 
20a50 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 3b 0a 20  || pGroupBy );. 
20a60 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50     distinct = pP
20a70 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
20a80 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
20a90 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
20aa0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
20ab0 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
20ac0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
20ad0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
20ae0 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  distinct, 0, 0,.
20af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b00 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
20b10 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
20b20 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
20b30 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69  }else{.    disti
20b40 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  nct = -1;.  }.. 
20b50 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e   /* Aggregate an
20b60 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  d non-aggregate 
20b70 71 75 65 72 69 65 73 20 61 72 65 20 68 61 6e 64  queries are hand
20b80 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
20b90 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  */.  if( !isAgg 
20ba0 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
20bb0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
20bc0 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67  se is for non-ag
20bd0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 0a  gregate queries.
20be0 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65      ** Begin the
20bf0 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20   database scan. 
20c00 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f     */.    pWInfo
20c10 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
20c20 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
20c30 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26  bList, pWhere, &
20c40 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20  pOrderBy, 0);.  
20c50 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
20c60 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
20c70 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f  d;..    /* If so
20c80 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
20c90 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
20ca0 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
20cb0 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
20cc0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
20cd0 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
20ce0 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
20cf0 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
20d00 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
20d10 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
20d20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
20d30 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
20d40 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
20d50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20d60 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
20d70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
20d80 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  x, 1);.      p->
20d90 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
20da0 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  = -1;.    }..   
20db0 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
20dc0 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a  dard inner loop.
20dd0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
20de0 74 28 21 69 73 44 69 73 74 69 6e 63 74 29 3b 0a  t(!isDistinct);.
20df0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
20e00 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
20e10 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
20e20 64 65 72 42 79 2c 20 2d 31 2c 20 70 44 65 73 74  derBy, -1, pDest
20e30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20e40 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43        pWInfo->iC
20e50 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d  ontinue, pWInfo-
20e60 3e 69 42 72 65 61 6b 2c 20 61 66 66 29 3b 0a 0a  >iBreak, aff);..
20e70 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64      /* End the d
20e80 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
20e90 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  p..    */.    sq
20ea0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
20eb0 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Info);.  }else{.
20ec0 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
20ed0 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  he processing fo
20ee0 72 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  r aggregate quer
20ef0 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  ies */.    NameC
20f00 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f  ontext sNC;    /
20f10 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
20f20 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67  or processing ag
20f30 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
20f40 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ion */.    int i
20f50 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  AMem;          /
20f60 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
20f70 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ess for storing 
20f80 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
20f90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65   */.    int iBMe
20fa0 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
20fb0 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
20fc0 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52   for previous GR
20fd0 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
20fe0 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20  t iUseFlag;     
20ff0 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
21000 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e   holding flag in
21010 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74  dicating that at
21020 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20   least.         
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
21040 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  * one row of the
21050 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67   input to the ag
21060 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65  gregator has bee
21070 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
21080 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
21090 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e  cessed */.    in
210a0 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20  t iAbortFlag;   
210b0 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
210c0 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75   which causes qu
210d0 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73  ery abort if pos
210e0 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74  itive */.    int
210f0 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20   groupBySort;   
21100 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72   /* Rows come fr
21110 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f  om source in GRO
21120 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 0a  UP BY order */..
21130 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
21140 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20  owing variables 
21150 68 6f 6c 64 20 61 64 64 72 65 73 73 65 73 20 6f  hold addresses o
21160 72 20 6c 61 62 65 6c 73 20 66 6f 72 20 70 61 72  r labels for par
21170 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
21180 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
21190 20 70 72 6f 67 72 61 6d 20 77 65 20 61 72 65 20   program we are 
211a0 70 75 74 74 69 6e 67 20 74 6f 67 65 74 68 65 72  putting together
211b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
211c0 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 20 20 20  OutputRow;      
211d0 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
211e0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
211f0 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
21200 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 4f   */.    int regO
21210 75 74 70 75 74 52 6f 77 3b 20 20 20 20 20 20 20  utputRow;       
21220 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
21230 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f  s register for o
21240 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
21250 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
21260 53 65 74 41 62 6f 72 74 3b 20 20 20 20 20 20 20  SetAbort;       
21270 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74  /* Set the abort
21280 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e   flag and return
21290 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
212a0 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b 20  InitializeLoop; 
212b0 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65  /* Start of code
212c0 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65   that initialize
212d0 73 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  s the input loop
212e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
212f0 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20  TopOfLoop;      
21300 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
21310 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
21320 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20  int addrEnd;    
21330 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
21340 66 20 61 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67  f all processing
21350 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
21360 53 6f 72 74 69 6e 67 49 64 78 3b 20 20 20 20 20  SortingIdx;     
21370 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
21380 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
21390 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
213a0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73  .    int addrRes
213b0 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
213c0 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72  Subroutine for r
213d0 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63  esetting the acc
213e0 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20  umulator */.    
213f0 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
21400 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
21410 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
21420 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62  er for reset sub
21430 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20  routine */..    
21440 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
21450 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
21460 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
21470 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  rt TK_COLUMN nod
21480 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  es into TK_AGG_C
21490 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65  OLUMN and make e
214a0 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a  ntries in.    **
214b0 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c   sAggInfo for al
214c0 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  l TK_AGG_FUNCTIO
214d0 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65  N nodes in expre
214e0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  ssions of the.  
214f0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
21500 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ement..    */.  
21510 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
21520 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
21530 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
21540 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
21550 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
21560 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41  List;.    sNC.pA
21570 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e  ggInfo = &sAggIn
21580 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  fo;.    sAggInfo
21590 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20  .nSortingColumn 
215a0 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72  = pGroupBy ? pGr
215b0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a  oupBy->nExpr+1 :
215c0 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
215d0 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
215e0 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
215f0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
21600 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
21610 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
21620 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
21630 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29  (&sNC, pOrderBy)
21640 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
21650 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
21660 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
21670 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48  regates(&sNC, pH
21680 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20  aving);.    }.  
21690 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
216a0 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
216b0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
216c0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
216d0 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
216e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
216f0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
21700 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e  (&sNC, sAggInfo.
21710 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e  aFunc[i].pExpr->
21720 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
21730 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
21740 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
21750 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
21760 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  * Processing for
21770 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
21780 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72   GROUP BY is ver
21790 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a  y different and.
217a0 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65      ** much more
217b0 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67   complex than ag
217c0 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74  gregates without
217d0 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20   a GROUP BY..   
217e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
217f0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65  upBy ){.      Ke
21800 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
21810 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f    /* Keying info
21820 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
21830 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
21840 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b  */.      int j1;
21850 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
21860 65 20 6c 61 62 65 6c 73 20 74 68 61 74 20 77 65  e labels that we
21870 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e 67   will be needing
21880 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21890 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
218a0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
218b0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
218c0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
218d0 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63   is a GROUP BY c
218e0 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  lause we might n
218f0 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  eed a sorting in
21900 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  dex to.      ** 
21910 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41  implement it.  A
21920 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72  llocate that sor
21930 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20  ting index now. 
21940 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74   If it turns out
21950 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
21960 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74  e do not need it
21970 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20   after all, the 
21980 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
21990 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20  struction.      
219a0 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  ** will be conve
219b0 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70  rted into a Noop
219c0 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  .  .      */.   
219d0 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
219e0 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d  ingIdx = pParse-
219f0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
21a00 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
21a10 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
21a20 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b  arse, pGroupBy);
21a30 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
21a40 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56  ngIdx = sqlite3V
21a50 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
21a60 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a  OpenEphemeral, .
21a70 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
21a80 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
21a90 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
21aa0 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20  Column, .       
21ab0 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65     0, (char*)pKe
21ac0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
21ad0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20  O_HANDOFF);..   
21ae0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
21af0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
21b00 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
21b10 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
21b20 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
21b30 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
21b40 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
21b50 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
21b60 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
21b70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  Mem;.      iAMem
21b80 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
21b90 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
21ba0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
21bb0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
21bc0 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
21bd0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
21be0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
21bf0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
21c00 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
21c10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21c20 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62  _Integer, 0, iAb
21c30 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
21c40 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
21c50 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61  "clear abort fla
21c60 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
21c70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21c80 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
21c90 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
21ca0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
21cb0 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d   "indicate accum
21cc0 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
21cd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21ce0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
21cf0 6f 74 6f 2c 20 30 2c 20 61 64 64 72 49 6e 69 74  oto, 0, addrInit
21d00 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 0a 20 20  ializeLoop);..  
21d10 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
21d20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
21d30 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67  t outputs a sing
21d40 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
21d50 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
21d60 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74  t.  This subrout
21d70 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20  ine first looks 
21d80 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e  at the iUseFlag.
21d90 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20    If iUseFlag.  
21da0 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74      ** is less t
21db0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
21dc0 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75  zero, the subrou
21dd0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
21de0 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68    If.      ** th
21df0 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c  e processing cal
21e00 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ls for the query
21e10 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20   to abort, this 
21e20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
21e30 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74   ** increments t
21e40 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65  he iAbortFlag me
21e50 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65  mory location be
21e60 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
21e70 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
21e80 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63   to signal the c
21e90 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a  aller to abort..
21ea0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
21eb0 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71  ddrSetAbort = sq
21ec0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
21ed0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
21ee0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21ef0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
21f00 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  1, iAbortFlag);.
21f10 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
21f20 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74  t((v, "set abort
21f30 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
21f40 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b  regOutputRow = +
21f50 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
21f60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21f70 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
21f80 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
21f90 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  w);.      addrOu
21fa0 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
21fb0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
21fc0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
21fd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21fe0 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c  OP_IfPos, iUseFl
21ff0 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ag, addrOutputRo
22000 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  w+2);.      Vdbe
22010 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f  Comment((v, "Gro
22020 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
22030 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e  rator entry poin
22040 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t"));.      sqli
22050 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
22060 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
22070 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
22080 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
22090 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
220a0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
220b0 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
220c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
220d0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
220e0 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f  , pHaving, addrO
220f0 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49  utputRow+1, SQLI
22100 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
22110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65        }.      se
22120 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
22130 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
22140 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
22150 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
22160 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e            distin
22170 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20  ct, pDest,.     
22180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22190 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
221a0 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 2c 20  , addrSetAbort, 
221b0 61 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  aff);.      sqli
221c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
221d0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
221e0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
221f0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
22200 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65   "end groupby re
22210 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29  sult generator")
22220 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
22230 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
22240 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73  ne that will res
22250 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20  et the group-by 
22260 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20  accumulator.    
22270 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 52    */.      addrR
22280 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64  eset = sqlite3Vd
22290 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
222a0 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74  ;.      regReset
222b0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
222c0 6d 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  m;.      resetAc
222d0 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
222e0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
222f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22300 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
22310 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 0a  rn, regReset);..
22320 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
22330 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
22340 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
22350 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
22360 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
22370 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
22380 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
22390 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
223a0 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
223b0 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
223c0 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
223d0 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
223e0 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
223f0 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
22400 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
22410 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
22420 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
22430 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22440 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
22450 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 49  veLabel(v, addrI
22460 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a  nitializeLoop);.
22470 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22480 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
22490 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61  sub, regReset, a
224a0 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
224b0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
224c0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
224d0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
224e0 68 65 72 65 2c 20 26 70 47 72 6f 75 70 42 79 2c  here, &pGroupBy,
224f0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
22500 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
22510 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
22520 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d    if( pGroupBy==
22530 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
22540 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
22550 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
22560 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
22570 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
22580 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
22590 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
225a0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
225b0 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ral table will b
225c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
225d0 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63  celled later bec
225e0 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65  ause we still ne
225f0 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b  ed to use the pK
22600 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a  eyInfo.        *
22610 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f 75 70  /.        pGroup
22620 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
22630 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  ;.        groupB
22640 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  ySort = 0;.     
22650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22660 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69  /* Rows are comi
22670 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65  ng out in undete
22680 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57  rmined order.  W
22690 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20  e have to push. 
226a0 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72         ** each r
226b0 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ow into a sortin
226c0 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61  g index, termina
226d0 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f  te the first loo
226e0 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  p,.        ** th
226f0 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65  en loop over the
22700 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
22710 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
22720 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20  he output.      
22730 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f    ** in sorted o
22740 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a  rder.        */.
22750 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42          int regB
22760 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ase;.        int
22770 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20   regRecord;.    
22780 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
22790 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70        int nGroup
227a0 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f  By;..        gro
227b0 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20  upBySort = 1;.  
227c0 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d        nGroupBy =
227d0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
227e0 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d  ;.        nCol =
227f0 20 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20   nGroupBy + 1;. 
22800 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
22810 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66  pBy+1;.        f
22820 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
22830 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
22840 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
22850 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
22860 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  .iSorterColumn>=
22870 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
22880 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   nCol++;.       
22890 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
228a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
228b0 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
228c0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
228d0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
228e0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
228f0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
22900 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
22910 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20  oupBy, regBase, 
22920 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
22930 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22940 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41   OP_Sequence, sA
22950 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
22960 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f 75 70  x,regBase+nGroup
22970 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  By);.        j =
22980 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20   nGroupBy+1;.   
22990 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
229a0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
229b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
229c0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
229d0 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41  _col *pCol = &sA
229e0 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a  ggInfo.aCol[i];.
229f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
22a00 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
22a10 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
22a20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b      int r1 = j +
22a30 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
22a40 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
22a50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
22a60 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
22a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a90 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c  pCol->pTab, pCol
22aa0 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d  ->iColumn, pCol-
22ab0 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b  >iTable, r1, 0);
22ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
22ad0 20 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20   r1!=r2 ){.     
22ae0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22af0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22b00 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b  _SCopy, r2, r1);
22b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
22b20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
22b30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22b40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
22b50 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
22b60 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
22b70 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
22b80 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
22b90 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
22ba0 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20   regBase, nCol, 
22bb0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
22bc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22bd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
22be0 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  nsert, sAggInfo.
22bf0 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52  sortingIdx, regR
22c00 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
22c10 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
22c20 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
22c30 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
22c40 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
22c50 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
22c60 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29  , regBase, nCol)
22c70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
22c80 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
22c90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
22ca0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22cb0 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66  OP_Sort, sAggInf
22cc0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
22cd0 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  drEnd);.        
22ce0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
22cf0 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29  "GROUP BY sort")
22d00 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
22d10 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64  nfo.useSortingId
22d20 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a  x = 1;.      }..
22d30 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
22d40 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
22d50 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64  OUP BY terms and
22d60 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31   store in b0, b1
22d70 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  , b2....      **
22d80 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c   (b0 is memory l
22d90 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c  ocation iBMem+0,
22da0 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20   b1 is iBMem+1, 
22db0 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20  and so forth).  
22dc0 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70      ** Then comp
22dd0 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  are the current 
22de0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
22df0 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50  gainst the GROUP
22e00 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20   BY terms.      
22e10 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  ** from the prev
22e20 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74  ious row current
22e30 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c  ly stored in a0,
22e40 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20   a1, a2....     
22e50 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f   */.      addrTo
22e60 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  pOfLoop = sqlite
22e70 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
22e80 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  (v);.      for(j
22e90 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
22ea0 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
22eb0 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
22ec0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
22ed0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22ee0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
22ef0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
22f00 6e 67 49 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b  ngIdx, j, iBMem+
22f10 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  j);.        }els
22f20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  e{.          sAg
22f30 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65  gInfo.directMode
22f40 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
22f50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
22f60 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
22f70 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42  ->a[j].pExpr, iB
22f80 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
22f90 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
22fa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22fb0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
22fc0 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70   iAMem, iBMem, p
22fd0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a  GroupBy->nExpr,.
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ff0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
23000 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
23010 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31  YINFO);.      j1
23020 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
23030 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
23040 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23050 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
23060 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29  , j1+1, 0, j1+1)
23070 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
23080 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
23090 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
230a0 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
230b0 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
230c0 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50  ges in the GROUP
230d0 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64   BY are detected
230e0 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
230f0 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62   code.      ** b
23100 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20  lock.  If there 
23110 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c  were no changes,
23120 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73   this block is s
23130 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  kipped..      **
23140 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63  .      ** This c
23150 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65  ode copies curre
23160 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d  nt group by term
23170 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e  s in b0,b1,b2,..
23180 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  ..      ** over 
23190 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74  to a0,a1,a2.  It
231a0 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20   then calls the 
231b0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
231c0 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  e.      ** and r
231d0 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67  esets the aggreg
231e0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
231f0 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65  registers in pre
23200 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  paration.      *
23210 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47  * for the next G
23220 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20  ROUP BY batch.. 
23230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
23240 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
23250 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c  e(pParse, iBMem,
23260 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iAMem, pGroupBy
23270 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
23280 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23290 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
232a0 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
232b0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
232c0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
232d0 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72  v, "output one r
232e0 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
232f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23300 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f  , OP_IfPos, iAbo
23310 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29  rtFlag, addrEnd)
23320 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
23330 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61  ent((v, "check a
23340 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
23350 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23360 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
23370 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
23380 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56  rReset);.      V
23390 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
233a0 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f  reset accumulato
233b0 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
233c0 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65  Update the aggre
233d0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
233e0 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
233f0 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20  ontent of.      
23400 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ** the current r
23410 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow.      */.    
23420 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
23430 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
23440 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
23450 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
23460 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
23470 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23480 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
23490 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   1, iUseFlag);. 
234a0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
234b0 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64  ((v, "indicate d
234c0 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
234d0 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
234e0 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
234f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23500 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
23510 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23520 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23530 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  OP_Next, sAggInf
23540 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
23550 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
23560 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23570 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
23580 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
23590 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
235a0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
235b0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31  ddrSortingIdx, 1
235c0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
235d0 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
235e0 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
235f0 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
23600 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23610 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
23620 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
23630 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
23640 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
23650 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69  t((v, "output fi
23660 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 20 20 20 20  nal row"));.    
23670 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69    .    } /* endi
23680 66 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20  f pGroupBy */.  
23690 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45    else {.      E
236a0 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78  xprList *pMinMax
236b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72   = 0;.      Expr
236c0 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a  List *pDel = 0;.
236d0 20 20 20 20 20 20 75 38 20 66 6c 61 67 3b 0a 0a        u8 flag;..
236e0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69        /* Check i
236f0 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f  f the query is o
23700 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  f one of the fol
23710 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20  lowing forms:.  
23720 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
23730 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20    SELECT min(x) 
23740 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  FROM ....      *
23750 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78  *   SELECT max(x
23760 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
23770 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
23780 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20  it is, then ask 
23790 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72  the code in wher
237a0 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74  e.c to attempt t
237b0 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20  o sort results. 
237c0 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68       ** as if th
237d0 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45  ere was an "ORDE
237e0 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45  R ON x" or "ORDE
237f0 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61  R ON x DESC" cla
23800 75 73 65 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49  use. .      ** I
23810 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c  f where.c is abl
23820 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73  e to produce res
23830 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74  ults sorted in t
23840 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a  his order, then.
23850 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62        ** add vdb
23860 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20  e code to break 
23870 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65  out of the proce
23880 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72  ssing loop after
23890 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66   the .      ** f
238a0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28  irst iteration (
238b0 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  since the first 
238c0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
238d0 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20   loop is .      
238e0 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
238f0 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
23900 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e  row with the min
23910 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20  imum or maximum 
23920 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  .      ** value 
23930 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72  of x, the only r
23940 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20  ow required)..  
23950 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
23960 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d  A special flag m
23970 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f  ust be passed to
23980 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
23990 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79  in() to slightly
239a0 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79  .      ** modify
239b0 20 62 65 68 61 76 69 6f 75 72 20 61 73 20 66 6f   behaviour as fo
239c0 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  llows:.      **.
239d0 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20        **   + If 
239e0 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22  the query is a "
239f0 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20  SELECT min(x)", 
23a00 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f  then the loop co
23a10 64 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  ded by.      ** 
23a20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75      where.c shou
23a30 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f  ld not iterate o
23a40 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77  ver any values w
23a50 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ith a NULL value
23a60 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f  .      **     fo
23a70 72 20 78 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  r x..      **.  
23a80 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f      **   + The o
23a90 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e  ptimizer code in
23aa0 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74 68   where.c (the th
23ab0 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65 73  ing that decides
23ac0 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20   which.      ** 
23ad0 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64      index or ind
23ae0 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f  ices to use) sho
23af0 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66  uld place a diff
23b00 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f  erent priority o
23b10 6e 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  n .      **     
23b20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27  satisfying the '
23b30 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65  ORDER BY' clause
23b40 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e   than it does in
23b50 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20   other cases..  
23b60 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72      **     Refer
23b70 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d   to code and com
23b80 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63  ments in where.c
23b90 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20   for details..  
23ba0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61      */.      fla
23bb0 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28  g = minMaxQuery(
23bc0 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
23bd0 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20    if( flag ){.  
23be0 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69        pDel = pMi
23bf0 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78  nMax = sqlite3Ex
23c00 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
23c10 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
23c20 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  xpr->pList);.   
23c30 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78       if( pMinMax
23c40 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
23c50 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
23c60 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
23c70 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 28 66  .sortOrder = ((f
23c80 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag==WHERE_ORDER
23c90 42 59 5f 4d 49 4e 29 3f 30 3a 31 29 3b 0a 20 20  BY_MIN)?0:1);.  
23ca0 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
23cb0 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[0].pExpr->op 
23cc0 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
23cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
23ce0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
23cf0 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61  se runs if the a
23d00 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20  ggregate has no 
23d10 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
23d20 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 70    The.      ** p
23d30 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63  rocessing is muc
23d40 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20  h simpler since 
23d50 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
23d60 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20  single row.     
23d70 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20   ** of output.. 
23d80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
23d90 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
23da0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
23db0 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
23dc0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
23dd0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
23de0 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
23df0 4d 69 6e 4d 61 78 2c 20 66 6c 61 67 29 3b 0a 20  MinMax, flag);. 
23e00 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
23e10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
23e20 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
23e30 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 20 20 20  ete(pDel);.     
23e40 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
23e50 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
23e60 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
23e70 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
23e80 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  gInfo);.      if
23e90 28 20 21 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c  ( !pMinMax && fl
23ea0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ag ){.        sq
23eb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23ec0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
23ed0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
23ee0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
23ef0 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79  ent((v, "%s() by
23f00 20 69 6e 64 65 78 22 2c 28 66 6c 61 67 3d 3d 57   index",(flag==W
23f10 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
23f20 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b  ?"min":"max")));
23f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
23f40 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
23f50 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 66 69  WInfo);.      fi
23f60 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
23f70 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
23f80 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 4f 72  Info);.      pOr
23f90 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
23fa0 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
23fb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
23fc0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
23fd0 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
23fe0 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  End, SQLITE_JUMP
23ff0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d  IFNULL);.      }
24000 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
24010 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
24020 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20  , p->pEList, 0, 
24030 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20  0, 0, -1, .     
24040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24050 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c   pDest, addrEnd,
24060 20 61 64 64 72 45 6e 64 2c 20 61 66 66 29 3b 0a   addrEnd, aff);.
24070 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24080 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 44 65  prListDelete(pDe
24090 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
240a0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
240b0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64  Label(v, addrEnd
240c0 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65  );.    .  } /* e
240d0 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71  ndif aggregate q
240e0 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  uery */..  /* If
240f0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
24100 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
24110 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
24120 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
24130 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
24140 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
24150 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
24160 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
24170 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  y ){.    generat
24180 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65  eSortTail(pParse
24190 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e  , p, v, pEList->
241a0 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20  nExpr, pDest);. 
241b0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
241c0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
241d0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61  .  /* If this wa
241e0 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 77 65  s a subquery, we
241f0 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72   have now conver
24200 74 65 64 20 74 68 65 20 73 75 62 71 75 65 72 79  ted the subquery
24210 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d   into a.  ** tem
24220 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 53  porary table.  S
24230 6f 20 73 65 74 20 74 68 65 20 53 72 63 4c 69 73  o set the SrcLis
24240 74 5f 69 74 65 6d 2e 69 73 50 6f 70 75 6c 61 74  t_item.isPopulat
24250 65 64 20 66 6c 61 67 20 74 6f 20 70 72 65 76 65  ed flag to preve
24260 6e 74 0a 20 20 2a 2a 20 74 68 69 73 20 73 75 62  nt.  ** this sub
24270 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67  query from being
24280 20 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e   evaluated again
24290 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68   and to force th
242a0 65 20 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68  e use of.  ** th
242b0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
242c0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
242d0 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  arent ){.    ass
242e0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53  ert( pParent->pS
242f0 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54  rc->nSrc>parentT
24300 61 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ab );.    assert
24310 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d  ( pParent->pSrc-
24320 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53  >a[parentTab].pS
24330 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20  elect==p );.    
24340 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61  pParent->pSrc->a
24350 5b 70 61 72 65 6e 74 54 61 62 5d 2e 69 73 50 6f  [parentTab].isPo
24360 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20 20 7d  pulated = 1;.  }
24370 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4a 75  .#endif..  /* Ju
24380 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
24390 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a  this query.  */.
243a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
243b0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e  olveLabel(v, iEn
243c0 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45  d);..  /* The SE
243d0 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73  LECT was success
243e0 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53  fully coded.   S
243f0 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
24400 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20  de to 0.  ** to 
24410 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f  indicate no erro
24420 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  rs..  */.  rc = 
24430 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c  0;..  /* Control
24440 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69   jumps to here i
24450 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
24460 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c  countered above,
24470 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75   or upon.  ** su
24480 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20  ccessful coding 
24490 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20  of the SELECT.. 
244a0 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a   */.select_end:.
244b0 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
244c0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77  olumn names if w
244d0 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
244e0 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61  them in a callba
244f0 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
24500 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
24510 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
24520 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74  going to some ot
24530 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  her destination.
24540 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
24550 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65  SQLITE_OK && pDe
24560 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 43  st->eDest==SRT_C
24570 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67  allback ){.    g
24580 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
24590 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
245a0 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
245b0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  }..  sqlite3_fre
245c0 65 28 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29  e(sAggInfo.aCol)
245d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
245e0 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29  (sAggInfo.aFunc)
245f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
24600 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
24610 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
24620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
24670 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
24680 63 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f 72  code is used for
24690 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
246a0 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68  ugging only.  Th
246b0 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66  e code.** that f
246c0 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20  ollows does not 
246d0 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c  appear in normal
246e0 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54   builds..**.** T
246f0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
24700 65 20 75 73 65 64 20 74 6f 20 70 72 69 6e 74 20  e used to print 
24710 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  out the content 
24720 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f  of all or part o
24730 66 20 61 20 0a 2a 2a 20 70 61 72 73 65 20 73 74  f a .** parse st
24740 72 75 63 74 75 72 65 73 20 73 75 63 68 20 61 73  ructures such as
24750 20 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72 2e   Select or Expr.
24760 20 20 53 75 63 68 20 70 72 69 6e 74 6f 75 74 73    Such printouts
24770 20 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66   are useful.** f
24780 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e  or helping to un
24790 64 65 72 73 74 61 6e 64 20 77 68 61 74 20 69 73  derstand what is
247a0 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 73 69 64   happening insid
247b0 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  e the code gener
247c0 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74  ator.** during t
247d0 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  he execution of 
247e0 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54 20 73  complex SELECT s
247f0 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
24800 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20 61   These routine a
24810 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e  re not called an
24820 79 77 68 65 72 65 20 66 72 6f 6d 20 77 69 74 68  ywhere from with
24830 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a  in the normal.**
24840 20 63 6f 64 65 20 62 61 73 65 2e 20 20 54 68 65   code base.  The
24850 6e 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74  n are intended t
24860 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  o be called from
24870 20 77 69 74 68 69 6e 20 74 68 65 20 64 65 62 75   within the debu
24880 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20  gger.** or from 
24890 74 65 6d 70 6f 72 61 72 79 20 22 70 72 69 6e 74  temporary "print
248a0 66 22 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  f" statements in
248b0 73 65 72 74 65 64 20 66 6f 72 20 64 65 62 75 67  serted for debug
248c0 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ging..*/.void sq
248d0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 45  lite3PrintExpr(E
248e0 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
248f0 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d 3e  ->token.z && p->
24900 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20 20  token.n>0 ){.   
24910 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24920 6e 74 66 28 22 28 25 2e 2a 73 22 2c 20 70 2d 3e  ntf("(%.*s", p->
24930 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b 65  token.n, p->toke
24940 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  n.z);.  }else{. 
24950 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24960 72 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d 3e  rintf("(%d", p->
24970 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  op);.  }.  if( p
24980 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 73  ->pLeft ){.    s
24990 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
249a0 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  f(" ");.    sqli
249b0 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e  te3PrintExpr(p->
249c0 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66  pLeft);.  }.  if
249d0 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  ( p->pRight ){. 
249e0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
249f0 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20  rintf(" ");.    
24a00 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
24a10 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  (p->pRight);.  }
24a20 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
24a30 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f  rintf(")");.}.vo
24a40 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45  id sqlite3PrintE
24a50 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
24a60 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
24a70 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
24a80 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
24a90 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  +){.    sqlite3P
24aa0 72 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d 3e  rintExpr(pList->
24ab0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
24ac0 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45   if( i<pList->nE
24ad0 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 73  xpr-1 ){.      s
24ae0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24af0 66 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20  f(", ");.    }. 
24b00 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
24b10 33 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c  3PrintSelect(Sel
24b20 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65  ect *p, int inde
24b30 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 65  nt){.  sqlite3De
24b40 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53 45  bugPrintf("%*sSE
24b50 4c 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64 65  LECT(%p) ", inde
24b60 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73 71  nt, "", p);.  sq
24b70 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69  lite3PrintExprLi
24b80 73 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  st(p->pEList);. 
24b90 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24ba0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28  ntf("\n");.  if(
24bb0 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20   p->pSrc ){.    
24bc0 63 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20  char *zPrefix;. 
24bd0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50     int i;.    zP
24be0 72 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a  refix = "FROM";.
24bf0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
24c00 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  ->pSrc->nSrc; i+
24c10 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
24c20 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24c30 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d  Item = &p->pSrc-
24c40 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c  >a[i];.      sql
24c50 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24c60 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36  "%*s ", indent+6
24c70 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20  , zPrefix);.    
24c80 20 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a    zPrefix = "";.
24c90 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
24ca0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
24cb0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24cc0 50 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20  Printf("(\n");. 
24cd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72         sqlite3Pr
24ce0 69 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d 2d  intSelect(pItem-
24cf0 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74  >pSelect, indent
24d00 2b 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  +10);.        sq
24d10 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24d20 28 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b  ("%*s)", indent+
24d30 38 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 65  8, "");.      }e
24d40 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  lse if( pItem->z
24d50 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
24d60 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24d70 74 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e  tf("%s", pItem->
24d80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
24d90 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
24da0 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  >pTab ){.       
24db0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24dc0 6e 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73 29  ntf("(table: %s)
24dd0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
24de0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
24df0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
24e00 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
24e10 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24e20 72 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c 20  rintf(" AS %s", 
24e30 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
24e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
24e50 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  ( i<p->pSrc->nSr
24e60 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  c-1 ){.        s
24e70 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24e80 66 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a  f(",");.      }.
24e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
24ea0 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
24eb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
24ec0 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  p->pWhere ){.   
24ed0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24ee0 6e 74 66 28 22 25 2a 73 20 57 48 45 52 45 20 22  ntf("%*s WHERE "
24ef0 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
24f00 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
24f10 78 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  xpr(p->pWhere);.
24f20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24f30 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
24f40 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  }.  if( p->pGrou
24f50 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBy ){.    sqlit
24f60 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
24f70 2a 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20 69  *s GROUP BY ", i
24f80 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20  ndent, "");.    
24f90 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
24fa0 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
24fb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
24fc0 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
24fd0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48  .  }.  if( p->pH
24fe0 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c  aving ){.    sql
24ff0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25000 22 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20 69  "%*s HAVING ", i
25010 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20  ndent, "");.    
25020 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
25030 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  (p->pHaving);.  
25040 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25050 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a  intf("\n");.  }.
25060 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
25070 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
25080 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
25090 20 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e 64   ORDER BY ", ind
250a0 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71  ent, "");.    sq
250b0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69  lite3PrintExprLi
250c0 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  st(p->pOrderBy);
250d0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
250e0 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
250f0 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74   }.}./* End of t
25100 68 65 20 73 74 72 75 63 74 75 72 65 20 64 65 62  he structure deb
25110 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65  ug printing code
25120 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
25130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
25170 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
25180 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
25190 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
251a0 5f 44 45 42 55 47 29 20 2a 2f 0a                 _DEBUG) */.