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

Artifact aa7328a23c0abe019f98bb7e1f4f63d62e20ba98:


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 35 30 31  select.c,v 1.501
0200: 20 32 30 30 39 2f 30 32 2f 32 30 20 31 30 3a 35   2009/02/20 10:5
0210: 38 3a 34 32 20 64 61 6e 69 65 6c 6b 31 39 37 37  8:42 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 73 71 6c 69 74 65 33 20 2a  Select(sqlite3 *
02d0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  db, Select *p){.
02e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
02f0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
0300: 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  EList);.  sqlite
0310: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
0320: 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73  b, p->pSrc);.  s
0330: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0340: 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  (db, p->pWhere);
0350: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
0360: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
0370: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c  pGroupBy);.  sql
0380: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0390: 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  b, p->pHaving);.
03a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
03b0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
03c0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69  OrderBy);.  sqli
03d0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
03e0: 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a  db, p->pPrior);.
03f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0400: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
0410: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
0420: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
0430: 4f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Offset);.}../*.*
0440: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53  * Initialize a S
0450: 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74  electDest struct
0460: 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
0470: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
0480: 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70  it(SelectDest *p
0490: 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c  Dest, int eDest,
04a0: 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70   int iParm){.  p
04b0: 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75  Dest->eDest = (u
04c0: 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74  8)eDest;.  pDest
04d0: 2d 3e 69 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b  ->iParm = iParm;
04e0: 0a 20 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69  .  pDest->affini
04f0: 74 79 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d  ty = 0;.  pDest-
0500: 3e 69 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 44 65  >iMem = 0;.  pDe
0510: 73 74 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 7d 0a  st->nMem = 0;.}.
0520: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
0530: 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74   a new Select st
0540: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
0550: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
0560: 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72  that.** structur
0570: 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71  e..*/.Select *sq
0580: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
0590: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
05a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
05b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
05c0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
05d0: 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63  ,     /* which c
05e0: 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64  olumns to includ
05f0: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
0600: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
0610: 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  rc,        /* th
0620: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d  e FROM clause --
0630: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f   which tables to
0640: 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20   scan */.  Expr 
0650: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
0660: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
0670: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0680: 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20  st *pGroupBy,   
0690: 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  /* the GROUP BY 
06a0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
06b0: 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20   *pHaving,      
06c0: 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20    /* the HAVING 
06d0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
06e0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
06f0: 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42    /* the ORDER B
0700: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
0710: 74 20 69 73 44 69 73 74 69 6e 63 74 2c 20 20 20  t isDistinct,   
0720: 20 20 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74      /* true if t
0730: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
0740: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
0750: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
0760: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d  ,         /* LIM
0770: 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20  IT value.  NULL 
0780: 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a  means not used *
0790: 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65  /.  Expr *pOffse
07a0: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46  t         /* OFF
07b0: 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  SET value.  NULL
07c0: 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74   means no offset
07d0: 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
07e0: 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
07f0: 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74  standin;.  sqlit
0800: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0810: 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  >db;.  pNew = sq
0820: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
0830: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  o(db, sizeof(*pN
0840: 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ew) );.  assert(
0850: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0860: 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c  d || !pOffset ||
0870: 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46   pLimit ); /* OF
0880: 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d  FSET implies LIM
0890: 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77  IT */.  if( pNew
08a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  ==0 ){.    pNew 
08b0: 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20  = &standin;.    
08c0: 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
08d0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a  sizeof(*pNew));.
08e0: 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74    }.  if( pEList
08f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73  ==0 ){.    pELis
0900: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
0910: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
0920: 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  , 0, sqlite3Expr
0930: 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30  (db,TK_ALL,0,0,0
0940: 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  ), 0);.  }.  pNe
0950: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  w->pEList = pELi
0960: 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63  st;.  pNew->pSrc
0970: 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e 65 77 2d   = pSrc;.  pNew-
0980: 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
0990: 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
09a0: 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
09b0: 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
09c0: 20 70 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65 77   pHaving;.  pNew
09d0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
09e0: 64 65 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 73  derBy;.  pNew->s
09f0: 65 6c 46 6c 61 67 73 20 3d 20 69 73 44 69 73 74  elFlags = isDist
0a00: 69 6e 63 74 20 3f 20 53 46 5f 44 69 73 74 69 6e  inct ? SF_Distin
0a10: 63 74 20 3a 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  ct : 0;.  pNew->
0a20: 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a  op = TK_SELECT;.
0a30: 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
0a40: 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d   pLimit;.  pNew-
0a50: 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
0a60: 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  et;.  pNew->addr
0a70: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
0a80: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
0a90: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
0aa0: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0ab0: 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[2] = -1;.  
0ac0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
0ad0: 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65  iled ) {.    cle
0ae0: 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65  arSelect(db, pNe
0af0: 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  w);.    if( pNew
0b00: 21 3d 26 73 74 61 6e 64 69 6e 20 29 20 73 71 6c  !=&standin ) sql
0b10: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
0b20: 4e 65 77 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  New);.    pNew =
0b30: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
0b40: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
0b50: 44 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e  Delete the given
0b60: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
0b70: 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  e and all of its
0b80: 20 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a   substructures..
0b90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0ba0: 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69  electDelete(sqli
0bb0: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0bc0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
0bd0: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
0be0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  db, p);.    sqli
0bf0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
0c00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
0c10: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
0c20: 74 69 66 69 65 72 73 20 70 72 65 63 65 65 64 69  tifiers preceedi
0c30: 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77  ng the JOIN keyw
0c40: 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  ord, determine t
0c50: 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f  he.** type of jo
0c60: 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  in.  Return an i
0c70: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
0c80: 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74  that expresses t
0c90: 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74  hat type.** in t
0ca0: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  erms of the foll
0cb0: 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73  owing bit values
0cc0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49  :.**.**     JT_I
0cd0: 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43  NNER.**     JT_C
0ce0: 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f  ROSS.**     JT_O
0cf0: 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e  UTER.**     JT_N
0d00: 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54  ATURAL.**     JT
0d10: 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f  _LEFT.**     JT_
0d20: 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75  RIGHT.**.** A fu
0d30: 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73  ll outer join is
0d40: 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e   the combination
0d50: 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20   of JT_LEFT and 
0d60: 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20  JT_RIGHT..**.** 
0d70: 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72  If an illegal or
0d80: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
0d90: 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20  n type is seen, 
0da0: 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
0db0: 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65  n.** a join type
0dc0: 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72  , but put an err
0dd0: 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  or in the pParse
0de0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
0df0: 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79  nt sqlite3JoinTy
0e00: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
0e10: 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b  , Token *pA, Tok
0e20: 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70  en *pB, Token *p
0e30: 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79  C){.  int jointy
0e40: 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20  pe = 0;.  Token 
0e50: 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b  *apAll[3];.  Tok
0e60: 65 6e 20 2a 70 3b 0a 20 20 73 74 61 74 69 63 20  en *p;.  static 
0e70: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
0e80: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b     const char zK
0e90: 65 79 77 6f 72 64 5b 38 5d 3b 0a 20 20 20 20 75  eyword[8];.    u
0ea0: 38 20 6e 43 68 61 72 3b 0a 20 20 20 20 75 38 20  8 nChar;.    u8 
0eb0: 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72  code;.  } keywor
0ec0: 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ds[] = {.    { "
0ed0: 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f  natural", 7, JT_
0ee0: 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b  NATURAL },.    {
0ef0: 20 22 6c 65 66 74 22 2c 20 20 20 20 34 2c 20 4a   "left",    4, J
0f00: 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20  T_LEFT|JT_OUTER 
0f10: 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67 68 74 22  },.    { "right"
0f20: 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c  ,   5, JT_RIGHT|
0f30: 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20  JT_OUTER },.    
0f40: 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20  { "full",    4, 
0f50: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54  JT_LEFT|JT_RIGHT
0f60: 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20  |JT_OUTER },.   
0f70: 20 7b 20 22 6f 75 74 65 72 22 2c 20 20 20 35 2c   { "outer",   5,
0f80: 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20   JT_OUTER },.   
0f90: 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c   { "inner",   5,
0fa0: 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20   JT_INNER },.   
0fb0: 20 7b 20 22 63 72 6f 73 73 22 2c 20 20 20 35 2c   { "cross",   5,
0fc0: 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f   JT_INNER|JT_CRO
0fd0: 53 53 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74  SS },.  };.  int
0fe0: 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30   i, j;.  apAll[0
0ff0: 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pA;.  apAll[
1000: 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c  1] = pB;.  apAll
1010: 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28  [2] = pC;.  for(
1020: 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c  i=0; i<3 && apAl
1030: 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l[i]; i++){.    
1040: 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20  p = apAll[i];.  
1050: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72    for(j=0; j<Arr
1060: 61 79 53 69 7a 65 28 6b 65 79 77 6f 72 64 73 29  aySize(keywords)
1070: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
1080: 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73  ( p->n==keywords
1090: 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20  [j].nChar .     
10a0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
10b0: 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70  trNICmp((char*)p
10c0: 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d  ->z, keywords[j]
10d0: 2e 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29  .zKeyword, p->n)
10e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ==0 ){.        j
10f0: 6f 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f  ointype |= keywo
1100: 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20  rds[j].code;.   
1110: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1120: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1130: 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a 65 28 6b  ( j>=ArraySize(k
1140: 65 79 77 6f 72 64 73 29 20 29 7b 0a 20 20 20 20  eywords) ){.    
1150: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54    jointype |= JT
1160: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
1170: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1180: 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74   if(.     (joint
1190: 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c  ype & (JT_INNER|
11a0: 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f  JT_OUTER))==(JT_
11b0: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20  INNER|JT_OUTER) 
11c0: 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70  ||.     (jointyp
11d0: 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30  e & JT_ERROR)!=0
11e0: 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  .  ){.    const 
11f0: 63 68 61 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b  char *zSp = " ";
1200: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 21  .    assert( pB!
1210: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  =0 );.    if( pC
1220: 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a  ==0 ){ zSp++; }.
1230: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1240: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
1250: 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72  nown or unsuppor
1260: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22  ted join type: "
1270: 0a 20 20 20 20 20 20 20 22 25 54 20 25 54 25 73  .       "%T %T%s
1280: 25 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70  %T", pA, pB, zSp
1290: 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  , pC);.    joint
12a0: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
12b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69 6e    }else if( join
12c0: 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54 20  type & JT_RIGHT 
12d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
12e0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
12f0: 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64        "RIGHT and
1300: 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e   FULL OUTER JOIN
1310: 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e  s are not curren
1320: 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b  tly supported");
1330: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
1340: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20  JT_INNER;.  }.  
1350: 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b  return jointype;
1360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1370: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1380: 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c  column in a tabl
1390: 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  e.  Return -1 if
13a0: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   the column.** i
13b0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
13c0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  in the table..*/
13d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75  .static int colu
13e0: 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70  mnIndex(Table *p
13f0: 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Tab, const char 
1400: 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  *zCol){.  int i;
1410: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1420: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
1430: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1440: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
1450: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  l[i].zName, zCol
1460: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
1470: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1480: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1490: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 74 6f  he value of a to
14a0: 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30 27 2d  ken to a '\000'-
14b0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
14c0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
14d0: 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65 6e  d setToken(Token
14e0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
14f0: 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 28 75  *z){.  p->z = (u
1500: 38 2a 29 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20 7a  8*)z;.  p->n = z
1510: 20 3f 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   ? sqlite3Strlen
1520: 33 30 28 7a 29 20 3a 20 30 3b 0a 20 20 70 2d 3e  30(z) : 0;.  p->
1530: 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  dyn = 0;.}../*.*
1540: 2a 20 53 65 74 20 74 68 65 20 74 6f 6b 65 6e 20  * Set the token 
1550: 74 6f 20 74 68 65 20 64 6f 75 62 6c 65 2d 71 75  to the double-qu
1560: 6f 74 65 64 20 61 6e 64 20 65 73 63 61 70 65 64  oted and escaped
1570: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
1580: 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 0a 2a  string pointed.*
1590: 2a 20 74 6f 20 62 79 20 7a 2e 20 46 6f 72 20 65  * to by z. For e
15a0: 78 61 6d 70 6c 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  xample;.**.**   
15b0: 20 7b 61 22 62 63 7d 20 20 2d 3e 20 20 7b 22 61   {a"bc}  ->  {"a
15c0: 22 22 62 63 22 7d 0a 2a 2f 0a 73 74 61 74 69 63  ""bc"}.*/.static
15d0: 20 76 6f 69 64 20 73 65 74 51 75 6f 74 65 64 54   void setQuotedT
15e0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
15f0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f  se, Token *p, co
1600: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 0a 20  nst char *z){.. 
1610: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
1620: 20 73 74 72 69 6e 67 20 61 70 70 65 61 72 73 20   string appears 
1630: 74 6f 20 62 65 20 71 75 6f 74 65 64 20 75 73 69  to be quoted usi
1640: 6e 67 20 22 2e 2e 2e 22 20 6f 72 20 60 2e 2e 2e  ng "..." or `...
1650: 60 0a 20 20 2a 2a 20 6f 72 20 5b 2e 2e 2e 5d 20  `.  ** or [...] 
1660: 6f 72 20 27 2e 2e 2e 27 20 6f 72 20 69 66 20 74  or '...' or if t
1670: 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  he string contai
1680: 6e 73 20 61 6e 79 20 22 20 63 68 61 72 61 63 74  ns any " charact
1690: 65 72 73 2e 20 20 0a 20 20 2a 2a 20 49 66 20 69  ers.  .  ** If i
16a0: 74 20 64 6f 65 73 2c 20 74 68 65 6e 20 72 65 63  t does, then rec
16b0: 6f 72 64 20 61 20 76 65 72 73 69 6f 6e 20 6f 66  ord a version of
16c0: 20 74 68 65 20 73 74 72 69 6e 67 20 77 69 74 68   the string with
16d0: 20 74 68 65 20 73 70 65 63 69 61 6c 0a 20 20 2a   the special.  *
16e0: 2a 20 63 68 61 72 61 63 74 65 72 73 20 65 73 63  * characters esc
16f0: 61 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e  aped..  */.  con
1700: 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b  st char *z2 = z;
1710: 0a 20 20 69 66 28 20 2a 7a 32 21 3d 27 5b 27 20  .  if( *z2!='[' 
1720: 26 26 20 2a 7a 32 21 3d 27 60 27 20 26 26 20 2a  && *z2!='`' && *
1730: 7a 32 21 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20  z2!='\'' ){.    
1740: 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 0a 20 20  while( *z2 ){.  
1750: 20 20 20 20 69 66 28 20 2a 7a 32 3d 3d 27 22 27      if( *z2=='"'
1760: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1770: 7a 32 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  z2++;.    }.  }.
1780: 0a 20 20 69 66 28 20 2a 7a 32 20 29 7b 0a 20 20  .  if( *z2 ){.  
1790: 20 20 2f 2a 20 53 74 72 69 6e 67 20 63 6f 6e 74    /* String cont
17a0: 61 69 6e 73 20 22 20 63 68 61 72 61 63 74 65 72  ains " character
17b0: 73 20 2d 20 63 6f 70 79 20 61 6e 64 20 71 75 6f  s - copy and quo
17c0: 74 65 20 74 68 65 20 73 74 72 69 6e 67 2e 20 2a  te the string. *
17d0: 2f 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 28 75 38  /.    p->z = (u8
17e0: 20 2a 29 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   *)sqlite3MPrint
17f0: 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 5c  f(pParse->db, "\
1800: 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20 20 20 20  "%w\"", z);.    
1810: 69 66 28 20 70 2d 3e 7a 20 29 7b 0a 20 20 20 20  if( p->z ){.    
1820: 20 20 70 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33    p->n = sqlite3
1830: 53 74 72 6c 65 6e 33 30 28 28 63 68 61 72 20 2a  Strlen30((char *
1840: 29 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 2d  )p->z);.      p-
1850: 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  >dyn = 1;.    }.
1860: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1870: 53 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20  String contains 
1880: 6e 6f 20 22 20 63 68 61 72 61 63 74 65 72 73 20  no " characters 
1890: 2d 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74  - copy the point
18a0: 65 72 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 7a 20  er. */.    p->z 
18b0: 3d 20 28 75 38 2a 29 7a 3b 0a 20 20 20 20 70 2d  = (u8*)z;.    p-
18c0: 3e 6e 20 3d 20 28 69 6e 74 29 28 7a 32 20 2d 20  >n = (int)(z2 - 
18d0: 7a 29 3b 0a 20 20 20 20 70 2d 3e 64 79 6e 20 3d  z);.    p->dyn =
18e0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
18f0: 20 43 72 65 61 74 65 20 61 6e 20 65 78 70 72 65   Create an expre
1900: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
1910: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 77 69 74  n identifier wit
1920: 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 7a 4e  h the name of zN
1930: 61 6d 65 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ame.*/.Expr *sql
1940: 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70 72  ite3CreateIdExpr
1950: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1960: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1970: 65 29 7b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d  e){.  Token dumm
1980: 79 3b 0a 20 20 73 65 74 54 6f 6b 65 6e 28 26 64  y;.  setToken(&d
1990: 75 6d 6d 79 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ummy, zName);.  
19a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 45  return sqlite3PE
19b0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
19c0: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
19d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
19e0: 20 74 65 72 6d 20 74 6f 20 74 68 65 20 57 48 45   term to the WHE
19f0: 52 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  RE expression in
1a00: 20 2a 70 70 45 78 70 72 20 74 68 61 74 20 72 65   *ppExpr that re
1a10: 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20 7a 43  quires the.** zC
1a20: 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  ol column to be 
1a30: 65 71 75 61 6c 20 69 6e 20 74 68 65 20 74 77 6f  equal in the two
1a40: 20 74 61 62 6c 65 73 20 70 54 61 62 31 20 61 6e   tables pTab1 an
1a50: 64 20 70 54 61 62 32 2e 0a 2a 2f 0a 73 74 61 74  d pTab2..*/.stat
1a60: 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65  ic void addWhere
1a70: 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
1a80: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1a90: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1aa0: 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ext */.  const c
1ab0: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 20 20  har *zCol,      
1ac0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1ad0: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
1ae0: 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62 31 2c  st Table *pTab1,
1af0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74        /* First t
1b00: 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  able */.  const 
1b10: 63 68 61 72 20 2a 7a 41 6c 69 61 73 31 2c 20 20  char *zAlias1,  
1b20: 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20     /* Alias for 
1b30: 66 69 72 73 74 20 74 61 62 6c 65 2e 20 20 4d 61  first table.  Ma
1b40: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  y be NULL */.  c
1b50: 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62  onst Table *pTab
1b60: 32 2c 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e  2,      /* Secon
1b70: 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e  d table */.  con
1b80: 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73 32  st char *zAlias2
1b90: 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66  ,     /* Alias f
1ba0: 6f 72 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 2e  or second table.
1bb0: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
1bc0: 0a 20 20 69 6e 74 20 69 52 69 67 68 74 4a 6f 69  .  int iRightJoi
1bd0: 6e 54 61 62 6c 65 2c 20 20 20 20 20 2f 2a 20 56  nTable,     /* V
1be0: 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
1bf0: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a  he right table *
1c00: 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70  /.  Expr **ppExp
1c10: 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
1c20: 41 64 64 20 74 68 65 20 65 71 75 61 6c 69 74 79  Add the equality
1c30: 20 74 65 72 6d 20 74 6f 20 74 68 69 73 20 65 78   term to this ex
1c40: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
1c50: 74 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 20 20  t isOuterJoin   
1c60: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1c70: 66 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  f dealing with a
1c80: 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a  n OUTER join */.
1c90: 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 31 61 2c  ){.  Expr *pE1a,
1ca0: 20 2a 70 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20   *pE1b, *pE1c;. 
1cb0: 20 45 78 70 72 20 2a 70 45 32 61 2c 20 2a 70 45   Expr *pE2a, *pE
1cc0: 32 62 2c 20 2a 70 45 32 63 3b 0a 20 20 45 78 70  2b, *pE2c;.  Exp
1cd0: 72 20 2a 70 45 3b 0a 0a 20 20 70 45 31 61 20 3d  r *pE;..  pE1a =
1ce0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64   sqlite3CreateId
1cf0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a 43 6f  Expr(pParse, zCo
1d00: 6c 29 3b 0a 20 20 70 45 32 61 20 3d 20 73 71 6c  l);.  pE2a = sql
1d10: 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70 72  ite3CreateIdExpr
1d20: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a  (pParse, zCol);.
1d30: 20 20 69 66 28 20 7a 41 6c 69 61 73 31 3d 3d 30    if( zAlias1==0
1d40: 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 31 20   ){.    zAlias1 
1d50: 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a  = pTab1->zName;.
1d60: 20 20 7d 0a 20 20 70 45 31 62 20 3d 20 73 71 6c    }.  pE1b = sql
1d70: 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70 72  ite3CreateIdExpr
1d80: 28 70 50 61 72 73 65 2c 20 7a 41 6c 69 61 73 31  (pParse, zAlias1
1d90: 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 32  );.  if( zAlias2
1da0: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61  ==0 ){.    zAlia
1db0: 73 32 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61 6d  s2 = pTab2->zNam
1dc0: 65 3b 0a 20 20 7d 0a 20 20 70 45 32 62 20 3d 20  e;.  }.  pE2b = 
1dd0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45  sqlite3CreateIdE
1de0: 78 70 72 28 70 50 61 72 73 65 2c 20 7a 41 6c 69  xpr(pParse, zAli
1df0: 61 73 32 29 3b 0a 20 20 70 45 31 63 20 3d 20 73  as2);.  pE1c = s
1e00: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1e10: 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 31 62  se, TK_DOT, pE1b
1e20: 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20 20 70 45  , pE1a, 0);.  pE
1e30: 32 63 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  2c = sqlite3PExp
1e40: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
1e50: 2c 20 70 45 32 62 2c 20 70 45 32 61 2c 20 30 29  , pE2b, pE2a, 0)
1e60: 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33  ;.  pE = sqlite3
1e70: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
1e80: 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c  _EQ, pE1c, pE2c,
1e90: 20 30 29 3b 0a 20 20 69 66 28 20 70 45 20 26 26   0);.  if( pE &&
1ea0: 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a   isOuterJoin ){.
1eb0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
1ec0: 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a  rty(pE, EP_FromJ
1ed0: 6f 69 6e 29 3b 0a 20 20 20 20 70 45 2d 3e 69 52  oin);.    pE->iR
1ee0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
1ef0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b  iRightJoinTable;
1f00: 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d  .  }.  *ppExpr =
1f10: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
1f20: 70 50 61 72 73 65 2d 3e 64 62 2c 2a 70 70 45 78  pParse->db,*ppEx
1f30: 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pr, pE);.}../*.*
1f40: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
1f50: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
1f60: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
1f70: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
1f80: 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20  ion..** And set 
1f90: 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  the Expr.iRightJ
1fa0: 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62  oinTable to iTab
1fb0: 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  le for every ter
1fc0: 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72  m in the.** expr
1fd0: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
1fe0: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
1ff0: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f  operty is used o
2000: 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78  n terms of an ex
2010: 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c  pression to tell
2020: 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54  .** the LEFT OUT
2030: 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69  ER JOIN processi
2040: 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68  ng logic that th
2050: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
2060: 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72  of the.** join r
2070: 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69  estriction speci
2080: 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  fied in the ON o
2090: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61  r USING clause a
20a0: 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a  nd not a part.**
20b0: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
20c0: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
20d0: 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  e.  These terms 
20e0: 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74  are moved over t
20f0: 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  o the.** WHERE c
2100: 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69  lause during joi
2110: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74  n processing but
2120: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   we need to reme
2130: 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a  mber that they.*
2140: 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  * originated in 
2150: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2160: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  clause..**.** Th
2170: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
2180: 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65  nTable tells the
2190: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
21a0: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68  ocessing that th
21b0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
21c0: 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65  depends on table
21d0: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
21e0: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61   even if that ta
21f0: 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78  ble is not.** ex
2200: 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e  plicitly mention
2210: 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
2220: 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f  sion.  That info
2230: 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  rmation is neede
2240: 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c  d.** for cases l
2250: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
2260: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2270: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
2280: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e   ON t1.a=t2.b AN
2290: 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54  D t1.x=5.**.** T
22a0: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
22b0: 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74  needs to defer t
22c0: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
22d0: 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72  he t1.x=5.** ter
22e0: 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  m until after th
22f0: 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65  e t2 loop of the
2300: 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20   join.  In that 
2310: 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74  way, a.** NULL t
2320: 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e  2 row will be in
2330: 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20  serted whenever 
2340: 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20  t1.x!=5.  If we 
2350: 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20  do not.** defer 
2360: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
2370: 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20  t1.x=5, it will 
2380: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d  be processed imm
2390: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
23a0: 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  r the t1 loop an
23b0: 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78  d rows with t1.x
23c0: 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  !=5 will never a
23d0: 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20  ppear in.** the 
23e0: 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73  output, which is
23f0: 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73   incorrect..*/.s
2400: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f  tatic void setJo
2410: 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  inExpr(Expr *p, 
2420: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77  int iTable){.  w
2430: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45  hile( p ){.    E
2440: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
2450: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
2460: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
2470: 6e 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  nTable = iTable;
2480: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
2490: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
24a0: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
24b0: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
24c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
24d0: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
24e0: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
24f0: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
2500: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
2510: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2520: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
2530: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
2540: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2550: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
2560: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
2570: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
2580: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
2590: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
25a0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
25b0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
25c0: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
25d0: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
25e0: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
25f0: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
2600: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
2610: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
2620: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
2630: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
2640: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
2650: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
2660: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
2670: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
2680: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
2690: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
26a0: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
26b0: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
26c0: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
26d0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
26e0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
26f0: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
2700: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
2710: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
2720: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2730: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
2740: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2750: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
2760: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
2770: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
2780: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2790: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
27a0: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27c0: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
27d0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
27e0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2800: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2810: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
2820: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
2830: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
2840: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
2850: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
2860: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
2870: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
2880: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
2890: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
28a0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
28b0: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
28c0: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
28d0: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
28e0: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
28f0: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
2900: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
2910: 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20  Table *pLeftTab 
2920: 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20  = pLeft->pTab;. 
2930: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
2940: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
2950: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75  ab;.    int isOu
2960: 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45  ter;..    if( NE
2970: 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20  VER(pLeftTab==0 
2980: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29  || pRightTab==0)
2990: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
29a0: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
29b0: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
29c0: 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20  T_OUTER)!=0;..  
29d0: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41    /* When the NA
29e0: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73  TURAL keyword is
29f0: 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48   present, add WH
2a00: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
2a10: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
2a20: 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  y column that th
2a30: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76  e two tables hav
2a40: 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20  e in common..   
2a50: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
2a60: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2a70: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
2a80: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
2a90: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
2aa0: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
2ab0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2ac0: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
2ad0: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
2ae0: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
2af0: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
2b00: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
2b10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2b20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2b30: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74 54  or(j=0; j<pLeftT
2b40: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
2b50: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
2b60: 61 6d 65 20 3d 20 70 4c 65 66 74 54 61 62 2d 3e  ame = pLeftTab->
2b70: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
2b80: 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d         if( colum
2b90: 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62  nIndex(pRightTab
2ba0: 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
2bb0: 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72           addWher
2bc0: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e  eTerm(pParse, zN
2bd0: 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70  ame, pLeftTab, p
2be0: 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20  Left->zAlias, . 
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
2c10: 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e  ghtTab, pRight->
2c20: 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20  zAlias,.        
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69 43        pRight->iC
2c50: 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72  ursor, &p->pWher
2c60: 65 2c 20 69 73 4f 75 74 65 72 29 3b 0a 20 20 20  e, isOuter);.   
2c70: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
2c80: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2c90: 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77  .    /* Disallow
2ca0: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
2cb0: 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68  NG clauses in th
2cc0: 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20  e same join.    
2cd0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
2ce0: 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74  t->pOn && pRight
2cf0: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
2d00: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2d10: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
2d20: 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61  t have both ON a
2d30: 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20  nd USING ".     
2d40: 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74     "clauses in t
2d50: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a  he same join");.
2d60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2d70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
2d80: 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  d the ON clause 
2d90: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
2da0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
2db0: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20  connected by.   
2dc0: 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   ** an AND opera
2dd0: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
2de0: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
2df0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  ){.      if( isO
2e00: 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78  uter ) setJoinEx
2e10: 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20  pr(pRight->pOn, 
2e20: 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29  pRight->iCursor)
2e30: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72  ;.      p->pWher
2e40: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
2e50: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
2e60: 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74  ->pWhere, pRight
2e70: 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52  ->pOn);.      pR
2e80: 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20  ight->pOn = 0;. 
2e90: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
2ea0: 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20  ate extra terms 
2eb0: 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  on the WHERE cla
2ec0: 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  use for each col
2ed0: 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a  umn named.    **
2ee0: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
2ef0: 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20  ause.  Example: 
2f00: 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  If the two table
2f10: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61  s to be joined a
2f20: 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64  re .    ** A and
2f30: 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47   B and the USING
2f40: 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c   clause names X,
2f50: 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20   Y, and Z, then 
2f60: 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  add this.    ** 
2f70: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
2f80: 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20  use:    A.X=B.X 
2f90: 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20  AND A.Y=B.Y AND 
2fa0: 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52  A.Z=B.Z.    ** R
2fb0: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
2fc0: 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e  f any column men
2fd0: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53  tioned in the US
2fe0: 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20  ING clause is.  
2ff0: 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e    ** not contain
3000: 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  ed in both table
3010: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a  s to be joined..
3020: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
3030: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
3040: 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70  .      IdList *p
3050: 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70  List = pRight->p
3060: 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72  Using;.      for
3070: 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e  (j=0; j<pList->n
3080: 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; j++){.      
3090: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
30a0: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
30b0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  e;.        if( c
30c0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74  olumnIndex(pLeft
30d0: 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c  Tab, zName)<0 ||
30e0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69   columnIndex(pRi
30f0: 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30  ghtTab, zName)<0
3100: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
3110: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3120: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f  arse, "cannot jo
3130: 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20  in using column 
3140: 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20  %s - column ".  
3150: 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70            "not p
3160: 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74  resent in both t
3170: 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ables", zName);.
3180: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3190: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
31a0: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
31b0: 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  rm(pParse, zName
31c0: 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66  , pLeftTab, pLef
31d0: 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20  t->zAlias, .    
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61          pRightTa
3200: 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61  b, pRight->zAlia
3210: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3230: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20  Right->iCursor, 
3240: 26 70 2d 3e 70 57 68 65 72 65 2c 20 69 73 4f 75  &p->pWhere, isOu
3250: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
3260: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3270: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   0;.}../*.** Ins
3280: 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76  ert code into "v
3290: 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  " that will push
32a0: 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74   the record on t
32b0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
32c0: 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20   stack into the 
32d0: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
32e0: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
32f0: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
3300: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3310: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
3320: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
3330: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a  *pOrderBy,    /*
3340: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
3350: 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ause */.  Select
3360: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
3370: 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45   /* The whole SE
3380: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
3390: 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 20  /.  int regData 
33a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
33b0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
33c0: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
33d0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
33e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
33f0: 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20  ;.  int nExpr = 
3400: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
3410: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d  .  int regBase =
3420: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
3430: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78  ange(pParse, nEx
3440: 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67  pr+2);.  int reg
3450: 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
3460: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
3470: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
3480: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
3490: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
34a0: 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 73  regBase, 0);.  s
34b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
34c0: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
34d0: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
34e0: 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  sor, regBase+nEx
34f0: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
3500: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
3510: 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67 42  e, regData, regB
3520: 61 73 65 2b 6e 45 78 70 72 2b 31 2c 20 31 29 3b  ase+nExpr+1, 1);
3530: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3540: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
3550: 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20  ecord, regBase, 
3560: 6e 45 78 70 72 20 2b 20 32 2c 20 72 65 67 52 65  nExpr + 2, regRe
3570: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
3580: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3590: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4f 72 64  _IdxInsert, pOrd
35a0: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
35b0: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
35c0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
35d0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
35e0: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
35f0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
3600: 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
3610: 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69  e, nExpr+2);.  i
3620: 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  f( pSelect->iLim
3630: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  it ){.    int ad
3640: 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20  dr1, addr2;.    
3650: 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20  int iLimit;.    
3660: 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  if( pSelect->iOf
3670: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c  fset ){.      iL
3680: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
3690: 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d  iOffset+1;.    }
36a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d  else{.      iLim
36b0: 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c  it = pSelect->iL
36c0: 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  imit;.    }.    
36d0: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
36e0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
36f0: 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b  IfZero, iLimit);
3700: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3710: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
3720: 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29  Imm, iLimit, -1)
3730: 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
3740: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
3750: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
3760: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
3770: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
3780: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3790: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp1(v, OP_Last
37a0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
37b0: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
37c0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
37d0: 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72 64 65  OP_Delete, pOrde
37e0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  rBy->iECursor);.
37f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3800: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32  umpHere(v, addr2
3810: 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e  );.    pSelect->
3820: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  iLimit = 0;.  }.
3830: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
3840: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
3850: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
3860: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
3870: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
3880: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
3890: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
38a0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65  his VM */.  Sele
38b0: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ct *p,        /*
38c0: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
38d0: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
38e0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
38f0: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
3900: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
3910: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
3920: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
3930: 69 4f 66 66 73 65 74 20 26 26 20 69 43 6f 6e 74  iOffset && iCont
3940: 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69  inue!=0 ){.    i
3950: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c  nt addr;.    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 41 64 64 49 6d 6d 2c 20 70 2d 3e  , OP_AddImm, p->
3980: 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20  iOffset, -1);.  
3990: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
39a0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
39b0: 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73  _IfNeg, p->iOffs
39c0: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
39d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
39e0: 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69  _Goto, 0, iConti
39f0: 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  nue);.    VdbeCo
3a00: 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20  mment((v, "skip 
3a10: 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29  OFFSET records")
3a20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3a30: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3a40: 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  dr);.  }.}../*.*
3a50: 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20  * Add code that 
3a60: 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61  will check to ma
3a70: 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65  ke sure the N re
3a80: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
3a90: 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d   at iMem.** form
3aa0: 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72   a distinct entr
3ab0: 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f  y.  iTab is a so
3ac0: 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
3ad0: 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c   holds previousl
3ae0: 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e  y.** seen combin
3af0: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20  ations of the N 
3b00: 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65  values.  A new e
3b10: 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20  ntry is made in 
3b20: 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63  iTab.** if the c
3b30: 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20  urrent N values 
3b40: 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41  are new..**.** A
3b50: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70   jump to addrRep
3b60: 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20  eat is made and 
3b70: 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61  the N+1 values a
3b80: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
3b90: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
3ba0: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
3bb0: 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e  s are not distin
3bc0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
3bd0: 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28  id codeDistinct(
3be0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3bf0: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
3c00: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
3c10: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
3c20: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
3c30: 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e       /* A sortin
3c40: 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  g index used to 
3c50: 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63  test for distinc
3c60: 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61  tness */.  int a
3c70: 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a  ddrRepeat,    /*
3c80: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
3c90: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f   not distinct */
3ca0: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
3cb0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3cc0: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  of elements */. 
3cd0: 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20   int iMem       
3ce0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65      /* First ele
3cf0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ment */.){.  Vdb
3d00: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a  e *v;.  int r1;.
3d10: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
3d20: 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c  Vdbe;.  r1 = sql
3d30: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
3d40: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
3d50: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
3d60: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d  P_MakeRecord, iM
3d70: 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71  em, N, r1);.  sq
3d80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
3d90: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
3da0: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 72  b, addrRepeat, r
3db0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
3dc0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
3dd0: 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72  xInsert, iTab, r
3de0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
3df0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
3e00: 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  se, r1);.}../*.*
3e10: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72  * Generate an er
3e20: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e  ror message when
3e30: 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65   a SELECT is use
3e40: 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78  d within a subex
3e50: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61  pression.** (exa
3e60: 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45  mple:  "a IN (SE
3e70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c  LECT * FROM tabl
3e80: 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20  e)") but it has 
3e90: 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75  more than 1 resu
3ea0: 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57  lt.** column.  W
3eb0: 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73  e do this in a s
3ec0: 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73  ubroutine becaus
3ed0: 65 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  e the error occu
3ee0: 72 73 20 69 6e 20 6d 75 6c 74 69 70 6c 65 0a 2a  rs in multiple.*
3ef0: 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f 0a 73 74 61  * places..*/.sta
3f00: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72  tic int checkFor
3f10: 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
3f20: 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20  tError(.  Parse 
3f30: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
3f40: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e  * Parse context.
3f50: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
3f60: 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65   *pDest,   /* De
3f70: 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c  stination of SEL
3f80: 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ECT results */. 
3f90: 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20   int nExpr      
3fa0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3fb0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
3fc0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  s returned by SE
3fd0: 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  LECT */.){.  int
3fe0: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
3ff0: 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78  eDest;.  if( nEx
4000: 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d  pr>1 && (eDest==
4010: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
4020: 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20  ==SRT_Set) ){.  
4030: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4040: 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20  g(pParse, "only 
4050: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
4060: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20  allowed for ".  
4070: 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74       "a SELECT t
4080: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
4090: 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
40a0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
40b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
40c0: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
40d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
40e0: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
40f0: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
4100: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
4110: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
4120: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
4130: 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61  ab and nColumn a
4140: 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68  re both zero, th
4150: 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78  en the pEList ex
4160: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
4170: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
4180: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
4190: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
41a0: 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a  .  If nColumn>0.
41b0: 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  ** then data is 
41c0: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
41d0: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
41e0: 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65   used only to ge
41f0: 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70  t the.** datatyp
4200: 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  es for each colu
4210: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
4220: 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  id selectInnerLo
4230: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
4240: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
4250: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
4260: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
4270: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
4280: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
4290: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
42a0: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
42b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
42c0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69  ist,       /* Li
42d0: 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69  st of values bei
42e0: 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ng extracted */.
42f0: 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20    int srcTab,   
4300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c            /* Pul
4310: 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  l data from this
4320: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
4330: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  nColumn,        
4340: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4350: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
4360: 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a  source table */.
4370: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
4380: 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20  erBy,     /* If 
4390: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72  not NULL, sort r
43a0: 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69  esults using thi
43b0: 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64  s key */.  int d
43c0: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20  istinct,        
43d0: 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61     /* If >=0, ma
43e0: 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74 73 20  ke sure results 
43f0: 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  are distinct */.
4400: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
4410: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77  est,      /* How
4420: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
4430: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
4440: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
4450: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
4460: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
4470: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
4480: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
4490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
44a0: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
44b0: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
44c0: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
44d0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
44e0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
44f0: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
4500: 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
4510: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
4520: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
4530: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
4540: 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20  regResult;      
4550: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
4560: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
4570: 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  ng result set */
4580: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
4590: 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f  Dest->eDest;   /
45a0: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
45b0: 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20   of results */. 
45c0: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
45d0: 73 74 2d 3e 69 50 61 72 6d 3b 20 20 20 2f 2a 20  st->iParm;   /* 
45e0: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
45f0: 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  o disposal metho
4600: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75  d */.  int nResu
4610: 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  ltCol;          
4620: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4630: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
4640: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  /..  assert( v )
4650: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
4660: 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
4670: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
4680: 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e  0 );.  hasDistin
4690: 63 74 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30  ct = distinct>=0
46a0: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
46b0: 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69  ==0 && !hasDisti
46c0: 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f  nct ){.    codeO
46d0: 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e  ffset(v, p, iCon
46e0: 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tinue);.  }..  /
46f0: 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65  * Pull the reque
4700: 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  sted columns..  
4710: 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  */.  if( nColumn
4720: 3e 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 75 6c  >0 ){.    nResul
4730: 74 43 6f 6c 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  tCol = nColumn;.
4740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65    }else{.    nRe
4750: 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74  sultCol = pEList
4760: 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69  ->nExpr;.  }.  i
4770: 66 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d  f( pDest->iMem==
4780: 30 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e  0 ){.    pDest->
4790: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
47a0: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 44 65 73 74  Mem+1;.    pDest
47b0: 2d 3e 6e 4d 65 6d 20 3d 20 6e 52 65 73 75 6c 74  ->nMem = nResult
47c0: 43 6f 6c 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Col;.    pParse-
47d0: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
47e0: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  Col;.  }else{ . 
47f0: 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74     assert( pDest
4800: 2d 3e 6e 4d 65 6d 3d 3d 6e 52 65 73 75 6c 74 43  ->nMem==nResultC
4810: 6f 6c 20 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52  ol );.  }.  regR
4820: 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69  esult = pDest->i
4830: 4d 65 6d 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 75  Mem;.  if( nColu
4840: 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  mn>0 ){.    for(
4850: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
4860: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
4870: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4880: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
4890: 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74  ab, i, regResult
48a0: 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  +i);.    }.  }el
48b0: 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52  se if( eDest!=SR
48c0: 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  T_Exists ){.    
48d0: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
48e0: 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53  ation is an EXIS
48f0: 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  TS(...) expressi
4900: 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20  on, the actual. 
4910: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74     ** values ret
4920: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
4930: 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75  ECT are not requ
4940: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
4950: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
4960: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4970: 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75   pEList, regResu
4980: 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  lt, eDest==SRT_O
4990: 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 43  utput);.  }.  nC
49a0: 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43  olumn = nResultC
49b0: 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ol;..  /* If the
49c0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
49d0: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
49e0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
49f0: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
4a00: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
4a10: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
4a20: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
4a30: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
4a40: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
4a50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44  .  */.  if( hasD
4a60: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61  istinct ){.    a
4a70: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
4a80: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
4a90: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e  pEList->nExpr==n
4aa0: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f  Column );.    co
4ab0: 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
4ac0: 65 2c 20 64 69 73 74 69 6e 63 74 2c 20 69 43 6f  e, distinct, iCo
4ad0: 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c  ntinue, nColumn,
4ae0: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
4af0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
4b00: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
4b10: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
4b20: 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  inue);.    }.  }
4b30: 0a 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72  ..  if( checkFor
4b40: 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
4b50: 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
4b60: 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Dest, pEList->nE
4b70: 78 70 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  xpr) ){.    retu
4b80: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rn;.  }..  switc
4b90: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
4ba0: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
4bb0: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
4bc0: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
4bd0: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
4be0: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
4bf0: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
4c00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4c10: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
4c20: 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54  ECT.    case SRT
4c30: 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20  _Union: {.      
4c40: 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31  int r1;.      r1
4c50: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
4c60: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
4c70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4c80: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
4c90: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
4ca0: 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b  t, nColumn, r1);
4cb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4cc0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4cd0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
4ce0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
4cf0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
4d00: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
4d10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4d20: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
4d30: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
4d40: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
4d50: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
4d60: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
4d70: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
4d80: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
4d90: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
4da0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
4db0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
4dc0: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
4dd0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
4de0: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
4df0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4e00: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
4e10: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
4e20: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
4e30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4e40: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  ndif..    /* Sto
4e50: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
4e60: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
4e70: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
4e80: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
4e90: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
4ea0: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
4eb0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
4ec0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
4ed0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
4ee0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4ef0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4f00: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
4f10: 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20  lumn, r1);.     
4f20: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
4f30: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
4f40: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
4f50: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29  pOrderBy, p, r1)
4f60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4f70: 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20         int r2 = 
4f80: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
4f90: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
4fa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4fb0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
4fc0: 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b  wid, iParm, r2);
4fd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4fe0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
4ff0: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
5000: 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  r1, r2);.       
5010: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5020: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
5030: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20  PPEND);.        
5040: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
5050: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
5060: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5070: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5080: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5090: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
50a0: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
50b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
50c0: 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77  UERY.    /* If w
50d0: 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
50e0: 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
50f0: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
5100: 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20  )" construct,.  
5110: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
5120: 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67  should be a sing
5130: 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  le item on the s
5140: 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69  tack.  Write thi
5150: 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e  s.    ** item in
5160: 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65  to the set table
5170: 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61   with bogus data
5180: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
5190: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
51a0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
51b0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70  mn==1 );.      p
51c0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
51d0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
51e0: 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ity(pEList->a[0]
51f0: 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61  .pExpr, pDest->a
5200: 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20  ffinity);.      
5210: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
5220: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69          /* At fi
5230: 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77  rst glance you w
5240: 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f  ould think we co
5250: 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74  uld optimize out
5260: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
5270: 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73  ORDER BY in this
5280: 20 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20   case since the 
5290: 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73  order of entries
52a0: 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20   in the set.    
52b0: 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
52c0: 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65  matter.  But the
52d0: 72 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49  re might be a LI
52e0: 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77  MIT clause, in w
52f0: 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
5300: 63 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64  case the order d
5310: 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20  oes matter */.  
5320: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
5330: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
5340: 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73  derBy, p, regRes
5350: 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ult);.      }els
5360: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
5370: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
5380: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5390: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
53a0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
53b0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
53c0: 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20 26 70 2d  sult, 1, r1, &p-
53d0: 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  >affinity, 1);. 
53e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
53f0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
5400: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
5410: 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20  gResult, 1);.   
5420: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5430: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
5440: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
5450: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
5460: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5470: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
5480: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5490: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
54a0: 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
54b0: 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
54c0: 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
54d0: 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
54e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
54f0: 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
5500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5510: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
5520: 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29  teger, 1, iParm)
5530: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
5540: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
5550: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
5560: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
5570: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5580: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
5590: 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
55a0: 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
55b0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
55c0: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
55d0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
55e0: 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
55f0: 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
5600: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
5610: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
5620: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
5630: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
5640: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5650: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
5660: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
5670: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
5680: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
5690: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
56a0: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
56b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
56c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
56d0: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
56e0: 52 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31  Result, iParm, 1
56f0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
5700: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
5710: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
5720: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
5730: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
5740: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
5750: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
5760: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5770: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
5780: 53 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f  Send the data to
5790: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
57a0: 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73  nction or to a s
57b0: 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74  ubroutine.  In t
57c0: 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f  he.    ** case o
57d0: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20  f a subroutine, 
57e0: 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
57f0: 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73  tself is respons
5800: 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ible for.    ** 
5810: 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  popping the data
5820: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
5830: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5840: 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 0a   SRT_Coroutine:.
5850: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
5860: 70 75 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  put: {.      if(
5870: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
5880: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
5890: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
58a0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
58b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
58c0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
58d0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
58e0: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
58f0: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
5900: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
5910: 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20  derBy, p, r1);. 
5920: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
5930: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
5940: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
5950: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d  }else if( eDest=
5960: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
5970: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5980: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5990: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
59a0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  iParm);.      }e
59b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
59c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
59d0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
59e0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
59f0: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
5a00: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
5a10: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
5a20: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  se, regResult, n
5a30: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
5a40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5a50: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
5a60: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
5a70: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
5a80: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
5a90: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
5aa0: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
5ab0: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
5ac0: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
5ad0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
5ae0: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
5af0: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
5b00: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
5b10: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
5b20: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
5b30: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
5b40: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
5b50: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
5b60: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
5b70: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
5b80: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5b90: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
5ba0: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
5bb0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5bc0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
5bd0: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
5be0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
5bf0: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
5c00: 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
5c10: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
5c20: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
5c30: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 20 20  pOrderBy==0 );  
5c40: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
5c50: 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  n ORDER BY, the 
5c60: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20  call to.        
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c80: 20 20 20 20 2a 2a 20 70 75 73 68 4f 6e 74 6f 53      ** pushOntoS
5c90: 6f 72 74 65 72 28 29 20 77 6f 75 6c 64 20 68 61  orter() would ha
5ca0: 76 65 20 63 6c 65 61 72 65 64 20 70 2d 3e 69 4c  ve cleared p->iL
5cb0: 69 6d 69 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  imit */.    sqli
5cc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5cd0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69   OP_AddImm, p->i
5ce0: 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
5cf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5d00: 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  2(v, OP_IfZero, 
5d10: 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
5d20: 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  k);.  }.}../*.**
5d30: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
5d40: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
5d50: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
5d60: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
5d70: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
5d80: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
5d90: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
5da0: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
5db0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
5dc0: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
5dd0: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
5de0: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
5df0: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
5e00: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
5e10: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
5e20: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
5e30: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
5e40: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
5e50: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
5e60: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
5e70: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
5e80: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
5e90: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
5ea0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
5eb0: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
5ec0: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
5ed0: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
5ee0: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
5ef0: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
5f00: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
5f10: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
5f20: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5f30: 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20   is obtain from 
5f40: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
5f50: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
5f60: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
5f70: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
5f80: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
5f90: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
5fa0: 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20  freed.  Add the 
5fb0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
5fc0: 65 20 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c  e to the P4 fiel
5fd0: 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75  d of an opcode u
5fe0: 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e  sing.** P4_KEYIN
5ff0: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68  FO_HANDOFF is th
6000: 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64  e usual way of d
6010: 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73  ealing with this
6020: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
6030: 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d  nfo *keyInfoFrom
6040: 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a  ExprList(Parse *
6050: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
6060: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pList){.  sqli
6070: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6080: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70  ->db;.  int nExp
6090: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
60a0: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78  nfo;.  struct Ex
60b0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
60c0: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  em;.  int i;..  
60d0: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
60e0: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
60f0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
6100: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
6110: 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28  pInfo) + nExpr*(
6120: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
6130: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  +1) );.  if( pIn
6140: 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  fo ){.    pInfo-
6150: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
6160: 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  8*)&pInfo->aColl
6170: 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e  [nExpr];.    pIn
6180: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31  fo->nField = (u1
6190: 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e  6)nExpr;.    pIn
61a0: 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  fo->enc = ENC(db
61b0: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 64 62  );.    pInfo->db
61c0: 20 3d 20 64 62 3b 0a 20 20 20 20 66 6f 72 28 69   = db;.    for(i
61d0: 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
61e0: 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  >a; i<nExpr; i++
61f0: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
6200: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
6210: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
6220: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
6230: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
6240: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
6250: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
6260: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
6270: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
6280: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f     }.      pInfo
6290: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
62a0: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
62b0: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
62c0: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
62d0: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
62e0: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
62f0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
6300: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
6310: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
6320: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
6330: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
6340: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
6350: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
6360: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
6370: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
6380: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
6390: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
63a0: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
63b0: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
63c0: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
63d0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
63e0: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
63f0: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
6400: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
6410: 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61  teSortTail(.  Pa
6420: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
6430: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
6440: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
6450: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
6460: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6470: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20  t */.  Vdbe *v, 
6480: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
6490: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
64a0: 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e  his VDBE */.  in
64b0: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t nColumn,      
64c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
64d0: 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a  umns of data */.
64e0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
64f0: 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65  est /* Write the
6500: 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20   sorted results 
6510: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
6520: 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c   addrBreak = sql
6530: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
6540: 6c 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d  l(v);     /* Jum
6550: 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c  p here to exit l
6560: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
6570: 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  rContinue = sqli
6580: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
6590: 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65  (v);  /* Jump he
65a0: 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c  re for next cycl
65b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b  e */.  int addr;
65c0: 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69  .  int iTab;.  i
65d0: 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30  nt pseudoTab = 0
65e0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
65f0: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
6600: 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65  erBy;..  int eDe
6610: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
6620: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
6630: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a   pDest->iParm;..
6640: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
6650: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20  int regRowid;.. 
6660: 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79   iTab = pOrderBy
6670: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66  ->iECursor;.  if
6680: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
6690: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
66a0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
66b0: 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70     pseudoTab = p
66c0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
66d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
66e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
66f0: 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62  seudo, pseudoTab
6700: 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  , eDest==SRT_Out
6710: 70 75 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  put, nColumn);. 
6720: 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20   }.  addr = 1 + 
6730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6740: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54  2(v, OP_Sort, iT
6750: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
6760: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
6770: 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  p, addrContinue)
6780: 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c  ;.  regRow = sql
6790: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
67a0: 50 61 72 73 65 29 3b 0a 20 20 72 65 67 52 6f 77  Parse);.  regRow
67b0: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
67c0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
67d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
67e0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
67f0: 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79  , iTab, pOrderBy
6800: 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20 72 65 67  ->nExpr + 1, reg
6810: 52 6f 77 29 3b 0a 20 20 73 77 69 74 63 68 28 20  Row);.  switch( 
6820: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73  eDest ){.    cas
6830: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
6840: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
6850: 61 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ab: {.      test
6860: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
6870: 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
6880: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
6890: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
68a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
68b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
68c0: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
68d0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
68e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
68f0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
6900: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20   iParm, regRow, 
6910: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
6920: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6930: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
6940: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72  PPEND);.      br
6950: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
6960: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
6970: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
6980: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
6990: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
69a0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
69b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
69c0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
69d0: 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67  , regRow, 1, reg
69e0: 52 6f 77 69 64 2c 20 26 70 2d 3e 61 66 66 69 6e  Rowid, &p->affin
69f0: 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ity, 1);.      s
6a00: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
6a10: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
6a20: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29  arse, regRow, 1)
6a30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6a40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6a50: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
6a60: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
6a70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6a80: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
6a90: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
6aa0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
6ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6ac0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
6ad0: 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c  , regRow, iParm,
6ae0: 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
6af0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
6b00: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
6b10: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
6b20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6b30: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
6b40: 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 0a  ase SRT_Output:.
6b50: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
6b60: 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
6b70: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 74 65 73  int i;.      tes
6b80: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
6b90: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
6ba0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
6bb0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
6bc0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
6bd0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6be0: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65  P_Integer, 1, re
6bf0: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
6c00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6c10: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
6c20: 73 65 75 64 6f 54 61 62 2c 20 72 65 67 52 6f 77  seudoTab, regRow
6c30: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
6c40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
6c50: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
6c60: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67       assert( reg
6c70: 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69 4d 65 6d  Row!=pDest->iMem
6c80: 2b 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  +i );.        sq
6c90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6ca0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73  v, OP_Column, ps
6cb0: 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73  eudoTab, i, pDes
6cc0: 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20  t->iMem+i);.    
6cd0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44    }.      if( eD
6ce0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
6cf0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6d00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6d10: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44  OP_ResultRow, pD
6d20: 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75  est->iMem, nColu
6d30: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
6d40: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
6d50: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
6d60: 73 65 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c  se, pDest->iMem,
6d70: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
6d80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6d90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6da0: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
6db0: 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20  Dest->iParm);.  
6dc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6dd0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
6de0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
6df0: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
6e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6e10: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
6e20: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6e30: 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20  arse, regRow);. 
6e40: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
6e50: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
6e60: 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20  egRowid);..  /* 
6e70: 4c 49 4d 49 54 20 68 61 73 20 62 65 65 6e 20 69  LIMIT has been i
6e80: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68  mplemented by th
6e90: 65 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  e pushOntoSorter
6ea0: 28 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f  () routine..  */
6eb0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 4c  .  assert( p->iL
6ec0: 69 6d 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  imit==0 );..  /*
6ed0: 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   The bottom of t
6ee0: 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  he loop.  */.  s
6ef0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
6f00: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f  eLabel(v, addrCo
6f10: 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74  ntinue);.  sqlit
6f20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6f30: 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
6f40: 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ddr);.  sqlite3V
6f50: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
6f60: 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  v, addrBreak);. 
6f70: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
6f80: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
6f90: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
6fa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6fb0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
6fc0: 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  ose, pseudoTab, 
6fd0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
6fe0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
6ff0: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f  r to a string co
7000: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65  ntaining the 'de
7010: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20  claration type' 
7020: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
7030: 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20  sion pExpr. The 
7040: 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72  string may be tr
7050: 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20  eated as static 
7060: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
7070: 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61  *.** The declara
7080: 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65  tion type is the
7090: 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20   exact datatype 
70a0: 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61  definition extra
70b0: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  cted from the.**
70c0: 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45   original CREATE
70d0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
70e0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
70f0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
7100: 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69  The.** declarati
7110: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f  on type for a RO
7120: 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54  WID field is INT
7130: 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68  EGER. Exactly wh
7140: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
7150: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
7160: 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  d a column can b
7170: 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65  e complex in the
7180: 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62   presence of sub
7190: 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20  queries. The.** 
71a0: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
71b0: 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20  ssion in all of 
71c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45  the following SE
71d0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
71e0: 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  is .** considere
71f0: 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68  d a column by th
7200: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
7210: 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20  **   SELECT col 
7220: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
7230: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
7240: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
7250: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
7260: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  col FROM tbl);.*
7270: 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46  *   SELECT abc F
7280: 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ROM (SELECT col 
7290: 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29  AS abc FROM tbl)
72a0: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63  ;.** .** The dec
72b0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
72c0: 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  r any expression
72d0: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
72e0: 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  lumn is NULL..*/
72f0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
7300: 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a  ar *columnType(.
7310: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
7320: 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  NC, .  Expr *pEx
7330: 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pr,.  const char
7340: 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20   **pzOriginDb,. 
7350: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
7360: 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e  OriginTab,.  con
7370: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
7380: 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20  inCol.){.  char 
7390: 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30  const *zType = 0
73a0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
73b0: 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20  zOriginDb = 0;. 
73c0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
73d0: 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63  iginTab = 0;.  c
73e0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
73f0: 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  inCol = 0;.  int
7400: 20 6a 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d   j;.  if( pExpr=
7410: 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c  =0 || pNC->pSrcL
7420: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
7430: 30 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  0;..  switch( pE
7440: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
7450: 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
7460: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
7470: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  OLUMN: {.      /
7480: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
7490: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f   is a column. Lo
74a0: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74  cate the table t
74b0: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69  he column is bei
74c0: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72  ng.      ** extr
74d0: 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61  acted from in Na
74e0: 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69  meContext.pSrcLi
74f0: 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d  st. This table m
7500: 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20  ay be real.     
7510: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62   ** database tab
7520: 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79  le or a subquery
7530: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
7540: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
7550: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7560: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
7570: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
7580: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
7590: 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30    Select *pS = 0
75a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
75b0: 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75   Select the colu
75c0: 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20  mn is extracted 
75d0: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e  from */.      in
75e0: 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e  t iCol = pExpr->
75f0: 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64  iColumn;  /* Ind
7600: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  ex of column in 
7610: 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68  pTab */.      wh
7620: 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61  ile( pNC && !pTa
7630: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63  b ){.        Src
7640: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
7650: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
7660: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
7670: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
7680: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
7690: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70  j].iCursor!=pExp
76a0: 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a  r->iTable;j++);.
76b0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54          if( j<pT
76c0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a  abList->nSrc ){.
76d0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d            pTab =
76e0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
76f0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
7700: 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  pS = pTabList->a
7710: 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  [j].pSelect;.   
7720: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7730: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
7740: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
7750: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
7760: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
7770: 20 20 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d          /* FIX M
7780: 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  E:.        ** Th
7790: 69 73 20 63 61 6e 20 6f 63 63 75 72 73 20 69 66  is can occurs if
77a0: 20 79 6f 75 20 68 61 76 65 20 73 6f 6d 65 74 68   you have someth
77b0: 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c 45 43 54  ing like "SELECT
77c0: 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a   new.x;" inside.
77d0: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69          ** a tri
77e0: 67 67 65 72 2e 20 20 49 6e 20 6f 74 68 65 72 20  gger.  In other 
77f0: 77 6f 72 64 73 2c 20 69 66 20 79 6f 75 20 72 65  words, if you re
7800: 66 65 72 65 6e 63 65 20 74 68 65 20 73 70 65 63  ference the spec
7810: 69 61 6c 20 22 6e 65 77 22 0a 20 20 20 20 20 20  ial "new".      
7820: 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74 68    ** table in th
7830: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
7840: 61 20 73 65 6c 65 63 74 2e 20 20 57 65 20 64 6f  a select.  We do
7850: 20 6e 6f 74 20 68 61 76 65 20 61 20 67 6f 6f 64   not have a good
7860: 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20   way.        ** 
7870: 74 6f 20 66 69 6e 64 20 74 68 65 20 61 63 74 75  to find the actu
7880: 61 6c 20 74 61 62 6c 65 20 74 79 70 65 2c 20 73  al table type, s
7890: 6f 20 63 61 6c 6c 20 69 74 20 22 54 45 58 54 22  o call it "TEXT"
78a0: 2e 20 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c  .  This is reall
78b0: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d  y.        ** som
78c0: 65 74 68 69 6e 67 20 6f 66 20 61 20 62 75 67 2c  ething of a bug,
78d0: 20 62 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e   but I do not kn
78e0: 6f 77 20 68 6f 77 20 74 6f 20 66 69 78 20 69 74  ow how to fix it
78f0: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
7900: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
7910: 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75  e does not produ
7920: 63 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61  ce the correct a
7930: 6e 73 77 65 72 20 2d 20 69 74 20 6a 75 73 74 20  nswer - it just 
7940: 70 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20  prevents.       
7950: 20 2a 2a 20 61 20 73 65 67 66 61 75 6c 74 2e 20   ** a segfault. 
7960: 20 53 65 65 20 74 69 63 6b 65 74 20 23 31 32 32   See ticket #122
7970: 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  9..        */.  
7980: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54        zType = "T
7990: 45 58 54 22 3b 0a 20 20 20 20 20 20 20 20 62 72  EXT";.        br
79a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
79b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
79c0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
79d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
79e0: 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63  he "table" is ac
79f0: 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c  tually a sub-sel
7a00: 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e  ect or a view in
7a10: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
7a20: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
7a30: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
7a40: 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ent. Return the 
7a50: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
7a60: 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20   and origin.    
7a70: 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20      ** data for 
7a80: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63  the result-set c
7a90: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62  olumn of the sub
7aa0: 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20  -select..       
7ab0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
7ac0: 41 4c 57 41 59 53 28 69 43 6f 6c 3e 3d 30 20 26  ALWAYS(iCol>=0 &
7ad0: 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73  & iCol<pS->pELis
7ae0: 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
7af0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
7b00: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
7b10: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
7b20: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
7b30: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
7b40: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
7b50: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
7b60: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
7b70: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
7b80: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
7b90: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
7ba0: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
7bb0: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
7bc0: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  LL..          */
7bd0: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
7be0: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
7bf0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
7c00: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43  pS->pEList->a[iC
7c10: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ol].pExpr;.     
7c20: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
7c30: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
7c40: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78          sNC.pNex
7c50: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
7c60: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
7c70: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
7c80: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
7c90: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
7ca0: 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f   &zOriginDb, &zO
7cb0: 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67  riginTab, &zOrig
7cc0: 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20  inCol); .       
7cd0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
7ce0: 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 2d 3e  f( ALWAYS(pTab->
7cf0: 70 53 63 68 65 6d 61 29 20 29 7b 0a 20 20 20 20  pSchema) ){.    
7d00: 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61      /* A real ta
7d10: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ble */.        a
7d20: 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20  ssert( !pS );.  
7d30: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
7d40: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
7d50: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61  iPKey;.        a
7d60: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
7d70: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
7d80: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
7d90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
7da0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
7db0: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
7dc0: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20  GER";.          
7dd0: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f  zOriginCol = "ro
7de0: 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  wid";.        }e
7df0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
7e00: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
7e10: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
7e20: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e           zOrigin
7e30: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
7e40: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
7e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7e60: 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54 61  zOriginTab = pTa
7e70: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
7e80: 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73    if( pNC->pPars
7e90: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
7ea0: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
7eb0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e  SchemaToIndex(pN
7ec0: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  C->pParse->db, p
7ed0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
7ee0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e           zOrigin
7ef0: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
7f00: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
7f10: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
7f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
7f30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
7f40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
7f50: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
7f60: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
7f70: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
7f80: 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73  ssion is a sub-s
7f90: 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68  elect. Return th
7fa0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
7fb0: 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  pe and.      ** 
7fc0: 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20  origin info for 
7fd0: 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  the single colum
7fe0: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
7ff0: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
8000: 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  T.      ** state
8010: 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
8020: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
8030: 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65   sNC;.      Sele
8040: 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e  ct *pS = pExpr->
8050: 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
8060: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
8070: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
8080: 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
8090: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
80a0: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
80b0: 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
80c0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
80d0: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e  ->pSrc;.      sN
80e0: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
80f0: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
8100: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
8110: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
8120: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
8130: 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f   &zOriginDb, &zO
8140: 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67  riginTab, &zOrig
8150: 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62  inCol); .      b
8160: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
8170: 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20  if.  }.  .  if( 
8180: 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a 20 20  pzOriginDb ){.  
8190: 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67    assert( pzOrig
81a0: 69 6e 54 61 62 20 26 26 20 70 7a 4f 72 69 67 69  inTab && pzOrigi
81b0: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f  nCol );.    *pzO
81c0: 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69 67 69  riginDb = zOrigi
81d0: 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  nDb;.    *pzOrig
81e0: 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69 6e 54  inTab = zOriginT
81f0: 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69  ab;.    *pzOrigi
8200: 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e 43 6f  nCol = zOriginCo
8210: 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  l;.  }.  return 
8220: 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zType;.}../*.** 
8230: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
8240: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
8250: 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72   VDBE the declar
8260: 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63  ation types of c
8270: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
8280: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
8290: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
82a0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
82b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
82c0: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
82d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
82e0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
82f0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
8300: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
8310: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
8320: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
8330: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
8340: 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  set */.){.#ifnde
8350: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
8360: 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76  CLTYPE.  Vdbe *v
8370: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
8380: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  ;.  int i;.  Nam
8390: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
83a0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
83b0: 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70  TabList;.  sNC.p
83c0: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
83d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
83e0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
83f0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
8400: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
8410: 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  pr;.    const ch
8420: 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65  ar *zType;.#ifde
8430: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8440: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
8450: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8460: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20  zOrigDb = 0;.   
8470: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
8480: 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63  igTab = 0;.    c
8490: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
84a0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79  Col = 0;.    zTy
84b0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
84c0: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
84d0: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
84e0: 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f  OrigCol);..    /
84f0: 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20  * The vdbe must 
8500: 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70  make its own cop
8510: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  y of the column-
8520: 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a  type and other .
8530: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70      ** column sp
8540: 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20  ecific strings, 
8550: 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65  in case the sche
8560: 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f  ma is reset befo
8570: 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76  re this.    ** v
8580: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69  irtual machine i
8590: 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  s deleted..    *
85a0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
85b0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
85c0: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41  , COLNAME_DATABA
85d0: 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c  SE, zOrigDb, SQL
85e0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
85f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8600: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8610: 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a  COLNAME_TABLE, z
8620: 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f  OrigTab, SQLITE_
8630: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
8640: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8650: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8660: 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69  AME_COLUMN, zOri
8670: 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  gCol, SQLITE_TRA
8680: 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20  NSIENT);.#else. 
8690: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
86a0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
86b0: 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  , 0, 0);.#endif.
86c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
86d0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
86e0: 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45  COLNAME_DECLTYPE
86f0: 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f  , zType, SQLITE_
8700: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
8710: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8720: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 20 2a  _OMIT_DECLTYPE *
8730: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  /.}../*.** Gener
8740: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
8750: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
8760: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f   the names of co
8770: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
8780: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69  result set.  Thi
8790: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
87a0: 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65   used to provide
87b0: 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20   the.** azCol[] 
87c0: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61  values in the ca
87d0: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
87e0: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
87f0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
8800: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8810: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
8820: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
8830: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
8840: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
8850: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
8860: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
8870: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
8880: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
8890: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
88a0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
88b0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71    int i, j;.  sq
88c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
88d0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75  se->db;.  int fu
88e0: 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61  llNames, shortNa
88f0: 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  mes;..#ifndef SQ
8900: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
8910: 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
8920: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
8930: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
8940: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
8950: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
8960: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
8970: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
8980: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
8990: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
89a0: 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64  NEVER(v==0) || d
89b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
89c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
89d0: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
89e0: 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73  = 1;.  fullNames
89f0: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
8a00: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
8a10: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74  mes)!=0;.  short
8a20: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
8a30: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
8a40: 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  tColNames)!=0;. 
8a50: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
8a60: 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74  umCols(v, pEList
8a70: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28  ->nExpr);.  for(
8a80: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
8a90: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
8aa0: 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d  Expr *p;.    p =
8ab0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
8ac0: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  xpr;.    if( p==
8ad0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
8ae0: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
8af0: 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
8b00: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
8b10: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8b20: 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  me;.      sqlite
8b30: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8b40: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8b50: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
8b60: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
8b70: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e    }else if( (p->
8b80: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
8b90: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43   p->op==TK_AGG_C
8ba0: 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69  OLUMN) && pTabLi
8bb0: 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  st ){.      Tabl
8bc0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63  e *pTab;.      c
8bd0: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
8be0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69   int iCol = p->i
8bf0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f  Column;.      fo
8c00: 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c  r(j=0; ALWAYS(j<
8c10: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b  pTabList->nSrc);
8c20: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
8c30: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  f( pTabList->a[j
8c40: 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54  ].iCursor==p->iT
8c50: 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  able ) break;.  
8c60: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
8c70: 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  rt( j<pTabList->
8c80: 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54  nSrc );.      pT
8c90: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
8ca0: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
8cb0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
8cc0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
8cd0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
8ce0: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
8cf0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
8d00: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
8d10: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
8d20: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
8d30: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
8d40: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
8d50: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
8d60: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
8d70: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
8d80: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
8d90: 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  lNames ){.      
8da0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8db0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8dc0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
8dd0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8de0: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
8df0: 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20  har*)p->span.z, 
8e00: 70 2d 3e 73 70 61 6e 2e 6e 29 2c 20 53 51 4c 49  p->span.n), SQLI
8e10: 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  TE_DYNAMIC);.   
8e20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c     }else if( ful
8e30: 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  lNames ){.      
8e40: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
8e50: 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  0;.        zName
8e60: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
8e70: 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70  f(db, "%s.%s", p
8e80: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Tab->zName, zCol
8e90: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
8ea0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8eb0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
8ec0: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
8ed0: 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  TE_DYNAMIC);.   
8ee0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8ef0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8f00: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8f10: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c  LNAME_NAME, zCol
8f20: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
8f30: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NT);.      }.   
8f40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
8f50: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8f60: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8f70: 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20  E_NAME, .       
8f80: 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e     sqlite3DbStrN
8f90: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
8fa0: 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61  ->span.z, p->spa
8fb0: 6e 2e 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e  n.n), SQLITE_DYN
8fc0: 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
8fd0: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
8fe0: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
8ff0: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
9000: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
9010: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
9020: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e  D_SELECT./*.** N
9030: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ame of the conne
9040: 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20  ction operator, 
9050: 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
9060: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
9070: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  ic const char *s
9080: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20  electOpName(int 
9090: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  id){.  char *z;.
90a0: 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a    switch( id ){.
90b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
90c0: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
90d0: 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b  N ALL";   break;
90e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
90f0: 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54  ERSECT: z = "INT
9100: 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b  ERSECT";   break
9110: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ;.    case TK_EX
9120: 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58  CEPT:    z = "EX
9130: 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61  CEPT";      brea
9140: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
9150: 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55            z = "U
9160: 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65  NION";       bre
9170: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
9180: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
9190: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
91a0: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
91b0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e  /*.** Given a an
91c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
91d0: 20 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c   (which is reall
91e0: 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  y the list of ex
91f0: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
9200: 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c  t form the resul
9210: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
9220: 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d  T statement) com
9230: 70 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65  pute appropriate
9240: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  .** column names
9250: 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61   for a table tha
9260: 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  t would hold the
9270: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
9280: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75  ..**.** All colu
9290: 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65  mn names will be
92a0: 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f   unique..**.** O
92b0: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
92c0: 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65  ames are compute
92d0: 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  d.  Column.zType
92e0: 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a  , Column.zColl,.
92f0: 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
9300: 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72  lds of Column ar
9310: 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
9320: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
9330: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
9340: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
9350: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
9360: 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c  s,.** store NULL
9370: 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30   in *paCol and 0
9380: 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72   in *pnCol and r
9390: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
93a0: 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EM..*/.static in
93b0: 74 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46  t selectColumnsF
93c0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50  romExprList(.  P
93d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
93e0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
93f0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
9400: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
9410: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c         /* Expr l
9420: 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ist from which t
9430: 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20  o derive column 
9440: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  names */.  int *
9450: 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  pnCol,          
9460: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
9470: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
9480: 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75  s here */.  Colu
9490: 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20  mn **paCol      
94a0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
94b0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   new column list
94c0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71   here */.){.  sq
94d0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
94e0: 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74  se->db;   /* Dat
94f0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
9500: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
9530: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  rs */.  int cnt;
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9550: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64      /* Index add
9560: 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e  ed to make the n
9570: 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20  ame unique */.  
9580: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70  Column *aCol, *p
9590: 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  Col;        /* F
95a0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
95b0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
95c0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20  /.  int nCol;   
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
95f0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
9600: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72  lt set */.  Expr
9610: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
9620: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
9630: 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67  ssion for a sing
9640: 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  le result column
9650: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
9660: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9670: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
9680: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96a0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d    /* Size of nam
96b0: 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a  e in zName[] */.
96c0: 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  .  *pnCol = nCol
96d0: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
96e0: 3b 0a 20 20 61 43 6f 6c 20 3d 20 2a 70 61 43 6f  ;.  aCol = *paCo
96f0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  l = sqlite3DbMal
9700: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
9710: 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c  of(aCol[0])*nCol
9720: 29 3b 0a 20 20 69 66 28 20 61 43 6f 6c 3d 3d 30  );.  if( aCol==0
9730: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
9740: 5f 4e 4f 4d 45 4d 3b 0a 20 20 66 6f 72 28 69 3d  _NOMEM;.  for(i=
9750: 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c  0, pCol=aCol; i<
9760: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
9770: 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61  +){.    /* Get a
9780: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
9790: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
97a0: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
97b0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
97c0: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
97d0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c   p->pRight==0 ||
97e0: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
97f0: 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  n.z==0 || p->pRi
9800: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21  ght->token.z[0]!
9810: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  =0 );.    if( (z
9820: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
9830: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
9840: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
9850: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
9860: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
9870: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
9880: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
9890: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
98a0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
98b0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
98c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
98d0: 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b  r *pColExpr = p;
98e0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
98f0: 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20  ion that is the 
9900: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61  result column na
9910: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c  me */.      Tabl
9920: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
9930: 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69   /* Table associ
9940: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65  ated with this e
9950: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
9960: 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78     while( pColEx
9970: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pr->op==TK_DOT )
9980: 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c   pColExpr = pCol
9990: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
99a0: 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72      if( pColExpr
99b0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
99c0: 26 26 20 28 70 54 61 62 20 3d 20 70 43 6f 6c 45  && (pTab = pColE
99d0: 78 70 72 2d 3e 70 54 61 62 29 21 3d 30 20 29 7b  xpr->pTab)!=0 ){
99e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
99f0: 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20  columns use the 
9a00: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65  column name name
9a10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
9a20: 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d  iCol = pColExpr-
9a30: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
9a40: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
9a50: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
9a60: 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  y;.        zName
9a70: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
9a80: 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20 20 20  f(db, "%s",.    
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f               iCo
9aa0: 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f  l>=0 ? pTab->aCo
9ab0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20  l[iCol].zName : 
9ac0: 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20  "rowid");.      
9ad0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
9ae0: 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e  * Use the origin
9af0: 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  al text of the c
9b00: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
9b10: 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a   as its name */.
9b20: 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70          Token *p
9b30: 54 6f 6b 65 6e 20 3d 20 28 70 43 6f 6c 45 78 70  Token = (pColExp
9b40: 72 2d 3e 73 70 61 6e 2e 7a 3f 26 70 43 6f 6c 45  r->span.z?&pColE
9b50: 78 70 72 2d 3e 73 70 61 6e 3a 26 70 43 6f 6c 45  xpr->span:&pColE
9b60: 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  xpr->token);.   
9b70: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
9b80: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
9b90: 22 25 54 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  "%T", pToken);. 
9ba0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9bb0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
9bc0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73  ailed ){.      s
9bd0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9be0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62   zName);.      b
9bf0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9c00: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
9c10: 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  Name);..    /* M
9c20: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
9c30: 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
9c40: 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
9c50: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
9c60: 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20      ** append a 
9c70: 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e  integer to the n
9c80: 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62  ame so that it b
9c90: 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20  ecomes unique.. 
9ca0: 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20     */.    nName 
9cb0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
9cc0: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  0(zName);.    fo
9cd0: 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20  r(j=cnt=0; j<i; 
9ce0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
9cf0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61  sqlite3StrICmp(a
9d00: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  Col[j].zName, zN
9d10: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
9d20: 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d     char *zNewNam
9d30: 65 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  e;.        zName
9d40: 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20  [nName] = 0;.   
9d50: 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20       zNewName = 
9d60: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
9d70: 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d  b, "%s:%d", zNam
9d80: 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  e, ++cnt);.     
9d90: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9da0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
9db0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65       zName = zNe
9dc0: 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a  wName;.        j
9dd0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69   = -1;.        i
9de0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72  f( zName==0 ) br
9df0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9e00: 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61   }.    pCol->zNa
9e10: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  me = zName;.  }.
9e20: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
9e30: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f  Failed ){.    fo
9e40: 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  r(j=0; j<i; j++)
9e50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
9e60: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a  bFree(db, aCol[j
9e70: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
9e80: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9e90: 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20  e(db, aCol);.   
9ea0: 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *paCol = 0;.   
9eb0: 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *pnCol = 0;.   
9ec0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
9ed0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OMEM;.  }.  retu
9ee0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9ef0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20  ./*.** Add type 
9f00: 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
9f10: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63  formation to a c
9f20: 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64  olumn list based
9f30: 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20   on.** a SELECT 
9f40: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a  statement..** .*
9f50: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
9f60: 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d  t presumably cam
9f70: 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c  e from selectCol
9f80: 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72  umnNamesFromExpr
9f90: 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63  List()..** The c
9fa0: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f  olumn list has o
9fb0: 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74  nly names, not t
9fc0: 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f  ypes or collatio
9fd0: 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ns.  This.** rou
9fe0: 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67  tine goes throug
9ff0: 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74  h and adds the t
a000: 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ypes and collati
a010: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
a020: 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73  routine requires
a030: 20 74 68 61 74 20 61 6c 6c 20 69 6e 64 65 6e 74   that all indent
a040: 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45  ifiers in the SE
a050: 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
a060: 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  t be resolved..*
a070: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
a080: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
a090: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20  eAndCollation(. 
a0a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a0b0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
a0c0: 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20  g contexts */.  
a0d0: 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  int nCol,       
a0e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a0f0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  of columns */.  
a100: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20  Column *aCol,   
a110: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
a120: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53 65   columns */.  Se
a130: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
a140: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73      /* SELECT us
a150: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
a160: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
a170: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ions */.){.  sql
a180: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
a190: 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e  e->db;.  NameCon
a1a0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75  text sNC;.  Colu
a1b0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c  mn *pCol;.  Coll
a1c0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
a1d0: 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  t i;.  Expr *p;.
a1e0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
a1f0: 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73  t_item *a;..  as
a200: 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30  sert( pSelect!=0
a210: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
a220: 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
a230: 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21   & SF_Resolved)!
a240: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
a250: 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70  nCol==pSelect->p
a260: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20  EList->nExpr || 
a270: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a280: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
a290: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
a2a0: 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  urn;.  memset(&s
a2b0: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
a2c0: 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  C));.  sNC.pSrcL
a2d0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
a2e0: 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65  Src;.  a = pSele
a2f0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  ct->pEList->a;. 
a300: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
a310: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  Col; i<nCol; i++
a320: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70  , pCol++){.    p
a330: 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
a340: 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d     pCol->zType =
a350: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
a360: 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28  (db, columnType(
a370: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
a380: 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  ));.    pCol->af
a390: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
a3a0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
a3b0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
a3c0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
a3d0: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
a3e0: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
a3f0: 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d     pCol->zColl =
a400: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
a410: 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  (db, pColl->zNam
a420: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
a430: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53  ./*.** Given a S
a440: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
a450: 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c   generate a Tabl
a460: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
a470: 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68   describes.** th
a480: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
a490: 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  that SELECT..*/.
a4a0: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65  Table *sqlite3Re
a4b0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
a4c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
a4d0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
a4e0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
a4f0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a500: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
a510: 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20  t savedFlags;.. 
a520: 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62   savedFlags = db
a530: 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66  ->flags;.  db->f
a540: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
a550: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  FullColNames;.  
a560: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
a570: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
a580: 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  s;.  sqlite3Sele
a590: 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70  ctPrep(pParse, p
a5a0: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
a5b0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
a5c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69   return 0;.  whi
a5d0: 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
a5e0: 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20  ior ) pSelect = 
a5f0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
a600: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73  .  db->flags = s
a610: 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61  avedFlags;.  pTa
a620: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
a630: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
a640: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
a650: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
a660: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
a670: 20 20 70 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b    pTab->db = db;
a680: 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20  .  pTab->nRef = 
a690: 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
a6a0: 20 3d 20 30 3b 0a 20 20 73 65 6c 65 63 74 43 6f   = 0;.  selectCo
a6b0: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
a6c0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
a6d0: 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  t->pEList, &pTab
a6e0: 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
a6f0: 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64  Col);.  selectAd
a700: 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
a710: 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
a720: 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62  pTab->nCol, pTab
a730: 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 65 63 74 29  ->aCol, pSelect)
a740: 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  ;.  pTab->iPKey 
a750: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e  = -1;.  if( db->
a760: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
a770: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
a780: 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a 20 20  eTable(pTab);.  
a790: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
a7a0: 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
a7b0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
a7c0: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
a7d0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
a7e0: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
a7f0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
a800: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
a810: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
a820: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
a830: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
a840: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
a850: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
a860: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
a870: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
a880: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
a890: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
a8a0: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
a8b0: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
a8c0: 61 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64  arse->db);.#ifnd
a8d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
a8e0: 52 41 43 45 0a 20 20 20 20 69 66 28 20 76 20 29  RACE.    if( v )
a8f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
a900: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
a910: 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65  Trace);.    }.#e
a920: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
a930: 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  n v;.}.../*.** C
a940: 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
a950: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
a960: 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
a970: 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
a980: 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  ** pLimit and pO
a990: 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  ffset expression
a9a0: 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  s.  pLimit and p
a9b0: 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20  Offset hold the 
a9c0: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
a9d0: 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  hat appear in th
a9e0: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
a9f0: 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74  tatement after t
aa00: 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
aa10: 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e  SET.** keywords.
aa20: 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f    Or NULL if tho
aa30: 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
aa40: 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20  omitted. iLimit 
aa50: 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20  and iOffset .** 
aa60: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
aa70: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
aa80: 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e  numbers for coun
aa90: 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ters used to com
aaa0: 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d  pute .** the lim
aab0: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
aac0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
aad0: 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
aae0: 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69  et, then .** iLi
aaf0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
ab00: 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
ab10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ab20: 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
ab30: 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e  ues of iLimit an
ab40: 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
ab50: 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
ab60: 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
ab70: 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20  d by pLimit and 
ab80: 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74  pOffset.  iLimit
ab90: 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20   and.** iOffset 
aba0: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
abb0: 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
abc0: 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
abd0: 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c  alues.** (usuall
abe0: 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73  y but not always
abf0: 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61   -1) prior to ca
ac00: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
ac10: 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70  ne..** Only if p
ac20: 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66  Limit!=0 or pOff
ac30: 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  set!=0 do the li
ac40: 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
ac50: 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
ac60: 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
ac70: 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
ac80: 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
ac90: 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
aca0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
acb0: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
acc0: 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
acd0: 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
ace0: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
acf0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
ad00: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
ad10: 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
ad20: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
ad30: 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
ad40: 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
ad50: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
ad60: 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
ad70: 61 64 64 72 31 3b 0a 20 20 69 66 28 20 70 2d 3e  addr1;.  if( p->
ad80: 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b  iLimit ) return;
ad90: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49  ..  /* .  ** "LI
ada0: 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73  MIT -1" always s
adb0: 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20  hows all rows.  
adc0: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20  There is some.  
add0: 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20 61  ** contraversy a
ade0: 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f  bout what the co
adf0: 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73  rrect behavior s
ae00: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54  hould be..  ** T
ae10: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
ae20: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70  mentation interp
ae30: 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74  rets "LIMIT 0" t
ae40: 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72  o mean.  ** no r
ae50: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ows..  */.  if( 
ae60: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
ae70: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69   p->iLimit = iLi
ae80: 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  mit = ++pParse->
ae90: 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71  nMem;.    v = sq
aea0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
aeb0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
aec0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
aed0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
aee0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d  (pParse, p->pLim
aef0: 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  it, iLimit);.   
af00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
af10: 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
af20: 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  nt, iLimit);.   
af30: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
af40: 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
af50: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
af60: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
af70: 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20  IfZero, iLimit, 
af80: 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 69  iBreak);.  }.  i
af90: 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b  f( p->pOffset ){
afa0: 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  .    p->iOffset 
afb0: 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50  = iOffset = ++pP
afc0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
afd0: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
afe0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
aff0: 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f  Mem++;   /* Allo
b000: 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65  cate an extra re
b010: 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74  gister for limit
b020: 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 7d  +offset */.    }
b030: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
b040: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
b050: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
b060: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
b070: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
b080: 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20  se, p->pOffset, 
b090: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71  iOffset);.    sq
b0a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b0b0: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
b0c0: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 56   iOffset);.    V
b0d0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
b0e0: 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
b0f0: 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  );.    addr1 = s
b100: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b110: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f  (v, OP_IfPos, iO
b120: 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
b130: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b140: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
b150: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71  iOffset);.    sq
b160: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
b170: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
b180: 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
b190: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
b1a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b1b0: 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66  Add, iLimit, iOf
b1c0: 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29  fset, iOffset+1)
b1d0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
b1e0: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f  ent((v, "LIMIT+O
b1f0: 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20  FFSET"));.      
b200: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
b210: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b220: 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a  IfPos, iLimit);.
b230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b240: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
b250: 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73  teger, -1, iOffs
b260: 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  et+1);.      sql
b270: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
b280: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
b290: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
b2a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
b2b0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
b2c0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70  ** Return the ap
b2d0: 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74  propriate collat
b2e0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
b2f0: 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
b300: 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65  umn of.** the re
b310: 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65  sult set for the
b320: 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
b330: 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20   statement "p". 
b340: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a   Return NULL if.
b350: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  ** the column ha
b360: 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c  s no default col
b370: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
b380: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
b390: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
b3a0: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  r the compound s
b3b0: 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66  elect is taken f
b3c0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d  rom the.** left-
b3d0: 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  most term of the
b3e0: 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73   select that has
b3f0: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
b400: 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  uence..*/.static
b410: 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53   CollSeq *multiS
b420: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72  electCollSeq(Par
b430: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
b440: 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29  ct *p, int iCol)
b450: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65  {.  CollSeq *pRe
b460: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
b470: 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  or ){.    pRet =
b480: 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
b490: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
b4a0: 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20  Prior, iCol);.  
b4b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20  }else{.    pRet 
b4c0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
b4d0: 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52  Ret==0 ){.    pR
b4e0: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
b4f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
b500: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
b510: 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
b520: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
b530: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b540: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
b550: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  ELECT */../* For
b560: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
b570: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
b580: 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
b590: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b5a0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
b5b0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
b5c0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
b5d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
b5e0: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
b5f0: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
b600: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
b610: 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
b620: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
b630: 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
b640: 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;...#ifndef SQLI
b650: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
b660: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68  _SELECT./*.** Th
b670: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
b680: 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
b690: 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
b6a0: 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77   form from.** tw
b6b0: 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
b6c0: 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67  te queries using
b6d0: 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c   UNION, UNION AL
b6e0: 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a  L, EXCEPT, or.**
b6f0: 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a   INTERSECT.**.**
b700: 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74   "p" points to t
b710: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
b720: 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73   the two queries
b730: 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20  .  the query on 
b740: 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70  the.** left is p
b750: 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c  ->pPrior.  The l
b760: 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20  eft query could 
b770: 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75  also be a compou
b780: 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77  nd query.** in w
b790: 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72  hich case this r
b7a0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
b7b0: 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
b7c0: 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  y. .**.** The re
b7d0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74  sults of the tot
b7e0: 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20  al query are to 
b7f0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
b800: 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a  a destination.**
b810: 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77   of type eDest w
b820: 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50  ith parameter iP
b830: 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  arm..**.** Examp
b840: 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20  le 1:  Consider 
b850: 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70  a three-way comp
b860: 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65  ound SQL stateme
b870: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  nt..**.**     SE
b880: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55  LECT a FROM t1 U
b890: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52  NION SELECT b FR
b8a0: 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t2 UNION SELE
b8b0: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a  CT c FROM t3.**.
b8c0: 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
b8d0: 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61  t is parsed up a
b8e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
b8f0: 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52       SELECT c FR
b900: 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a  OM t3.**      |.
b910: 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20  **      `-----> 
b920: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
b930: 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  2.**            
b940: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
b950: 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e          `------>
b960: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
b970: 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72  t1.**.** The arr
b980: 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72  ows in the diagr
b990: 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65  am above represe
b9a0: 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50  nt the Select.pP
b9b0: 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  rior pointer..**
b9c0: 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
b9d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ine is called wi
b9e0: 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68  th p equal to th
b9f0: 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e  e t3 query, then
ba00: 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20  .** pPrior will 
ba10: 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e  be the t2 query.
ba20: 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20    p->op will be 
ba30: 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73  TK_UNION in this
ba40: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   case..**.** Not
ba50: 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ice that because
ba60: 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69   of the way SQLi
ba70: 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75  te parses compou
ba80: 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a  nd SELECTs, the.
ba90: 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65  ** individual se
baa0: 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f  lects always gro
bab0: 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  up from left to 
bac0: 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  right..*/.static
bad0: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
bae0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
baf0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
bb00: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
bb10: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
bb20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
bb30: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
bb40: 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
bb50: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
bb60: 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
bb70: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
bb80: 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
bb90: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
bba0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75  LITE_OK;   /* Su
bbb0: 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
bbc0: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
bbd0: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
bbe0: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
bbf0: 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
bc00: 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
bc10: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bc30: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
bc40: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
bc50: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
bc60: 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61        /* Alterna
bc70: 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e  tive data destin
bc80: 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ation */.  Selec
bc90: 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20  t *pDelete = 0; 
bca0: 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d   /* Chain of sim
bcb0: 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64  ple selects to d
bcc0: 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  elete */.  sqlit
bcd0: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
bce0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
bcf0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  nection */..  /*
bd00: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
bd10: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
bd20: 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  or LIMIT clause 
bd30: 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
bd40: 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65  .  Only.  ** the
bd50: 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73   last (right-mos
bd60: 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  t) SELECT in the
bd70: 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
bd80: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
bd90: 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73  LIMIT..  */.  as
bda0: 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50  sert( p && p->pP
bdb0: 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c  rior );  /* Call
bdc0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61  ing function gua
bdd0: 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63  rantees this muc
bde0: 68 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  h */.  db = pPar
bdf0: 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72  se->db;.  pPrior
be00: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
be10: 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
be20: 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69  pRightmost!=pPri
be30: 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
be40: 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f  pPrior->pRightmo
be50: 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73  st==p->pRightmos
be60: 74 20 29 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70  t );.  dest = *p
be70: 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69  Dest;.  if( pPri
be80: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
be90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bea0: 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
beb0: 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
bec0: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
bed0: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
bee0: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
bef0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
bf00: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
bf10: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
bf20: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
bf30: 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
bf40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
bf50: 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
bf60: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
bf70: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
bf80: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
bf90: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
bfa0: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
bfb0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
bfc0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
bfd0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
bfe0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
bff0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
c000: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72   /* The VDBE alr
c010: 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20  eady created by 
c020: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
c030: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   */..  /* Create
c040: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
c050: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
c060: 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
c070: 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
c080: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
c090: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
c0a0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
c0b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c0c0: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
c0d0: 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 50  hemeral, dest.iP
c0e0: 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  arm, p->pEList->
c0f0: 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74  nExpr);.    dest
c100: 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
c110: 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  le;.  }..  /* Ma
c120: 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45  ke sure all SELE
c130: 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  CTs in the state
c140: 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61  ment have the sa
c150: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  me number of ele
c160: 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68  ments.  ** in th
c170: 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e  eir result sets.
c180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
c190: 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
c1a0: 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
c1b0: 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
c1c0: 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70  nExpr!=pPrior->p
c1d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
c1e0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c1f0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c  Msg(pParse, "SEL
c200: 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
c210: 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73   and right of %s
c220: 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74  ".      " do not
c230: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
c240: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
c250: 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74  columns", select
c260: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
c270: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
c280: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c290: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
c2a0: 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   Compound SELECT
c2b0: 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f  s that have an O
c2c0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
c2d0: 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72  re handled separ
c2e0: 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
c2f0: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
c300: 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
c310: 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70  iSelectOrderBy(p
c320: 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
c330: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
c340: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
c350: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
c360: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c370: 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ts..  */.  switc
c380: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
c390: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
c3a0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
c3b0: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
c3c0: 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
c3d0: 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72   );.      pPrior
c3e0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c  ->pLimit = p->pL
c3f0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
c400: 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
c410: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
c420: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
c430: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
c440: 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  r, &dest);.     
c450: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
c460: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
c470: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
c480: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
c490: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c4a0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
c4b0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
c4c0: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
c4d0: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
c4e0: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66  it;.      p->iOf
c4f0: 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
c500: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
c510: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
c520: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
c530: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
c540: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
c550: 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >iLimit);.      
c560: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
c570: 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66  , "Jump ahead if
c580: 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29   LIMIT reached")
c590: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c5a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
c5b0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
c5c0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 44 65  dest);.      pDe
c5d0: 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
c5e0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
c5f0: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
c600: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
c610: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
c620: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
c630: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64   }.      if( add
c640: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
c650: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c660: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
c670: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
c680: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
c690: 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
c6a0: 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
c6b0: 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
c6c0: 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
c6d0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
c6e0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
c6f0: 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
c700: 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b        u8 op = 0;
c710: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
c720: 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
c730: 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
c740: 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
c750: 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
c760: 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
c770: 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
c780: 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
c790: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
c7a0: 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
c7b0: 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
c7c0: 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
c7d0: 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
c7e0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
c7f0: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
c800: 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20   uniondest;..   
c810: 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54     priorOp = SRT
c820: 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
c830: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72  ( dest.eDest==pr
c840: 69 6f 72 4f 70 20 26 26 20 41 4c 57 41 59 53 28  iorOp && ALWAYS(
c850: 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 21 70 2d  !p->pLimit &&!p-
c860: 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20  >pOffset) ){.   
c870: 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
c880: 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
c890: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
c8a0: 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
c8b0: 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
c8c0: 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
c8d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c8e0: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d   p->pRightmost!=
c8f0: 70 20 29 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c  p );  /* Can onl
c900: 79 20 68 61 70 70 65 6e 20 66 6f 72 20 6c 65 66  y happen for lef
c910: 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 0a 20  tward elements. 
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 20 20 20 2a 2a 20 6f 66 20 61 20 33 2d 77 61      ** of a 3-wa
c950: 79 20 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6f 75  y or more compou
c960: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  nd */.        as
c970: 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d  sert( p->pLimit=
c980: 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  =0 );      /* No
c990: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
c9a0: 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
c9b0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
c9c0: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
c9d0: 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c  );     /* Not al
c9e0: 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72  lowed on leftwar
c9f0: 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  d elements */.  
ca00: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
ca10: 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20   dest.iParm;.   
ca20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ca30: 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
ca40: 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
ca50: 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
ca60: 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
ca70: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
ca80: 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
ca90: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
caa0: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
cab0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
cac0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
cad0: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
cae0: 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
caf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cb00: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
cb10: 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  meral, unionTab,
cb20: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
cb30: 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
cb40: 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
cb50: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72  .        p->addr
cb60: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
cb70: 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  dr;.        p->p
cb80: 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c  Rightmost->selFl
cb90: 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
cba0: 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20  hemeral;.       
cbb0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
cbc0: 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  st );.      }.. 
cbd0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
cbe0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
cbf0: 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
cc00: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
cc10: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
cc20: 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20  OrderBy );.     
cc30: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
cc40: 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73  stInit(&uniondes
cc50: 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  t, priorOp, unio
cc60: 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 72 63 20  nTab);.      rc 
cc70: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
cc80: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
cc90: 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
cca0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
ccb0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
ccc0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
ccd0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
cce0: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
ccf0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
cd00: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
cd10: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  f( p->op==TK_EXC
cd20: 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  EPT ){.        o
cd30: 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a  p = SRT_Except;.
cd40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cd50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
cd60: 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
cd70: 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
cd80: 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a  _Union;.      }.
cd90: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
cda0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  = 0;.      pLimi
cdb0: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
cdc0: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
cdd0: 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
cde0: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
cdf0: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
ce00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f   = 0;.      unio
ce10: 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70  ndest.eDest = op
ce20: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
ce30: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
ce40: 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74  e, p, &uniondest
ce50: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72  );.      /* Quer
ce60: 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20  y flattening in 
ce70: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
ce80: 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e  might refill p->
ce90: 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20  pOrderBy..      
cea0: 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65  ** Be sure to de
ceb0: 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79  lete p->pOrderBy
cec0: 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20  , therefore, to 
ced0: 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c  avoid a memory l
cee0: 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  eak. */.      sq
cef0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
cf00: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
cf10: 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  rBy);.      pDel
cf20: 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
cf30: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
cf40: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
cf50: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
cf60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
cf70: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
cf80: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
cf90: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
cfa0: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
cfb0: 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
cfc0: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
cfd0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  = 0;.      p->iO
cfe0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
cff0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
d000: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d010: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
d020: 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  }...      /* Con
d030: 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e  vert the data in
d040: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
d050: 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76  able into whatev
d060: 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  er form.      **
d070: 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
d080: 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
d090: 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20       */      .  
d0a0: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
d0b0: 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75  st!=priorOp || u
d0c0: 6e 69 6f 6e 54 61 62 21 3d 64 65 73 74 2e 69 50  nionTab!=dest.iP
d0d0: 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arm ){.        i
d0e0: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
d0f0: 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
d100: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
d110: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
d120: 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
d130: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
d140: 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
d150: 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
d160: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
d170: 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
d180: 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
d190: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rior;.          
d1a0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
d1b0: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
d1c0: 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
d1d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d1e0: 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
d1f0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d200: 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
d210: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
d220: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
d230: 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
d240: 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
d250: 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
d260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d270: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
d280: 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
d290: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
d2a0: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
d2b0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
d2c0: 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65  r(v);.        se
d2d0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
d2e0: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
d2f0: 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d  st, unionTab, p-
d300: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 20 20 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26          0, -1, &
d330: 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
d340: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
d350: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d360: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
d370: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d380: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d390: 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  _Next, unionTab,
d3a0: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
d3b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
d3c0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
d3d0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
d3e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d3f0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
d400: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
d410: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
d420: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
d430: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20  K_INTERSECT: {. 
d440: 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
d450: 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
d460: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
d470: 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72  tart;.      Expr
d480: 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
d490: 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  et;.      int ad
d4a0: 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
d4b0: 44 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65  Dest intersectde
d4c0: 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  st;.      int r1
d4d0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45  ;..      /* INTE
d4e0: 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65  RSECT is differe
d4f0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  nt from the othe
d500: 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75  rs since it requ
d510: 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77  ires.      ** tw
d520: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
d530: 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
d540: 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
d550: 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20   Begin.      ** 
d560: 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  by allocating th
d570: 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c  e tables we will
d580: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
d590: 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61        tab1 = pPa
d5a0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
d5b0: 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65     tab2 = pParse
d5c0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
d5d0: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
d5e0: 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  rBy==0 );..     
d5f0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
d600: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d610: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
d620: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab1, 0);.      a
d630: 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
d640: 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
d650: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
d660: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
d670: 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69  dr;.      p->pRi
d680: 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67  ghtmost->selFlag
d690: 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
d6a0: 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73  meral;.      ass
d6b0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
d6c0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
d6d0: 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20   the SELECTs to 
d6e0: 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65  our left into te
d6f0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
d700: 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ab1"..      */. 
d710: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
d720: 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65  ctDestInit(&inte
d730: 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55  rsectdest, SRT_U
d740: 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20  nion, tab1);.   
d750: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
d760: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
d770: 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74  rior, &intersect
d780: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
d790: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
d7a0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
d7b0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
d7c0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
d7d0: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
d7e0: 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
d7f0: 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
d800: 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20    */.      addr 
d810: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d820: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
d830: 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30  hemeral, tab2, 0
d840: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
d850: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
d860: 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [1] == -1 );.   
d870: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
d880: 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[1] = addr;.  
d890: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
d8a0: 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
d8b0: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
d8c0: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
d8d0: 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
d8e0: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
d8f0: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
d900: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73   0;.      inters
d910: 65 63 74 64 65 73 74 2e 69 50 61 72 6d 20 3d 20  ectdest.iParm = 
d920: 74 61 62 32 3b 0a 20 20 20 20 20 20 72 63 20 3d  tab2;.      rc =
d930: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
d940: 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72  Parse, p, &inter
d950: 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
d960: 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
d970: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
d980: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
d990: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d9a0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
d9b0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
d9c0: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
d9d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
d9e0: 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
d9f0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
da00: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
da10: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
da20: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
da30: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
da40: 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65  take the interse
da50: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f  ction of the two
da60: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
da70: 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   ** tables..    
da80: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
da90: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
daa0: 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
dab0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
dac0: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65   ){.        Sele
dad0: 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
dae0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
daf0: 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
db00: 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
db10: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
db20: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
db30: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
db40: 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
db50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
db60: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
db70: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
db80: 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
db90: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
dba0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
dbb0: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
dbc0: 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
dbd0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
dbe0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
dbf0: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
dc00: 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  b1, iBreak);.   
dc10: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
dc20: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
dc30: 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20  );.      iStart 
dc40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
dc50: 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79  Op2(v, OP_RowKey
dc60: 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20  , tab1, r1);.   
dc70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dc80: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  dOp3(v, OP_NotFo
dc90: 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74  und, tab2, iCont
dca0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
dcb0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
dcc0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
dcd0: 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
dce0: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
dcf0: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31   p->pEList, tab1
dd00: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
dd10: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
dd20: 20 20 20 20 20 20 20 20 20 20 30 2c 20 2d 31 2c            0, -1,
dd30: 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
dd40: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
dd50: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
dd60: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
dd70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dd80: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
dd90: 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
dda0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
ddb0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
ddc0: 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
ddd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dde0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
ddf0: 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  e, tab2, 0);.   
de00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
de10: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
de20: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
de30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
de40: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
de50: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
de60: 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20  nces used by .  
de70: 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
de80: 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d  les needed to im
de90: 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70  plement the comp
dea0: 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
deb0: 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79  * Attach the Key
dec0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
ded0: 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  o all temporary 
dee0: 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
def0: 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
df00: 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
df10: 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
df20: 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
df30: 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
df40: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
df50: 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
df60: 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
df70: 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
df80: 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
df90: 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
dfa0: 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
dfb0: 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
dfc0: 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
dfd0: 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
dfe0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
dff0: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
e000: 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20  esEphemeral ){. 
e010: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
e040: 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
e050: 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
e060: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
e070: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
e080: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
e090: 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
e0a0: 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
e0b0: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
e0c0: 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
e0d0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
e0e0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
e0f0: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
e100: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
e110: 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66   through pKeyInf
e120: 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20  o->aColl[] */.  
e130: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
e160: 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
e170: 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  et */..    asser
e180: 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t( p->pRightmost
e190: 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20  ==p );.    nCol 
e1a0: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
e1b0: 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  pr;.    pKeyInfo
e1c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
e1d0: 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20  ocZero(db,.     
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1f0: 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e    sizeof(*pKeyIn
e200: 66 6f 29 2b 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66  fo)+nCol*(sizeof
e210: 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29  (CollSeq*) + 1))
e220: 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49  ;.    if( !pKeyI
e230: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nfo ){.      rc 
e240: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
e250: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
e260: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
e270: 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f   }..    pKeyInfo
e280: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
e290: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  .    pKeyInfo->n
e2a0: 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 43 6f  Field = (u16)nCo
e2b0: 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  l;..    for(i=0,
e2c0: 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f   apColl=pKeyInfo
e2d0: 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b  ->aColl; i<nCol;
e2e0: 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b   i++, apColl++){
e2f0: 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d  .      *apColl =
e300: 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
e310: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
e320: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
e330: 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  *apColl ){.     
e340: 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d     *apColl = db-
e350: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
e360: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
e370: 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f  or(pLoop=p; pLoo
e380: 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
e390: 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66  pPrior){.      f
e3a0: 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b  or(i=0; i<2; i++
e3b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
e3c0: 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64  ddr = pLoop->add
e3d0: 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20  rOpenEphm[i];.  
e3e0: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30        if( addr<0
e3f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
e400: 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65   If [0] is unuse
e410: 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c  d then [1] is al
e420: 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77  so unused.  So w
e430: 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20  e can.          
e440: 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79  ** always safely
e450: 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61   abort as soon a
e460: 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73  s the first unus
e470: 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64  ed slot is found
e480: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
e490: 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64  sert( pLoop->add
e4a0: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29  rOpenEphm[1]<0 )
e4b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
e4c0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
e4d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e4e0: 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
e4f0: 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
e500: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
e510: 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63  geP4(v, addr, (c
e520: 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
e530: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
e540: 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f      pLoop->addrO
e550: 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b  penEphm[i] = -1;
e560: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e570: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
e580: 28 64 62 2c 20 70 4b 65 79 49 6e 66 6f 29 3b 0a  (db, pKeyInfo);.
e590: 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
e5a0: 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e  t_end:.  pDest->
e5b0: 69 4d 65 6d 20 3d 20 64 65 73 74 2e 69 4d 65 6d  iMem = dest.iMem
e5c0: 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20  ;.  pDest->nMem 
e5d0: 3d 20 64 65 73 74 2e 6e 4d 65 6d 3b 0a 20 20 73  = dest.nMem;.  s
e5e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
e5f0: 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b  te(db, pDelete);
e600: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e610: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e620: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
e630: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
e640: 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73  Code an output s
e650: 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20  ubroutine for a 
e660: 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  coroutine implem
e670: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a  entation of a.**
e680: 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74   SELECT statment
e690: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ..**.** The data
e6a0: 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73   to be output is
e6b0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49   contained in pI
e6c0: 6e 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 72 65 20  n->iMem.  There 
e6d0: 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 4d 65 6d  are.** pIn->nMem
e6e0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f   columns to be o
e6f0: 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73  utput.  pDest is
e700: 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75   where the outpu
e710: 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
e720: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65  ent..**.** regRe
e730: 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  turn is the numb
e740: 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74  er of the regist
e750: 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  er holding the s
e760: 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  ubroutine.** ret
e770: 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  urn address..**.
e780: 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  ** If regPrev>0 
e790: 74 68 65 6e 20 69 74 20 69 73 20 61 20 74 68 65  then it is a the
e7a0: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
e7b0: 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61 74  in a vector that
e7c0: 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20  .** records the 
e7d0: 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
e7e0: 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69    mem[regPrev] i
e7f0: 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 73  s a flag that is
e800: 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65   false.** if the
e810: 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70  re has been no p
e820: 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20  revious output. 
e830: 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
e840: 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65  en code is.** ge
e850: 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70 72  nerated to suppr
e860: 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20  ess duplicates. 
e870: 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65   pKeyInfo is use
e880: 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a  d for comparing.
e890: 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49  ** keys..**.** I
e8a0: 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e  f the LIMIT foun
e8b0: 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69  d in p->iLimit i
e8c0: 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20  s reached, jump 
e8d0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a  immediately to.*
e8e0: 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61  * iBreak..*/.sta
e8f0: 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65  tic int generate
e900: 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
e910: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e920: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
e930: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e940: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
e950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e960: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
e970: 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ent */.  SelectD
e980: 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20  est *pIn,       
e990: 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75   /* Coroutine su
e9a0: 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a  pplying data */.
e9b0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
e9c0: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65  est,      /* Whe
e9d0: 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64  re to send the d
e9e0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ata */.  int reg
e9f0: 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20  Return,         
ea00: 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61   /* The return a
ea10: 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
ea20: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
ea30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
ea40: 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20  Previous result 
ea50: 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e  register.  No un
ea60: 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f  iqueness if 0 */
ea70: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
ea80: 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f  Info,      /* Fo
ea90: 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68  r comparing with
eaa0: 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
eab0: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 2c  */.  int p4type,
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ead0: 54 68 65 20 70 34 20 74 79 70 65 20 66 6f 72 20  The p4 type for 
eae0: 70 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e  pKeyInfo */.  in
eaf0: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
eb00: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
eb10: 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65  re if we hit the
eb20: 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56   LIMIT */.){.  V
eb30: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
eb40: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43  >pVdbe;.  int iC
eb50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61  ontinue;.  int a
eb60: 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73  ddr;..  addr = s
eb70: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
eb80: 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e  tAddr(v);.  iCon
eb90: 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
eba0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
ebb0: 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
ebc0: 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55  duplicates for U
ebd0: 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
ebe0: 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a  d INTERSECT .  *
ebf0: 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
ec00: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a  ){.    int j1, j
ec10: 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  2;.    j1 = sqli
ec20: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
ec30: 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72   OP_IfNot, regPr
ec40: 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71  ev);.    j2 = sq
ec50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
ec60: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70  v, OP_Compare, p
ec70: 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65  In->iMem, regPre
ec80: 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 0a  v+1, pIn->nMem,.
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
ecb0: 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70  har*)pKeyInfo, p
ecc0: 34 74 79 70 65 29 3b 0a 20 20 20 20 73 71 6c 69  4type);.    sqli
ecd0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ece0: 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20   OP_Jump, j2+2, 
ecf0: 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29  iContinue, j2+2)
ed00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ed10: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
ed20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
ed30: 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65  rCodeCopy(pParse
ed40: 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67  , pIn->iMem, reg
ed50: 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65  Prev+1, pIn->nMe
ed60: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  m);.    sqlite3V
ed70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ed80: 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50  Integer, 1, regP
ed90: 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rev);.  }.  if( 
eda0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
edb0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
edc0: 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72  n 0;..  /* Suppr
edd0: 65 73 73 20 74 68 65 20 74 68 65 20 66 69 72 73  ess the the firs
ede0: 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73  t OFFSET entries
edf0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
ee00: 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20  OFFSET clause.  
ee10: 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  */.  codeOffset(
ee20: 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29  v, p, iContinue)
ee30: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44 65  ;..  switch( pDe
ee40: 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20  st->eDest ){.   
ee50: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
ee60: 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
ee70: 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
ee80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
ee90: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
eea0: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
eeb0: 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
eec0: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
eed0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
eee0: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
eef0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
ef00: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
ef10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ef20: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
ef30: 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49  d, pIn->iMem, pI
ef40: 6e 2d 3e 6e 4d 65 6d 2c 20 72 31 29 3b 0a 20 20  n->nMem, r1);.  
ef50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ef60: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
ef70: 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 50 61  owid, pDest->iPa
ef80: 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  rm, r2);.      s
ef90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
efa0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
efb0: 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 31 2c  Dest->iParm, r1,
efc0: 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
efd0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
efe0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
eff0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f000: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
f010: 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
f020: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
f030: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
f040: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
f050: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
f060: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
f070: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
f080: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
f090: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
f0a0: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
f0b0: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
f0c0: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
f0d0: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
f0e0: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
f0f0: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
f100: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
f110: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
f120: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
f130: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
f140: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
f150: 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
f160: 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
f170: 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Mem==1 );.      
f180: 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 0a 20  p->affinity = . 
f190: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
f1a0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
f1b0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
f1c0: 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66  Expr, pDest->aff
f1d0: 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 72 31  inity);.      r1
f1e0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
f1f0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
f200: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f210: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
f220: 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d 65  Record, pIn->iMe
f230: 6d 2c 20 31 2c 20 72 31 2c 20 26 70 2d 3e 61 66  m, 1, r1, &p->af
f240: 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
f250: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
f260: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
f270: 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d  (pParse, pIn->iM
f280: 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  em, 1);.      sq
f290: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f2a0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
f2b0: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72   pDest->iParm, r
f2c0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
f2d0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
f2e0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
f2f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f300: 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65 76 65 72  .#if 0  /* Never
f310: 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52   occurs on an OR
f320: 44 45 52 20 42 59 20 71 75 65 72 79 20 2a 2f 0a  DER BY query */.
f330: 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f      /* If any ro
f340: 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72  w exist in the r
f350: 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72  esult set, recor
f360: 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20  d that fact and 
f370: 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  abort..    */.  
f380: 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74    case SRT_Exist
f390: 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s: {.      sqlit
f3a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f3b0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
f3c0: 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20  Dest->iParm);.  
f3d0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
f3e0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
f3f0: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
f400: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
f410: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
f420: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
f430: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
f440: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
f450: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
f460: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
f470: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
f480: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
f490: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
f4a0: 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
f4b0: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
f4c0: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
f4d0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
f4e0: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
f4f0: 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20  t( pIn->nMem==1 
f500: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f510: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
f520: 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  rse, pIn->iMem, 
f530: 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 31 29  pDest->iParm, 1)
f540: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
f550: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
f560: 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   jump out of the
f570: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
f580: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f590: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
f5a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f5b0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
f5c0: 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73    /* The results
f5d0: 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61   are stored in a
f5e0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
f5f0: 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
f600: 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d  arting at pDest-
f610: 3e 69 4d 65 6d 2e 20 20 54 68 65 6e 20 74 68 65  >iMem.  Then the
f620: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c   co-routine yiel
f630: 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ds..    */.    c
f640: 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
f650: 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e: {.      if( p
f660: 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b  Dest->iMem==0 ){
f670: 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
f680: 69 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 47 65  iMem = sqlite3Ge
f690: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
f6a0: 65 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20  e, pIn->nMem);. 
f6b0: 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d         pDest->nM
f6c0: 65 6d 20 3d 20 70 49 6e 2d 3e 6e 4d 65 6d 3b 0a  em = pIn->nMem;.
f6d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
f6e0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
f6f0: 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
f700: 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d  Mem, pDest->iMem
f710: 2c 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 29 3b 0a  , pDest->nMem);.
f720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f730: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
f740: 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  eld, pDest->iPar
f750: 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
f760: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
f770: 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
f780: 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
f790: 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 54  of registers.  T
f7a0: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f  hen the.    ** O
f7b0: 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f  P_ResultRow opco
f7c0: 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61  de is used to ca
f7d0: 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  use sqlite3_step
f7e0: 28 29 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 20  () to return.   
f7f0: 20 2a 2a 20 74 68 65 20 6e 65 78 74 20 72 6f 77   ** the next row
f800: 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20   of result..    
f810: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
f820: 4f 75 74 70 75 74 3a 20 7b 0a 20 20 20 20 20 20  Output: {.      
f830: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f840: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
f850: 77 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49  w, pIn->iMem, pI
f860: 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20  n->nMem);.      
f870: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
f880: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
f890: 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  Parse, pIn->iMem
f8a0: 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  , pIn->nMem);.  
f8b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f8c0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
f8d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
f8e0: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
f8f0: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
f900: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
f910: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
f920: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
f930: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
f940: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
f950: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
f960: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
f970: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
f980: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
f990: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
f9a0: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
f9b0: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
f9c0: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
f9d0: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
f9e0: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
f9f0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
fa00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
fa10: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
fa20: 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
fa30: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
fa40: 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
fa50: 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hed..  */.  if( 
fa60: 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
fa70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fa80: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
fa90: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b   p->iLimit, -1);
faa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fab0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a  AddOp2(v, OP_IfZ
fac0: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
fad0: 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 0a 20 20  iBreak);.  }..  
fae0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
faf0: 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
fb00: 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n.  */.  sqlite3
fb10: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
fb20: 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  (v, iContinue);.
fb30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fb40: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
fb50: 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20  , regReturn);.. 
fb60: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
fb70: 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69  ./*.** Alternati
fb80: 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  ve compound sele
fb90: 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  ct code generato
fba0: 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e  r for cases when
fbb0: 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20   there.** is an 
fbc0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
fbd0: 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65  .**.** We assume
fbe0: 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
fbf0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a  following form:.
fc00: 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65  **.**      <sele
fc10: 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e  ctA>  <operator>
fc20: 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44    <selectB>  ORD
fc30: 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69  ER BY <orderbyli
fc40: 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61  st>.**.** <opera
fc50: 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55  tor> is one of U
fc60: 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c  NION ALL, UNION,
fc70: 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
fc80: 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61  RSECT.  The idea
fc90: 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62  .** is to code b
fca0: 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e  oth <selectA> an
fcb0: 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68  d <selectB> with
fcc0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
fcd0: 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f  ause as.** co-ro
fce0: 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75  utines.  Then ru
fcf0: 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
fd00: 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e  s in parallel an
fd10: 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75  d merge the resu
fd20: 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  lts.** into the 
fd30: 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69  output.  In addi
fd40: 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20  tion to the two 
fd50: 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c  coroutines (call
fd60: 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a  ed selectA and.*
fd70: 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65  * selectB) there
fd80: 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e   are 7 subroutin
fd90: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  es:.**.**    out
fda0: 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  A:    Move the o
fdb0: 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
fdc0: 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectA coroutine i
fdd0: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
fde0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
fdf0: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
fe00: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  ery..**.**    ou
fe10: 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tB:    Move the 
fe20: 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
fe30: 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20  lectB coroutine 
fe40: 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
fe50: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
fe60: 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
fe70: 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e  uery.  (Only gen
fe80: 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e  erated for UNION
fe90: 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
fea0: 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20      UNION ALL.  
feb0: 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52  EXCEPT and INSER
fec0: 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70  TSECT never outp
fed0: 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a  ut a row that.**
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
fef0: 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29  ears only in B.)
ff00: 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  .**.**    AltB: 
ff10: 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
ff20: 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
ff30: 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
ff40: 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a  s and A<B..**.**
ff50: 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c      AeqB:    Cal
ff60: 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
ff70: 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
ff80: 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
ff90: 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  A==B..**.**    A
ffa0: 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  gtB:    Called w
ffb0: 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
ffc0: 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
ffd0: 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a  utines and A>B..
ffe0: 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20  **.**    EofA:  
fff0: 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
10000 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
10010 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a  from selectA..**
10020 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20  .**    EofB:    
10030 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
10040 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
10050 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a  om selectB..**.*
10060 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
10070 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74  tion of the latt
10080 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69  er five subrouti
10090 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68  nes depend on wh
100a0 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  ich .** <operato
100b0 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a  r> is used:.**.*
100c0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
100d0 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20   UNION ALL      
100e0 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20     UNION        
100f0 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20      EXCEPT      
10100 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a      INTERSECT.**
10110 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
10120 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
10130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
10140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
10150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
10160 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c     AltB:   outA,
10170 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
10180 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
10190 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
101a0 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20    nextA.**.**   
101b0 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AeqB:   outA, ne
101c0 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
101d0 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  A             ne
101e0 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41  xtA         outA
101f0 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20  , nextA.**.**   
10200 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65  AgtB:   outB, ne
10210 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
10220 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65  extB          ne
10230 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e  xtB            n
10240 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  extB.**.**   Eof
10250 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  A:   outB, nextB
10260 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
10270 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20  B          halt 
10280 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74              halt
10290 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20  .**.**   EofB:  
102a0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
102b0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
102c0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
102d0 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
102e0 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20  ** In the AltB, 
102f0 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73  AeqB, and AgtB s
10300 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45  ubroutines, an E
10310 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e  OF on A followin
10320 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65  g nextA.** cause
10330 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  s an immediate j
10340 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20  ump to EofA and 
10350 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c  an EOF on B foll
10360 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73  owing nextB caus
10370 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61  es.** an immedia
10380 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e  te jump to EofB.
10390 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e    Within EofA an
103a0 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20  d EofB, and EOF 
103b0 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66  on entry or.** f
103c0 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63  ollowing nextX c
103d0 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20  auses a jump to 
103e0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
103f0 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67  elect processing
10400 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74  ..**.** Duplicat
10410 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65  e removal in the
10420 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
10430 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61  and INTERSECT ca
10440 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a  ses is handled.*
10450 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74  * within the out
10460 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  put subroutine. 
10470 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67   The regPrev reg
10480 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20  ister set holds 
10490 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  the previously.*
104a0 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20  * output value. 
104b0 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73   A comparison is
104c0 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68   made against th
104d0 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  is value and the
104e0 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b   output.** is sk
104f0 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78  ipped if the nex
10500 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20  t results would 
10510 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
10520 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a  he previous..**.
10530 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
10540 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f  ation plan is to
10550 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74   implement the t
10560 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  wo coroutines an
10570 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f  d seven.** subro
10580 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68  utines first, th
10590 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72  en put the contr
105a0 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20  ol logic at the 
105b0 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68  bottom.  Like th
105c0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
105d0 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20     goto Init.** 
105e0 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69      coA: corouti
105f0 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72  ne for left quer
10600 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42  y (A).**     coB
10610 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
10620 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a  right query (B).
10630 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70  **    outA: outp
10640 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a  ut one row of A.
10650 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70  **    outB: outp
10660 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20  ut one row of B 
10670 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e  (UNION and UNION
10680 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20   ALL only).**   
10690 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofA: ....**   
106a0 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofB: ....**   
106b0 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AltB: ....**   
106c0 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AeqB: ....**   
106d0 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AgtB: ....**   
106e0 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a   Init: initializ
106f0 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69  e coroutine regi
10700 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20  sters.**        
10710 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20    yield coA.**  
10720 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41          if eof(A
10730 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20  ) goto EofA.**  
10740 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
10750 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  B.**          if
10760 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66   eof(B) goto Eof
10770 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f  B.**    Cmpr: Co
10780 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20  mpare A, B.**   
10790 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42         Jump AltB
107a0 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20  , AeqB, AgtB.** 
107b0 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a      End: ....**.
107c0 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c  ** We call AltB,
107d0 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66   AeqB, AgtB, Eof
107e0 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62  A, and EofB "sub
107f0 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68  routines" but th
10800 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63  ey are not.** ac
10810 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73  tually called us
10820 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68  ing Gosub and th
10830 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e  ey do not Return
10840 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  .  EofA and EofB
10850 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61   loop.** until a
10860 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75  ll data is exhau
10870 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74  sted then jump t
10880 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65  o the "end" labe
10890 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a  .  AltB, AeqB,.*
108a0 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20  * and AgtB jump 
108b0 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20  to either L2 or 
108c0 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f  to one of EofA o
108d0 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64  r EofB..*/.#ifnd
108e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
108f0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73  OMPOUND_SELECT.s
10900 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
10910 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
10920 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10930 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
10940 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
10950 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
10960 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
10970 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
10980 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
10990 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
109a0 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
109b0 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
109c0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
109d0 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
109e0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
109f0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c  ounters */.  Sel
10a00 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
10a10 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
10a20 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
10a30 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
10a40 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
10a50 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
10a60 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
10a70 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
10a80 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20  tDest destA;    
10a90 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
10aa0 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20  for coroutine A 
10ab0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
10ac0 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65  destB;     /* De
10ad0 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
10ae0 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69  routine B */.  i
10af0 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20  nt regAddrA;    
10b00 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
10b10 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
10b20 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
10b30 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 41  */.  int regEofA
10b40 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  ;          /* Fl
10b50 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  ag to indicate w
10b60 68 65 6e 20 73 65 6c 65 63 74 2d 41 20 69 73 20  hen select-A is 
10b70 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  complete */.  in
10b80 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20  t regAddrB;     
10b90 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
10ba0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
10bb0 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
10bc0 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 42 3b  /.  int regEofB;
10bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
10be0 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  g to indicate wh
10bf0 65 6e 20 73 65 6c 65 63 74 2d 42 20 69 73 20 63  en select-B is c
10c00 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74  omplete */.  int
10c10 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20   addrSelectA;   
10c20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
10c30 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f   the select-A co
10c40 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10c50 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20   addrSelectB;   
10c60 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
10c70 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f   the select-B co
10c80 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10c90 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20   regOutA;       
10ca0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
10cb0 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
10cc0 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
10cd0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
10ce0 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utB;          /*
10cf0 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
10d00 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
10d10 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
10d20 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b  .  int addrOutA;
10d30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
10d40 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
10d50 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
10d60 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42  /.  int addrOutB
10d70 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64   = 0;     /* Add
10d80 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
10d90 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
10da0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
10db0 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
10dc0 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
10dd0 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20  ect-A-exhausted 
10de0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
10df0 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
10e00 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10e10 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
10e20 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
10e30 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
10e40 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
10e50 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
10e60 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
10e70 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
10e80 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
10e90 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
10ea0 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
10eb0 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
10ec0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
10ed0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
10ee0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
10ef0 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
10f00 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
10f10 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
10f20 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
10f30 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
10f40 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
10f50 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
10f60 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
10f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
10f80 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
10f90 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
10fa0 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
10fb0 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
10fc0 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
10fd0 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
10fe0 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
10ff0 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
11000 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
11010 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
11020 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
11030 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
11040 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
11050 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
11060 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
11070 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
11080 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
11090 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
110a0 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
110b0 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20    int j1;       
110c0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
110d0 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
110e0 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
110f0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11110 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
11120 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
11130 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
11140 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
11150 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
11160 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
11170 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
11180 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
11190 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
111a0 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
111b0 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
111c0 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
111d0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
111e0 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
111f0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
11200 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
11210 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
11220 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
11230 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
11240 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
11250 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
11260 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
11270 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
11280 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
11290 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
112a0 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
112b0 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
112c0 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20  et columns */.. 
112d0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
112e0 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
112f0 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20  ert( pKeyDup==0 
11300 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20  ); /* "Managed" 
11310 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e  code needs this.
11320 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20    Ticket #3382. 
11330 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
11340 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72  ->db;.  v = pPar
11350 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
11360 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   v==0 ) return S
11370 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6c  QLITE_NOMEM;.  l
11380 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65  abelEnd = sqlite
11390 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
113a0 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d  );.  labelCmpr =
113b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
113c0 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a  Label(v);...  /*
113d0 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f 52   Patch up the OR
113e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
113f0 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b  */.  op = p->op;
11400 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d    .  pPrior = p-
11410 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72  >pPrior;.  asser
11420 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  t( pPrior->pOrde
11430 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64  rBy==0 );.  pOrd
11440 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
11450 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  By;.  assert( pO
11460 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64  rderBy );.  nOrd
11470 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
11480 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f  >nExpr;..  /* Fo
11490 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65  r operators othe
114a0 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c  r than UNION ALL
114b0 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65   we have to make
114c0 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20   sure that.  ** 
114d0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
114e0 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72 79  use covers every
114f0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73   term of the res
11500 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20  ult set.  Add.  
11510 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  ** terms to the 
11520 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11530 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
11540 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f  */.  if( op!=TK_
11550 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ALL ){.    for(i
11560 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  =1; db->mallocFa
11570 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d  iled==0 && i<=p-
11580 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
11590 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
115a0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
115b0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66   *pItem;.      f
115c0 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f  or(j=0, pItem=pO
115d0 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72  rderBy->a; j<nOr
115e0 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65  derBy; j++, pIte
115f0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  m++){.        as
11600 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 43 6f  sert( pItem->iCo
11610 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
11620 66 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3d 3d  f( pItem->iCol==
11630 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
11640 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
11650 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
11660 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
11670 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
11680 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52  arse, TK_INTEGER
11690 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
116a0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
116b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
116c0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
116d0 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
116e0 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
116f0 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20     pNew->iTable 
11700 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  = i;.        pOr
11710 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
11720 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
11730 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
11740 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 20 20  pNew, 0);.      
11750 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f    pOrderBy->a[nO
11760 72 64 65 72 42 79 2b 2b 5d 2e 69 43 6f 6c 20 3d  rderBy++].iCol =
11770 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d   (u16)i;.      }
11780 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11790 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
117a0 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74  parison permutat
117b0 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20  ion and keyinfo 
117c0 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74  that is used wit
117d0 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75  h.  ** the permu
117e0 74 61 74 69 6f 6e 20 69 6e 20 6f 72 64 65 72 20  tation in order 
117f0 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 74  to comparisons t
11800 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
11810 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77  he next.  ** row
11820 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65   of results come
11830 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f  s from selectA o
11840 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f  r selectB.  Also
11850 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20   add explicit.  
11860 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f  ** collations to
11870 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
11880 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68  ause terms so th
11890 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71  at when the subq
118a0 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74  ueries.  ** to t
118b0 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65  he right and the
118c0 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61   left are evalua
118d0 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68  ted, they use th
118e0 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63  e correct.  ** c
118f0 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ollation..  */. 
11900 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69   aPermute = sqli
11910 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
11920 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e  b, sizeof(int)*n
11930 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
11940 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20  aPermute ){.    
11950 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
11960 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
11970 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
11980 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e  pOrderBy->a; i<n
11990 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49  OrderBy; i++, pI
119a0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  tem++){.      as
119b0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 43 6f  sert( pItem->iCo
119c0 6c 3e 30 20 20 26 26 20 70 49 74 65 6d 2d 3e 69  l>0  && pItem->i
119d0 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Col<=p->pEList->
119e0 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
119f0 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74  Permute[i] = pIt
11a00 65 6d 2d 3e 69 43 6f 6c 20 2d 20 31 3b 0a 20 20  em->iCol - 1;.  
11a10 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67    }.    pKeyMerg
11a20 65 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e =.      sqlite
11a30 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
11a40 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 4d 65 72   sizeof(*pKeyMer
11a50 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a 28 73 69  ge)+nOrderBy*(si
11a60 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
11a70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  ));.    if( pKey
11a80 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20 70  Merge ){.      p
11a90 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f  KeyMerge->aSortO
11aa0 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b 65  rder = (u8*)&pKe
11ab0 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 6e 4f  yMerge->aColl[nO
11ac0 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 20 20 70  rderBy];.      p
11ad0 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69 65 6c 64  KeyMerge->nField
11ae0 20 3d 20 28 75 31 36 29 6e 4f 72 64 65 72 42 79   = (u16)nOrderBy
11af0 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67  ;.      pKeyMerg
11b00 65 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  e->enc = ENC(db)
11b10 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
11b20 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
11b30 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
11b40 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
11b50 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d     Expr *pTerm =
11b60 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
11b70 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
11b80 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  f( pTerm->flags 
11b90 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
11ba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
11bb0 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 43 6f 6c  ll = pTerm->pCol
11bc0 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  l;.        }else
11bd0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
11be0 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
11bf0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
11c00 2c 20 61 50 65 72 6d 75 74 65 5b 69 5d 29 3b 0a  , aPermute[i]);.
11c10 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
11c20 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70  >flags |= EP_Exp
11c30 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20  Collate;.       
11c40 20 20 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 20     pTerm->pColl 
11c50 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  = pColl;.       
11c60 20 7d 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d   }.        pKeyM
11c70 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  erge->aColl[i] =
11c80 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20   pColl;.        
11c90 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74  pKeyMerge->aSort
11ca0 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65  Order[i] = pOrde
11cb0 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
11cc0 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  der;.      }.   
11cd0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
11ce0 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20  pKeyMerge = 0;. 
11cf0 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63   }..  /* Reattac
11d00 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
11d10 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65  lause to the que
11d20 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f  ry..  */.  p->pO
11d30 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
11d40 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72  y;.  pPrior->pOr
11d50 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
11d60 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73  xprListDup(pPars
11d70 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c  e->db, pOrderBy,
11d80 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63   0);..  /* Alloc
11d90 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74  ate a range of t
11da0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
11db0 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e  rs and the KeyIn
11dc0 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66  fo needed.  ** f
11dd0 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  or the logic tha
11de0 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63  t removes duplic
11df0 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20  ate result rows 
11e00 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70  when the.  ** op
11e10 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c  erator is UNION,
11e20 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
11e30 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55  RSECT (but not U
11e40 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a  NION ALL)..  */.
11e50 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
11e60 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20   ){.    regPrev 
11e70 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
11e80 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d    int nExpr = p-
11e90 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
11ea0 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64      assert( nOrd
11eb0 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64  erBy>=nExpr || d
11ec0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11ed0 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  );.    regPrev =
11ee0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
11ef0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78  ange(pParse, nEx
11f00 70 72 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  pr+1);.    sqlit
11f10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11f20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
11f30 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65  egPrev);.    pKe
11f40 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33 44 62  yDup = sqlite3Db
11f50 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20  MallocZero(db,. 
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f70 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 44 75 70   sizeof(*pKeyDup
11f80 29 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f  ) + nExpr*(sizeo
11f90 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29  f(CollSeq*)+1) )
11fa0 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44 75  ;.    if( pKeyDu
11fb0 70 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 44  p ){.      pKeyD
11fc0 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  up->aSortOrder =
11fd0 20 28 75 38 2a 29 26 70 4b 65 79 44 75 70 2d 3e   (u8*)&pKeyDup->
11fe0 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20  aColl[nExpr];.  
11ff0 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 6e 46 69      pKeyDup->nFi
12000 65 6c 64 20 3d 20 28 75 31 36 29 6e 45 78 70 72  eld = (u16)nExpr
12010 3b 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d  ;.      pKeyDup-
12020 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  >enc = ENC(db);.
12030 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
12040 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nExpr; i++){.  
12050 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
12060 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53  Coll[i] = multiS
12070 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
12080 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
12090 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f      pKeyDup->aSo
120a0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a  rtOrder[i] = 0;.
120b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
120c0 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74  }. .  /* Separat
120d0 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74  e the left and t
120e0 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66  he right query f
120f0 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a  rom one another.
12100 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72    */.  p->pPrior
12110 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e   = 0;.  pPrior->
12120 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
12130 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
12140 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
12150 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
12160 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
12170 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72   if( pPrior->pPr
12180 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ior==0 ){.    sq
12190 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
121a0 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
121b0 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d   pPrior, pPrior-
121c0 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
121d0 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  R");.  }..  /* C
121e0 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
121f0 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
12200 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
12210 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
12220 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66   labelEnd);.  if
12230 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f  ( p->iLimit && o
12240 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
12250 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70   regLimitA = ++p
12260 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
12270 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70   regLimitB = ++p
12280 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
12290 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
122a0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
122b0 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69  ->iOffset ? p->i
122c0 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c  Offset+1 : p->iL
122d0 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122f0 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74          regLimit
12300 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
12310 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12320 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c  Copy, regLimitA,
12330 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d   regLimitB);.  }
12340 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d  else{.    regLim
12350 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20  itA = regLimitB 
12360 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
12370 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
12380 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70   p->pLimit);.  p
12390 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
123a0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
123b0 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  e(db, p->pOffset
123c0 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  );.  p->pOffset 
123d0 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41  = 0;..  regAddrA
123e0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
123f0 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d 20 2b  m;.  regEofA = +
12400 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
12410 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50   regAddrB = ++pP
12420 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
12430 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72 73 65  gEofB = ++pParse
12440 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
12450 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
12460 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20  em;.  regOutB = 
12470 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12480 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
12490 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20  estInit(&destA, 
124a0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
124b0 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
124c0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
124d0 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f  t(&destB, SRT_Co
124e0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
124f0 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 70  B);..  /* Jump p
12500 61 73 74 20 74 68 65 20 76 61 72 69 6f 75 73 20  ast the various 
12510 73 75 62 72 6f 75 74 69 6e 65 73 20 61 6e 64 20  subroutines and 
12520 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20 74 68  coroutines to th
12530 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65 72 67  e main.  ** merg
12540 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31  e loop.  */.  j1
12550 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12560 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
12570 3b 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  ;.  addrSelectA 
12580 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
12590 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 0a 20  rentAddr(v);... 
125a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
125b0 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
125c0 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
125d0 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
125e0 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68  .  ** left of th
125f0 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  e compound opera
12600 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65  tor - the "A" se
12610 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
12620 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
12630 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e   "Begin coroutin
12640 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43  e for left SELEC
12650 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
12660 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
12670 74 41 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  tA;.  sqlite3Sel
12680 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
12690 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73  or, &destA);.  s
126a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
126b0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
126c0 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73  1, regEofA);.  s
126d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
126e0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
126f0 67 41 64 64 72 41 29 3b 0a 20 20 56 64 62 65 4e  gAddrA);.  VdbeN
12700 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
12710 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  End coroutine fo
12720 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29  r left SELECT"))
12730 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
12740 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
12750 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
12760 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
12770 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74   .  ** the right
12780 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63   - the "B" selec
12790 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  t.  */.  addrSel
127a0 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  ectB = sqlite3Vd
127b0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
127c0 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
127d0 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63  ent((v, "Begin c
127e0 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
127f0 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ht SELECT"));.  
12800 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e  savedLimit = p->
12810 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f  iLimit;.  savedO
12820 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
12830 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  et;.  p->iLimit 
12840 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70  = regLimitB;.  p
12850 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20  ->iOffset = 0;  
12860 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
12870 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
12880 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  tB);.  p->iLimit
12890 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20   = savedLimit;. 
128a0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61   p->iOffset = sa
128b0 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c  vedOffset;.  sql
128c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
128d0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
128e0 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c   regEofB);.  sql
128f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12900 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
12910 64 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f  ddrB);.  VdbeNoo
12920 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  pComment((v, "En
12930 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  d coroutine for 
12940 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
12950 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
12960 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
12970 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
12980 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
12990 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   A.  ** select a
129a0 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
129b0 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
129c0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
129d0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
129e0 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
129f0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29   routine for A")
12a00 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20  );.  addrOutA = 
12a10 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
12a20 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
12a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12a40 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65    p, &destA, pDe
12a50 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20  st, regOutA,.   
12a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
12a70 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
12a80 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
12a90 46 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  FF, labelEnd);. 
12aa0 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   .  /* Generate 
12ab0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
12ac0 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
12ad0 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
12ae0 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   B.  ** select a
12af0 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
12b00 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
12b10 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
12b20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
12b30 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
12b40 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e  ION ){.    VdbeN
12b50 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
12b60 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
12b70 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64  or B"));.    add
12b80 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65  rOutB = generate
12b90 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
12ba0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
12bb0 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
12bc0 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stB, pDest, regO
12bd0 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utB,.           
12be0 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
12bf0 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e  KeyDup, P4_KEYIN
12c00 46 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62 65 6c  FO_STATIC, label
12c10 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  End);.  }..  /* 
12c20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
12c30 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
12c40 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
12c50 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a  om select A.  **
12c60 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
12c70 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
12c80 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73  select B remains
12c90 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ..  */.  VdbeNoo
12ca0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
12cb0 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-A subroutine")
12cc0 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
12cd0 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
12ce0 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
12cf0 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
12d00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12d10 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
12d20 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65  belEnd);.  }else
12d30 7b 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41  {  .    addrEofA
12d40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12d50 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
12d60 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64  egEofB, labelEnd
12d70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12d80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
12d90 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
12da0 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71  ddrOutB);.    sq
12db0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
12dc0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
12dd0 41 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69  AddrB);.    sqli
12de0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12df0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
12e00 72 45 6f 66 41 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rEofA);.  }..  /
12e10 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
12e20 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
12e30 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
12e40 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20  from select B.  
12e50 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
12e60 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
12e70 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69  n select A remai
12e80 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
12e90 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
12ea0 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  ){.    addrEofB 
12eb0 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 7d 65  = addrEofA;.  }e
12ec0 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
12ed0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
12ee0 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  eof-B subroutine
12ef0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
12f00 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
12f10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
12f20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e  regEofA, labelEn
12f30 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
12f40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12f50 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
12f60 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73  addrOutA);.    s
12f70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12f80 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
12f90 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c  gAddrA);.    sql
12fa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12fb0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
12fc0 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20  drEofB);.  }..  
12fd0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
12fe0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
12ff0 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a  ase of A<B.  */.
13000 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
13010 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75  t((v, "A-lt-B su
13020 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
13030 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65  ddrAltB = sqlite
13040 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13050 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
13060 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73  , addrOutA);.  s
13070 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
13080 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
13090 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
130a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
130b0 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
130c0 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c  addrEofA);.  sql
130d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
130e0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
130f0 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
13100 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
13110 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
13120 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20   of A==B.  */.  
13130 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
13140 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
13150 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c   addrAltB;.  }el
13160 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  se if( op==TK_IN
13170 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
13180 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
13190 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42  tB;.    addrAltB
131a0 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
131b0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
131c0 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62  ((v, "A-eq-B sub
131d0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
131e0 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73  addrAeqB =.    s
131f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
13200 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
13210 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c  gAddrA);.    sql
13220 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13230 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
13240 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20  , addrEofA);.   
13250 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13260 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
13270 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
13280 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
13290 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
132a0 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a  the case of A>B.
132b0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
132c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74  omment((v, "A-gt
132d0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
132e0 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73  ;.  addrAgtB = s
132f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
13300 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
13310 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
13320 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
13330 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13340 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
13350 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
13360 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  tB);.  }.  sqlit
13370 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13380 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
13390 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rB);.  sqlite3Vd
133a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
133b0 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72  f, regEofB, addr
133c0 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofB);.  sqlite3
133d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
133e0 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
133f0 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  mpr);..  /* This
13400 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20   code runs once 
13410 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76  to initialize ev
13420 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  erything..  */. 
13430 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13440 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73  Here(v, j1);.  s
13450 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13460 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
13470 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73  0, regEofA);.  s
13480 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13490 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
134a0 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73  0, regEofB);.  s
134b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
134c0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
134d0 67 41 64 64 72 41 2c 20 61 64 64 72 53 65 6c 65  gAddrA, addrSele
134e0 63 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ctA);.  sqlite3V
134f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13500 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 42 2c  Gosub, regAddrB,
13510 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
13520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13530 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
13540 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  EofA, addrEofA);
13550 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13560 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
13570 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42  egEofB, addrEofB
13580 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65  );..  /* Impleme
13590 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67  nt the main merg
135a0 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
135b0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
135c0 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d  Label(v, labelCm
135d0 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pr);.  sqlite3Vd
135e0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
135f0 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30  ermutation, 0, 0
13600 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72  , 0, (char*)aPer
13610 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41  mute, P4_INTARRA
13620 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Y);.  sqlite3Vdb
13630 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
13640 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 4d 65  mpare, destA.iMe
13650 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c 20 6e  m, destB.iMem, n
13660 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13680 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72    (char*)pKeyMer
13690 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ge, P4_KEYINFO_H
136a0 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74  ANDOFF);.  sqlit
136b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
136c0 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74  OP_Jump, addrAlt
136d0 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64  B, addrAeqB, add
136e0 72 41 67 74 42 29 3b 0a 0a 20 20 2f 2a 20 52 65  rAgtB);..  /* Re
136f0 6c 65 61 73 65 20 74 65 6d 70 6f 72 61 72 79 20  lease temporary 
13700 72 65 67 69 73 74 65 72 73 0a 20 20 2a 2f 0a 20  registers.  */. 
13710 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
13720 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
13730 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
13740 73 65 2c 20 72 65 67 50 72 65 76 2c 20 6e 4f 72  se, regPrev, nOr
13750 64 65 72 42 79 2b 31 29 3b 0a 20 20 7d 0a 0a 20  derBy+1);.  }.. 
13760 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
13770 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
13780 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  der to terminate
13790 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
137a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
137b0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
137c0 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53  belEnd);..  /* S
137d0 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
137e0 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a   output columns.
137f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
13800 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
13810 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  put ){.    Selec
13820 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69  t *pFirst = pPri
13830 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  or;.    while( p
13840 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
13850 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
13860 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e  >pPrior;.    gen
13870 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
13880 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
13890 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st->pEList);.  }
138a0 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c  ..  /* Reassembl
138b0 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  y the compound q
138c0 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20  uery so that it 
138d0 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f  will be freed co
138e0 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  rrectly.  ** by 
138f0 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
13900 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  tion */.  if( p-
13910 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73  >pPrior ){.    s
13920 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
13930 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  te(db, p->pPrior
13940 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69  );.  }.  p->pPri
13950 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20 20  or = pPrior;..  
13960 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
13970 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
13980 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
13990 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
139a0 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
139b0 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 72 65 74 75  ies ****/.  retu
139c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
139d0 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
139e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
139f0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
13a00 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
13a10 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77  IT_VIEW)./* Forw
13a20 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73  ard Declarations
13a30 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
13a40 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 73 71  substExprList(sq
13a50 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74  lite3*, ExprList
13a60 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
13a70 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
13a80 73 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69  substSelect(sqli
13a90 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20  te3*, Select *, 
13aa0 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29  int, ExprList *)
13ab0 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  ;../*.** Scan th
13ac0 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73  rough the expres
13ad0 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70  sion pExpr.  Rep
13ae0 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72  lace every refer
13af0 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c  ence to.** a col
13b00 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d  umn in table num
13b10 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20  ber iTable with 
13b20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43  a copy of the iC
13b30 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72  olumn-th.** entr
13b40 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42  y in pEList.  (B
13b50 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e  ut leave referen
13b60 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44  ces to the ROWID
13b70 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68   column .** unch
13b80 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  anged.).**.** Th
13b90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61  is routine is pa
13ba0 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65  rt of the flatte
13bb0 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20  ning procedure. 
13bc0 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77   A subquery.** w
13bd0 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20  hose result set 
13be0 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45  is defined by pE
13bf0 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20  List appears as 
13c00 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20  entry in the.** 
13c10 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
13c20 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61   SELECT such tha
13c30 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f  t the VDBE curso
13c40 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  r assigned to th
13c50 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73  at.** FORM claus
13c60 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c  e entry is iTabl
13c70 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
13c80 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73   make the necess
13c90 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  ary .** changes 
13ca0 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74  to pExpr so that
13cb0 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63   it refers direc
13cc0 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63  tly to the sourc
13cd0 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68  e table.** of th
13ce0 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65  e subquery rathe
13cf0 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
13d00 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
13d10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13d20 20 73 75 62 73 74 45 78 70 72 28 0a 20 20 73 71   substExpr(.  sq
13d30 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
13d40 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
13d50 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69  oc errors to thi
13d60 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  s connection */.
13d70 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
13d80 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e        /* Expr in
13d90 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74   which substitut
13da0 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20  ion occurs */.  
13db0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
13dc0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
13dd0 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
13de0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
13df0 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74  List    /* Subst
13e00 69 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e  itute expression
13e10 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  s */.){.  if( pE
13e20 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
13e30 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
13e40 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
13e50 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Expr->iTable==iT
13e60 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  able ){.    if( 
13e70 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
13e80 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
13e90 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
13ea0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13eb0 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
13ec0 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
13ed0 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
13ee0 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45  olumn<pEList->nE
13ef0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
13f00 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
13f10 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
13f20 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
13f30 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d    pNew = pEList-
13f40 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
13f50 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  n].pExpr;.      
13f60 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20  assert( pNew!=0 
13f70 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
13f80 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20  op = pNew->op;. 
13f90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
13fa0 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a  pr->pLeft==0 );.
13fb0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
13fc0 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
13fd0 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c  Dup(db, pNew->pL
13fe0 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  eft, 0);.      a
13ff0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
14000 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
14010 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
14020 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
14030 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  db, pNew->pRight
14040 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 45 78 70  , 0);.      pExp
14050 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77  r->iTable = pNew
14060 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
14070 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 4e  pExpr->pTab = pN
14080 65 77 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  ew->pTab;.      
14090 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
140a0 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a   pNew->iColumn;.
140b0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
140c0 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a  g = pNew->iAgg;.
140d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
140e0 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45 78 70  enCopy(db, &pExp
140f0 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d  r->token, &pNew-
14100 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  >token);.      s
14110 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
14120 64 62 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e  db, &pExpr->span
14130 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a  , &pNew->span);.
14140 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
14150 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20  xpr->x.pList==0 
14160 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  && pExpr->x.pSel
14170 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect==0 );.      
14180 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
14190 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
141a0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
141b0 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c     pExpr->x.pSel
141c0 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
141d0 65 63 74 44 75 70 28 64 62 2c 20 70 4e 65 77 2d  ectDup(db, pNew-
141e0 3e 78 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  >x.pSelect, 0);.
141f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14200 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c       pExpr->x.pL
14210 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
14220 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4e 65  rListDup(db, pNe
14230 77 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 29 3b 0a  w->x.pList, 0);.
14240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45        }.      pE
14250 78 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65  xpr->flags = pNe
14260 77 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20  w->flags;.      
14270 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
14280 3d 20 70 4e 65 77 2d 3e 70 41 67 67 49 6e 66 6f  = pNew->pAggInfo
14290 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 41  ;.      pNew->pA
142a0 67 67 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  ggInfo = 0;.    
142b0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
142c0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78  ubstExpr(db, pEx
142d0 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  pr->pLeft, iTabl
142e0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
142f0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45  substExpr(db, pE
14300 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  xpr->pRight, iTa
14310 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
14320 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
14330 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
14340 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
14350 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
14360 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  db, pExpr->x.pSe
14370 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
14380 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  List);.    }else
14390 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
143a0 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d  rList(db, pExpr-
143b0 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65  >x.pList, iTable
143c0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
143d0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
143e0 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
143f0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
14400 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
14410 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
14420 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c   here */.  ExprL
14430 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
14440 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20  /* List to scan 
14450 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20  and in which to 
14460 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73  make substitutes
14470 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
14480 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
14490 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69  ble to be substi
144a0 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  tuted */.  ExprL
144b0 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
144c0 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
144d0 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lues */.){.  int
144e0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
144f0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
14500 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
14510 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
14520 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
14530 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
14540 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
14550 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
14560 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
14570 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
14580 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
14590 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
145a0 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
145b0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
145c0 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
145d0 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
145e0 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
145f0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
14600 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
14610 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70   Table to be rep
14620 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  laced */.  ExprL
14630 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
14640 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
14650 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  lues */.){.  Src
14660 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74  List *pSrc;.  st
14670 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
14680 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
14690 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  i;.  if( !p ) re
146a0 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70  turn;.  substExp
146b0 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c  rList(db, p->pEL
146c0 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
146d0 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
146e0 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72  rList(db, p->pGr
146f0 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  oupBy, iTable, p
14700 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
14710 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
14720 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
14730 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
14740 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61  tExpr(db, p->pHa
14750 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45  ving, iTable, pE
14760 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
14770 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  pr(db, p->pWhere
14780 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
14790 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74  );.  substSelect
147a0 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
147b0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
147c0 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
147d0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
147e0 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f  c );  /* Even fo
147f0 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65 20  r (SELECT 1) we 
14800 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75  have: pSrc!=0 bu
14810 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  t pSrc->nSrc==0 
14820 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
14830 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72  pSrc) ){.    for
14840 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70  (i=pSrc->nSrc, p
14850 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e  Item=pSrc->a; i>
14860 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
14870 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
14880 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ect(db, pItem->p
14890 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
148a0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
148b0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
148c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
148d0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
148e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
148f0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
14900 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
14910 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
14920 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
14930 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
14940 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14950 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
14960 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
14970 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  es in order to s
14980 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f  peed.** executio
14990 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31  n.  It returns 1
149a0 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61   if it makes cha
149b0 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f  nges and 0 if no
149c0 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f   flattening.** o
149d0 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
149e0 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
149f0 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
14a00 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
14a10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
14a20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
14a30 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
14a40 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
14a50 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
14a60 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
14a70 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
14a80 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
14a90 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
14aa0 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
14ab0 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
14ac0 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
14ad0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
14ae0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
14af0 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
14b00 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
14b10 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
14b20 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
14b30 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
14b40 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
14b50 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
14b60 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
14b70 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
14b80 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
14b90 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
14ba0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
14bb0 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
14bc0 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
14bd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
14be0 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
14bf0 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
14c00 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
14c10 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
14c20 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
14c30 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
14c40 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
14c50 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
14c60 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
14c70 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
14c80 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
14c90 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
14ca0 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
14cb0 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
14cc0 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
14cd0 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
14ce0 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
14cf0 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
14d00 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
14d10 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
14d20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
14d30 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
14d40 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
14d50 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
14d60 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
14d70 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
14d80 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
14d90 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
14da0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14db0 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
14dc0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
14dd0 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75  **   (2)  The su
14de0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
14df0 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
14e00 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
14e10 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
14e20 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75  **   (3)  The su
14e30 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
14e40 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
14e50 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20  of a left outer 
14e60 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  join.**        (
14e70 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65  Originally ticke
14e80 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67 68  t #306.  Strengh
14e90 74 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20  tened by ticket 
14ea0 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28  #3300).**.**   (
14eb0 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
14ec0 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
14ed0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
14ee0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
14ef0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20  n..**.**   (5)  
14f00 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
14f10 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
14f20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
14f30 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
14f40 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
14f50 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20  s..**.**   (6)  
14f60 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
14f70 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
14f80 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
14f90 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
14fa0 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
14fb0 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20  T..**.**   (7)  
14fc0 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  The subquery has
14fd0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a   a FROM clause..
14fe0 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65  **.**   (8)  The
14ff0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
15000 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
15010 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
15020 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
15030 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20  *.**   (9)  The 
15040 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
15050 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
15060 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
15070 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
15080 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
15090 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54  ..**.**  (10)  T
150a0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
150b0 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
150c0 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
150d0 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a   query does not.
150e0 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49  **        use LI
150f0 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  MIT..**.**  (11)
15100 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
15110 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
15120 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68  ry do not both h
15130 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  ave ORDER BY cla
15140 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32  uses..**.**  (12
15150 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74  )  Not implement
15160 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e  ed.  Subsumed in
15170 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  to restriction (
15180 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75  3).  Was previou
15190 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20  sly.**        a 
151a0 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63  separate restric
151b0 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72  tion deriving fr
151c0 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a  om ticket #350..
151d0 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65  **.**  (13)  The
151e0 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75   subquery and ou
151f0 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
15200 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 0a   both use LIMIT.
15210 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
15220 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
15230 6f 74 20 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a  ot use OFFSET.**
15240 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f  .**  (15)  The o
15250 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
15260 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  t part of a comp
15270 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74  ound select or t
15280 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
15290 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68  query does not h
152a0 61 76 65 20 62 6f 74 68 20 61 6e 20 4f 52 44 45  ave both an ORDE
152b0 52 20 42 59 20 61 6e 64 20 61 20 4c 49 4d 49 54  R BY and a LIMIT
152c0 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
152d0 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23     (See ticket #
152e0 32 33 33 39 29 0a 2a 2a 0a 2a 2a 20 20 28 31 36  2339).**.**  (16
152f0 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  )  The outer que
15300 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
15310 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75  regate or the su
15320 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20  bquery does.**  
15330 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69        not contai
15340 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69  n ORDER BY.  (Ti
15350 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69  cket #2942)  Thi
15360 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61  s used to not ma
15370 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75  tter.**        u
15380 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63  ntil we introduc
15390 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e  ed the group_con
153a0 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  cat() function. 
153b0 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54   .**.**  (17)  T
153c0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
153d0 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73  not a compound s
153e0 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20  elect, or it is 
153f0 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20  a UNION ALL .** 
15400 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20         compound 
15410 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65  clause made up e
15420 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61  ntirely of non-a
15430 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
15440 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20  , and .**       
15450 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
15460 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  y:.**.**        
15470 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c    * is not itsel
15480 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  f part of a comp
15490 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20  ound select,.** 
154a0 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f           * is no
154b0 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
154c0 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79  r DISTINCT query
154d0 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  , and.**        
154e0 20 20 2a 20 68 61 73 20 6e 6f 20 6f 74 68 65 72    * has no other
154f0 20 74 61 62 6c 65 73 20 6f 72 20 73 75 62 2d 73   tables or sub-s
15500 65 6c 65 63 74 73 20 69 6e 20 74 68 65 20 46 52  elects in the FR
15510 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
15520 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
15530 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
15540 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
15550 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
15560 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
15570 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
15580 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
15590 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
155a0 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
155b0 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
155c0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 0a  OFFSET clauses..
155d0 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20  **.**  (18)  If 
155e0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
155f0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
15600 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72  ct, then all ter
15610 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  ms of the.**    
15620 20 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61      ORDER by cla
15630 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  use of the paren
15640 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65  t must be simple
15650 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a   references to .
15660 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  **        column
15670 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  s of the sub-que
15680 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20  ry..**.**  (19) 
15690 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
156a0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
156b0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
156c0 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
156d0 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48         have a WH
156e0 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ERE clause..**.*
156f0 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  * In this routin
15700 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d  e, the "p" param
15710 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
15720 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  r to the outer q
15730 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62  uery..** The sub
15740 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63  query is p->pSrc
15750 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41  ->a[iFrom].  isA
15760 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
15770 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a  e outer query.**
15780 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
15790 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41   and subqueryIsA
157a0 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
157b0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
157c0 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
157d0 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
157e0 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
157f0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
15800 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65  s a no-op and re
15810 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66  turns 0..** If f
15820 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74  lattening is att
15830 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74  empted this rout
15840 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a  ine returns 1..*
15850 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
15860 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79  expression analy
15870 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f  sis must occur o
15880 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72  n both the outer
15890 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68   query and.** th
158a0 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72  e subquery befor
158b0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  e this routine r
158c0 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uns..*/.static i
158d0 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  nt flattenSubque
158e0 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
158f0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
15900 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
15910 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
15920 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
15930 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
15940 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
15950 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
15960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
15970 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
15980 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
15990 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
159a0 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20  t isAgg,        
159b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
159c0 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
159d0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
159e0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  ons */.  int sub
159f0 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a  queryIsAgg    /*
15a00 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62   True if the sub
15a10 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
15a20 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
15a30 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
15a40 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
15a50 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a  text = pParse->z
15a60 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53  AuthContext;.  S
15a70 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a  elect *pParent;.
15a80 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
15a90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
15aa0 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
15ab0 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
15ac0 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
15ad0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
15ae0 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
15af0 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
15b00 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
15b10 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
15b20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
15b30 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
15b40 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
15b50 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
15b60 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
15b70 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
15b80 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
15b90 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
15ba0 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74  t set of the out
15bb0 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
15bc0 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
15bd0 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
15be0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
15bf0 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
15c00 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
15c10 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
15c20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
15c30 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  er */.  Expr *pW
15c40 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  here;           
15c50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15c60 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
15c70 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
15c80 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b  _item *pSubitem;
15c90 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
15ca0 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
15cb0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
15cc0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
15cd0 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
15ce0 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
15cf0 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
15d00 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
15d10 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
15d20 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  rt( p->pPrior==0
15d30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74   );  /* Unable t
15d40 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75  o flatten compou
15d50 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  nd queries */.  
15d60 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
15d70 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
15d80 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
15d90 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
15da0 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
15db0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
15dc0 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
15dd0 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
15de0 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
15df0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
15e00 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
15e10 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73    if( isAgg && s
15e20 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
15e30 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
15e40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
15e50 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a  riction (1)  */.
15e60 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
15e70 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72  Agg && pSrc->nSr
15e80 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  c>1 ) return 0; 
15e90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
15ea0 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a  riction (2)  */.
15eb0 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
15ec0 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
15ed0 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f  ( pSubSrc );.  /
15ee0 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69  * Prior to versi
15ef0 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c  on 3.1.2, when L
15f00 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
15f10 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65  had to be simple
15f20 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a   constants,.  **
15f30 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65   not arbitrary e
15f40 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20  xpresssions, we 
15f50 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d  allowed some com
15f60 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20  bining of LIMIT 
15f70 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
15f80 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75  because they cou
15f90 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61  ld be computed a
15fa0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
15fb0 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20   But when LIMIT 
15fc0 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
15fd0 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79  became arbitrary
15fe0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
15ff0 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20   were forced to 
16000 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73  add restrictions
16010 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28   (13).  ** and (
16020 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53  14). */.  if( pS
16030 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
16040 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
16050 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
16060 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
16070 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (13) */.  if( pS
16080 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65  ub->pOffset ) re
16090 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160b0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
160c0 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d  (14) */.  if( p-
160d0 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70  >pRightmost && p
160e0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
160f0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
16100 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
16140 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f  triction (15) */
16150 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53  .  }.  if( pSubS
16160 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
16170 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16190 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29   Restriction (7)
161a0 20 20 2a 2f 0a 20 20 69 66 28 20 28 28 70 53 75    */.  if( ((pSu
161b0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
161c0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c  _Distinct)!=0 ||
161d0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20 0a   pSub->pLimit) .
161e0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 53 72           && (pSr
161f0 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
16200 67 67 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  gg) ){          
16210 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
16220 28 34 29 28 35 29 28 38 29 28 39 29 20 2a 2f 0a  (4)(5)(8)(9) */.
16230 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
16240 20 20 20 20 20 0a 20 20 7d 0a 20 20 69 66 28 20       .  }.  if( 
16250 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
16260 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26  F_Distinct)!=0 &
16270 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
16280 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
16290 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
162a0 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f  triction (6)  */
162b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
162c0 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e  rderBy && pSub->
162d0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
162e0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16310 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
16320 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a  ion (11) */.  }.
16330 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70    if( isAgg && p
16340 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  Sub->pOrderBy ) 
16350 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
16360 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
16370 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a  riction (16) */.
16380 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
16390 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20  it && p->pWhere 
163a0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
163b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
163c0 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a  riction (19) */.
163d0 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  /* OBSOLETE C
163e0 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52  OMMENT 1:.  ** R
163f0 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49  estriction 3:  I
16400 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
16410 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73  s a join, make s
16420 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
16430 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73   is .  ** not us
16440 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20  ed as the right 
16450 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75  operand of an ou
16460 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70  ter join.  Examp
16470 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a  les of why this.
16480 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f    ** is not allo
16490 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
164a0 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
164b0 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f  UTER JOIN (t2 JO
164c0 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  IN t3).  **.  **
164d0 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
164e0 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
164f0 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
16500 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
16510 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
16520 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20   JOIN t3.  **.  
16530 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  ** which is not 
16540 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20  at all the same 
16550 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  thing..  **.  **
16560 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
16570 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69  T 2:.  ** Restri
16580 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68  ction 12:  If th
16590 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
165a0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
165b0 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a  of a left outer.
165c0 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20    ** join, make 
165d0 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
165e0 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
165f0 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65  lause..  ** An e
16600 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
16610 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
16620 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
16630 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
16640 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  TER JOIN (SELECT
16650 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
16660 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20   t2.x>0).  **.  
16670 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
16680 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
16690 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
166a0 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
166b0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
166c0 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a  2) WHERE t2.x>0.
166d0 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68    **.  ** But th
166e0 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69  e t2.x>0 test wi
166f0 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f  ll always fail o
16700 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20  n a NULL row of 
16710 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65  t2, which.  ** e
16720 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65  ffectively conve
16730 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f  rts the OUTER JO
16740 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52  IN into an INNER
16750 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   JOIN..  **.  **
16760 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53 20   THIS OVERRIDES 
16770 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
16780 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a  S 1 AND 2 ABOVE:
16790 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33  .  ** Ticket #33
167a0 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c  00 shows that fl
167b0 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67  attening the rig
167c0 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
167d0 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66  T JOIN.  ** is f
167e0 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e 67  raught with dang
167f0 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f  er.  Best to avo
16800 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  id the whole thi
16810 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  ng.  If the.  **
16820 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
16830 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
16840 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e   LEFT JOIN, then
16850 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e   do not flatten.
16860 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75  .  */.  if( (pSu
16870 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bitem->jointype 
16880 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
16890 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
168a0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
168b0 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65  ction 17: If the
168c0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
168d0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c  compound SELECT,
168e0 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20   then it must.  
168f0 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20  ** use only the 
16900 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
16910 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20  or. And none of 
16920 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63  the simple selec
16930 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74  t queries.  ** t
16940 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
16950 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
16960 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62  are allowed to b
16970 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64  e aggregate or d
16980 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65  istinct.  ** que
16990 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ries..  */.  if(
169a0 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b   pSub->pPrior ){
169b0 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
169c0 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
169d0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
169e0 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
169f0 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
16a00 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  n 0;.    }.    f
16a10 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
16a20 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
16a30 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
16a40 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65    if( (pSub1->se
16a50 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
16a60 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
16a70 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c  te))!=0.       |
16a80 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  | (pSub1->pPrior
16a90 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54   && pSub1->op!=T
16aa0 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c  K_ALL) .       |
16ab0 7c 20 21 70 53 75 62 31 2d 3e 70 53 72 63 20 7c  | !pSub1->pSrc |
16ac0 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  | pSub1->pSrc->n
16ad0 53 72 63 21 3d 31 0a 20 20 20 20 20 20 29 7b 0a  Src!=1.      ){.
16ae0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
16af0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16b00 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74  .    /* Restrict
16b10 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69  ion 18. */.    i
16b20 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
16b30 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a  {.      int ii;.
16b40 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
16b50 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  ii<p->pOrderBy->
16b60 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
16b70 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
16b80 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 69 43 6f  derBy->a[ii].iCo
16b90 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
16ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16bb0 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20   }..  /***** If 
16bc0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
16bd0 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20  int, flattening 
16be0 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a  is permitted. **
16bf0 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f  ***/..  /* Autho
16c00 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72  rize the subquer
16c10 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a  y */.  pParse->z
16c20 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53  AuthContext = pS
16c30 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  ubitem->zName;. 
16c40 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
16c50 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
16c60 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
16c70 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  );.  pParse->zAu
16c80 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
16c90 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  edAuthContext;..
16ca0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
16cb0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
16cc0 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
16cd0 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72  ment, then (by r
16ce0 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a  estrictions.  **
16cf0 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65   17 and 18 above
16d00 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55  ) it must be a U
16d10 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65  NION ALL and the
16d20 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75   parent query mu
16d30 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74  st .  ** be of t
16d40 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
16d50 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65  **     SELECT <e
16d60 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28  xpr-list> FROM (
16d70 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68  <sub-query>) <wh
16d80 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a  ere-clause> .  *
16d90 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  *.  ** followed 
16da0 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  by any ORDER BY,
16db0 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46   LIMIT and/or OF
16dc0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
16dd0 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72  is block.  ** cr
16de0 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73  eates N-1 copies
16df0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71   of the parent q
16e00 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79  uery without any
16e10 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
16e20 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54   or .  ** OFFSET
16e30 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69   clauses and joi
16e40 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c  ns them to the l
16e50 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  eft-hand-side of
16e60 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
16e70 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41  ** using UNION A
16e80 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e  LL operators. In
16e90 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20   this case N is 
16ea0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  the number of si
16eb0 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74  mple.  ** select
16ec0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
16ed0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
16ee0 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  query..  **.  **
16ef0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
16f00 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
16f10 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20  +1 FROM (.  **  
16f20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46        SELECT x F
16f30 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
16f40 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
16f50 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
16f60 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   y FROM tab.  **
16f70 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
16f80 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
16f90 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52  LECT abs(z*2) FR
16fa0 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20  OM tab2.  **    
16fb0 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52   ) WHERE a!=5 OR
16fc0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
16fd0 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
16fe0 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
16ff0 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52     SELECT x+1 FR
17000 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31  OM tab WHERE x+1
17010 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
17020 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
17030 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20  SELECT y+1 FROM 
17040 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35  tab WHERE y+1!=5
17050 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
17060 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
17070 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46  ECT abs(z*2)+1 F
17080 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61  ROM tab2 WHERE a
17090 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a  bs(z*2)+1!=5.  *
170a0 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31  *     ORDER BY 1
170b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61  .  **.  ** We ca
170c0 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d  ll this the "com
170d0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
170e0 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f  lattening"..  */
170f0 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62  .  for(pSub=pSub
17100 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20  ->pPrior; pSub; 
17110 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
17120 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
17130 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69  pNew;.    ExprLi
17140 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
17150 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
17160 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70  Expr *pLimit = p
17170 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65  ->pLimit;.    Se
17180 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
17190 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
171a0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
171b0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
171c0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
171d0 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  0;.    p->pLimit
171e0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d   = 0;.    pNew =
171f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
17200 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20  p(db, p, 0);.   
17210 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
17220 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  mit;.    p->pOrd
17230 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
17240 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  .    p->pSrc = p
17250 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  Src;.    p->op =
17260 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e   TK_ALL;.    p->
17270 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
17280 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
17290 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
172a0 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73  pPrior;.    }els
172b0 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  e{.      pNew->p
172c0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
172d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67        pNew->pRig
172e0 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20  htmost = 0;.    
172f0 7d 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  }.    p->pPrior 
17300 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20  = pNew;.    if( 
17310 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17320 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
17330 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61  ..  /* Begin fla
17340 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f  ttening the iFro
17350 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
17360 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20  e FROM clause . 
17370 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72   ** in the outer
17380 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
17390 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53  Sub = pSub1 = pS
173a0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
173b0 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
173c0 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  e transient tabl
173d0 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f  e structure asso
173e0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
173f0 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20    ** subquery.  
17400 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
17410 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
17420 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73  >zDatabase);.  s
17430 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
17440 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
17450 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
17460 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
17470 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62  >zAlias);.  pSub
17480 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  item->zDatabase 
17490 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
174a0 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53  >zName = 0;.  pS
174b0 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ubitem->zAlias =
174c0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
174d0 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20  pSelect = 0;..  
174e0 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e  /* Defer deletin
174f0 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  g the Table obje
17500 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
17510 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
17520 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20  uery until code 
17530 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20  generation is.  
17540 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e  ** complete, sin
17550 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69  ce there may sti
17560 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54  ll exist Expr.pT
17570 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a  ab entries that.
17580 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68    ** refer to th
17590 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20  e subquery even 
175a0 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  after flattening
175b0 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e  .  Ticket #3346.
175c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
175d0 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b  item->pTab!=0 ){
175e0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
175f0 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d  ToDel = pSubitem
17600 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
17610 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d  pTabToDel->nRef=
17620 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  =1 ){.      pTab
17630 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62  ToDel->pNextZomb
17640 69 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 5a 6f  ie = pParse->pZo
17650 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70  mbieTab;.      p
17660 50 61 72 73 65 2d 3e 70 5a 6f 6d 62 69 65 54 61  Parse->pZombieTa
17670 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20  b = pTabToDel;. 
17680 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17690 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d  pTabToDel->nRef-
176a0 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75  -;.    }.    pSu
176b0 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  bitem->pTab = 0;
176c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
176d0 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75  ollowing loop ru
176e0 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
176f0 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f   term in a compo
17700 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a  und-subquery.  *
17710 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73  * flattening (as
17720 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
17730 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f  ).  If we are do
17740 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20  ing a different 
17750 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61  kind.  ** of fla
17760 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74  ttening - a flat
17770 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61  tening other tha
17780 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
17790 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
177a0 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69   -.  ** then thi
177b0 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73  s loop only runs
177c0 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   once..  **.  **
177d0 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73   This loop moves
177e0 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d   all of the FROM
177f0 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
17800 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
17810 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  he.  ** the FROM
17820 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
17830 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66  uter query.  Bef
17840 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20  ore doing this, 
17850 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68  remember.  ** th
17860 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
17870 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  for the original
17880 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f   outer query FRO
17890 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a  M element in.  *
178a0 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20  * iParent.  The 
178b0 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77  iParent cursor w
178c0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
178d0 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63  d.  Subsequent c
178e0 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63  ode.  ** will sc
178f0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c  an expressions l
17900 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65  ooking for iPare
17910 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  nt references an
17920 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74  d replace.  ** t
17930 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20  hose references 
17940 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73  with expressions
17950 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f   that resolve to
17960 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52   the subquery FR
17970 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73  OM.  ** elements
17980 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79   we are now copy
17990 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66  ing in..  */.  f
179a0 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50  or(pParent=p; pP
179b0 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70  arent; pParent=p
179c0 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20  Parent->pPrior, 
179d0 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
179e0 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62  r){.    int nSub
179f0 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e  Src;.    u8 join
17a00 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53  type = 0;.    pS
17a10 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
17a20 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
17a30 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
17a40 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72  ry */.    nSubSr
17a50 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
17a60 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  c;  /* Number of
17a70 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65   terms in subque
17a80 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  ry FROM clause *
17a90 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61  /.    pSrc = pPa
17aa0 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20  rent->pSrc;     
17ab0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
17ac0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
17ad0 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53  y */..    if( pS
17ae0 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  rc ){.      asse
17af0 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29  rt( pParent==p )
17b00 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65  ;  /* First time
17b10 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
17b20 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74  p */.      joint
17b30 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ype = pSubitem->
17b40 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65  jointype;.    }e
17b50 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
17b60 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b  t( pParent!=p );
17b70 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62    /* 2nd and sub
17b80 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68  sequent times th
17b90 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
17ba0 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  /.      pSrc = p
17bb0 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73  Parent->pSrc = s
17bc0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
17bd0 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29  end(db, 0, 0, 0)
17be0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  ;.      if( pSrc
17bf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
17c00 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
17c10 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
17c20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17c30 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
17c40 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  The subquery use
17c50 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20  s a single slot 
17c60 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
17c70 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a  se of the outer.
17c80 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49      ** query.  I
17c90 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  f the subquery h
17ca0 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
17cb0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20   element in its 
17cc0 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20  FROM clause,.   
17cd0 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20   ** then expand 
17ce0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17cf0 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f  to make space fo
17d00 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  r it to hold all
17d10 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a   elements.    **
17d20 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
17d30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
17d40 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
17d50 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54      **    SELECT
17d60 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53   * FROM tabA, (S
17d70 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62  ELECT * FROM sub
17d80 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a  1, sub2), tabB;.
17d90 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
17da0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61  e outer query ha
17db0 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73  s 3 slots in its
17dc0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f   FROM clause.  O
17dd0 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20  ne slot of the. 
17de0 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
17df0 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c  y (the middle sl
17e00 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74  ot) is used by t
17e10 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68  he subquery.  Th
17e20 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c  e next.    ** bl
17e30 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c  ock of code will
17e40 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20   expand the out 
17e50 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73  query to 4 slots
17e60 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20  .  The middle.  
17e70 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70    ** slot is exp
17e80 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f  anded to two slo
17e90 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ts in order to m
17ea0 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ake space for th
17eb0 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65  e.    ** two ele
17ec0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f  ments in the FRO
17ed0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
17ee0 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  subquery..    */
17ef0 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63  .    if( nSubSrc
17f00 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  >1 ){.      pPar
17f10 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  ent->pSrc = pSrc
17f20 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
17f30 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72  tEnlarge(db, pSr
17f40 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72  c, nSubSrc-1,iFr
17f50 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  om+1);.      if(
17f60 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
17f70 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  d ){.        bre
17f80 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
17f90 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66  }..    /* Transf
17fa0 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  er the FROM clau
17fb0 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  se terms from th
17fc0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
17fd0 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
17fe0 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20   query..    */. 
17ff0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
18000 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
18010 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72     pSrc->a[i+iFr
18020 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  om] = pSubSrc->a
18030 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  [i];.      memse
18040 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  t(&pSubSrc->a[i]
18050 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62  , 0, sizeof(pSub
18060 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20  Src->a[i]));.   
18070 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69   }.    pSrc->a[i
18080 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  From].jointype =
18090 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20   jointype;.  .  
180a0 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
180b0 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
180c0 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
180d0 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
180e0 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
180f0 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
18100 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
18110 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  uery..    ** .  
18120 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
18130 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
18140 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46  LECT a+5, b*10 F
18150 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20  ROM (SELECT x*3 
18160 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20  AS a, y+10 AS b 
18170 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61  FROM t1) WHERE a
18180 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20  >b;.    **   \  
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181a0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
181b0 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
181c0 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
181d0 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f  /.    **    \___
181e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
181f0 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
18200 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18210 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
18220 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20     **.    ** We 
18230 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
18240 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
18250 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
18260 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
18270 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65  ee.    ** "a" we
18280 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33   substitute "x*3
18290 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  " and every plac
182a0 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20  e we see "b" we 
182b0 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30  substitute "y+10
182c0 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c  "..    */.    pL
182d0 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  ist = pParent->p
182e0 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69  EList;.    for(i
182f0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
18300 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
18310 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20  Expr *pExpr;.   
18320 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
18330 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28  i].zName==0 && (
18340 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
18350 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e  [i].pExpr)->span
18360 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  .z!=0 ){.       
18370 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
18380 6d 65 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  me = .          
18390 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74       sqlite3DbSt
183a0 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
183b0 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20  )pExpr->span.z, 
183c0 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  pExpr->span.n);.
183d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
183e0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
183f0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c  db, pParent->pEL
18400 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ist, iParent, pS
18410 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
18420 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
18430 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
18440 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
18450 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
18460 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
18470 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
18480 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
18490 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
184a0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
184b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
184c0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
184d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
184e0 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rent->pOrderBy==
184f0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
18500 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  nt->pOrderBy = p
18510 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
18520 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65       pSub->pOrde
18530 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rBy = 0;.    }el
18540 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  se if( pParent->
18550 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
18560 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
18570 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  db, pParent->pOr
18580 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  derBy, iParent, 
18590 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
185a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
185b0 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  b->pWhere ){.   
185c0 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
185d0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
185e0 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b  Sub->pWhere, 0);
185f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18600 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
18610 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71    }.    if( subq
18620 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
18630 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
18640 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29  nt->pHaving==0 )
18650 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
18660 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65  >pHaving = pPare
18670 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20  nt->pWhere;.    
18680 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
18690 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20  e = pWhere;.    
186a0 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
186b0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
186c0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
186d0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
186e0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
186f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
18700 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  d(db, pParent->p
18710 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20  Having, .       
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18730 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
18740 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
18750 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 29  ub->pHaving, 0))
18760 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18770 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
18780 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  y==0 );.      pP
18790 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20  arent->pGroupBy 
187a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
187b0 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  tDup(db, pSub->p
187c0 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20  GroupBy, 0);.   
187d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75   }else{.      su
187e0 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
187f0 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69 50 61  ent->pWhere, iPa
18800 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
18810 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
18820 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  nt->pWhere = sql
18830 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
18840 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c  pParent->pWhere,
18850 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a   pWhere);.    }.
18860 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c    .    /* The fl
18870 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
18880 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
18890 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
188a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
188b0 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
188c0 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nct. .    */.   
188d0 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61   pParent->selFla
188e0 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46  gs |= pSub->selF
188f0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
18900 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20  ct;.  .    /*.  
18910 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20    ** SELECT ... 
18920 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
18930 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20   LIMIT a OFFSET 
18940 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45  b) LIMIT x OFFSE
18950 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  T y;.    **.    
18960 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65  ** One is tempte
18970 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20  d to try to add 
18980 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69  a and b to combi
18990 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20  ne the limits.  
189a0 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  But this.    ** 
189b0 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
189c0 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
189d0 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a   negative..    *
189e0 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
189f0 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
18a00 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20  pParent->pLimit 
18a10 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a  = pSub->pLimit;.
18a20 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d        pSub->pLim
18a30 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  it = 0;.    }.  
18a40 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  }..  /* Finially
18a50 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
18a60 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
18a70 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
18a80 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
18a90 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   */.  sqlite3Sel
18aa0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
18ab0 75 62 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ub1);..  return 
18ac0 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  1;.}.#endif /* !
18ad0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
18ae0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
18af0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
18b00 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
18b10 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
18b20 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
18b30 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
18b40 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20  argument to see 
18b50 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69  if it.** is a mi
18b60 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
18b70 72 79 2e 20 52 65 74 75 72 6e 20 57 48 45 52 45  ry. Return WHERE
18b80 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
18b90 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
18ba0 58 20 69 66 20 0a 2a 2a 20 69 74 20 69 73 2c 20  X if .** it is, 
18bb0 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20  or 0 otherwise. 
18bc0 41 74 20 70 72 65 73 65 6e 74 2c 20 61 20 71 75  At present, a qu
18bd0 65 72 79 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ery is considere
18be0 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d 69 6e  d to be.** a min
18bf0 28 29 2f 6d 61 78 28 29 20 71 75 65 72 79 20 69  ()/max() query i
18c00 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68  f:.**.**   1. Th
18c10 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ere is a single 
18c20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 46 52  object in the FR
18c30 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
18c40 20 20 20 32 2e 20 54 68 65 72 65 20 69 73 20 61     2. There is a
18c50 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73 69   single expressi
18c60 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  on in the result
18c70 20 73 65 74 2c 20 61 6e 64 20 69 74 20 69 73 0a   set, and it is.
18c80 2a 2a 20 20 20 20 20 20 65 69 74 68 65 72 20 6d  **      either m
18c90 69 6e 28 78 29 20 6f 72 20 6d 61 78 28 78 29 2c  in(x) or max(x),
18ca0 20 77 68 65 72 65 20 78 20 69 73 20 61 20 63 6f   where x is a co
18cb0 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 2e 0a  lumn reference..
18cc0 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e  */.static u8 min
18cd0 4d 61 78 51 75 65 72 79 28 53 65 6c 65 63 74 20  MaxQuery(Select 
18ce0 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78  *p){.  Expr *pEx
18cf0 70 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  pr;.  ExprList *
18d00 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
18d10 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c 69 73  st;..  if( pELis
18d20 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
18d30 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
18d40 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45 78  BY_NORMAL;.  pEx
18d50 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30  pr = pEList->a[0
18d60 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 45  ].pExpr;.  if( E
18d70 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
18d80 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
18d90 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ct) ) return 0;.
18da0 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
18db0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28  ->x.pList;.  if(
18dc0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
18dd0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 70  GG_FUNCTION || p
18de0 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69  EList==0 || pELi
18df0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
18e00 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
18e10 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
18e20 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  r->op!=TK_AGG_CO
18e30 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 57 48  LUMN ) return WH
18e40 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
18e50 41 4c 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  AL;.  if( pExpr-
18e60 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65  >token.n!=3 ) re
18e70 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
18e80 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66 28  BY_NORMAL;.  if(
18e90 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
18ea0 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74  ((char*)pExpr->t
18eb0 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d  oken.z,"min",3)=
18ec0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
18ed0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
18ee0 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  IN;.  }else if( 
18ef0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
18f00 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
18f10 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d  ken.z,"max",3)==
18f20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
18f30 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
18f40 58 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  X;.  }.  return 
18f50 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
18f60 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  RMAL;.}../*.** I
18f70 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
18f80 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73  t item passed as
18f90 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73   an argument was
18fa0 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20   augmented with 
18fb0 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59  an.** INDEXED BY
18fc0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72   clause, then tr
18fd0 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  y to locate the 
18fe0 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e  specified index.
18ff0 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73   If there.** was
19000 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61   such a clause a
19010 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  nd the named ind
19020 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ex cannot be fou
19030 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  nd, return .** S
19040 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20  QLITE_ERROR and 
19050 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  leave an error i
19060 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77  n pParse. Otherw
19070 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a  ise, populate .*
19080 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20  * pFrom->pIndex 
19090 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
190a0 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
190b0 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
190c0 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  kup(Parse *pPars
190d0 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  e, struct SrcLis
190e0 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a  t_item *pFrom){.
190f0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
19100 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64  b && pFrom->zInd
19110 65 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  ex ){.    Table 
19120 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
19130 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Tab;.    char *z
19140 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a  Index = pFrom->z
19150 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78  Index;.    Index
19160 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
19170 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
19180 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  x; .        pIdx
19190 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
191a0 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  mp(pIdx->zName, 
191b0 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20  zIndex); .      
191c0 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65    pIdx=pIdx->pNe
191d0 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  xt.    );.    if
191e0 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20  ( !pIdx ){.     
191f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
19200 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
19210 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49  h index: %s", zI
19220 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  ndex, 0);.      
19230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
19240 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
19250 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70  From->pIndex = p
19260 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Idx;.  }.  retur
19270 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19280 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
19290 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63  ne is a Walker c
192a0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70  allback for "exp
192b0 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54  anding" a SELECT
192c0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22   statement..** "
192d0 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73  Expanding" means
192e0 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f   to do the follo
192f0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  wing:.**.**    (
19300 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44  1)  Make sure VD
19310 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
19320 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
19330 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a  gned to every.**
19340 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74           element
19350 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
19360 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  use..**.**    (2
19370 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
19380 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
19390 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
193a0 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
193b0 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
193c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57   FROM clause.  W
193d0 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72  hen views appear
193e0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
193f0 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  use,.**         
19400 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
19410 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
19420 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
19430 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
19440 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
19450 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
19460 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
19470 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
19480 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
19490 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
194a0 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
194b0 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
194c0 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
194d0 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
194e0 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
194f0 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
19500 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20   the presistent 
19510 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
19520 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
19530 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
19540 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (3)  Add terms t
19550 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
19560 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65  se to accomodate
19570 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
19580 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
19590 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
195a0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
195b0 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
195c0 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61  *.**    (4)  Sca
195d0 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
195e0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
195f0 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
19600 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
19610 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
19620 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
19630 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
19640 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
19650 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
19660 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
19670 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
19680 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
19690 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
196a0 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
196b0 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
196c0 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a  in TABLE..**.*/.
196d0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
196e0 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72  tExpander(Walker
196f0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
19700 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
19710 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
19720 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
19730 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69  i, j, k;.  SrcLi
19740 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
19750 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
19760 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
19770 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
19780 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
19790 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
197a0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
197b0 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75  led  ){.    retu
197c0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
197d0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 3d  }.  if( p->pSrc=
197e0 3d 30 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  =0 || (p->selFla
197f0 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64  gs & SF_Expanded
19800 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
19810 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
19820 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  }.  p->selFlags 
19830 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a  |= SF_Expanded;.
19840 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
19850 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
19860 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f   p->pEList;..  /
19870 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73  * Make sure curs
19880 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
19890 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
198a0 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
198b0 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
198c0 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
198d0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
198e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  */.  sqlite3SrcL
198f0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
19900 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
19910 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75  t);..  /* Look u
19920 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61  p every table na
19930 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
19940 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65  clause of the se
19950 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61  lect.  If.  ** a
19960 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  n entry of the F
19970 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20  ROM clause is a 
19980 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64  subquery instead
19990 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76   of a table or v
199a0 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63  iew,.  ** then c
199b0 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e  reate a transien
199c0 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
199d0 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  e to describe th
199e0 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f  e subquery..  */
199f0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f  .  for(i=0, pFro
19a00 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
19a10 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
19a20 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
19a30 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
19a40 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
19a50 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20  pTab!=0 ){.     
19a60 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   /* This stateme
19a70 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  nt has already b
19a80 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54  een prepared.  T
19a90 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
19aa0 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66        ** to go f
19ab0 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20  urther. */.     
19ac0 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b   assert( i==0 );
19ad0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
19ae0 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
19af0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e     if( pFrom->zN
19b00 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  ame==0 ){.#ifnde
19b10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
19b20 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c  BQUERY.      Sel
19b30 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
19b40 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
19b50 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
19b60 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
19b70 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
19b80 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
19b90 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20   pSel!=0 );.    
19ba0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
19bb0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
19bc0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
19bd0 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
19be0 6c 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d  l);.      pFrom-
19bf0 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
19c00 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
19c10 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
19c20 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ble));.      if(
19c30 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
19c40 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
19c50 20 20 20 70 54 61 62 2d 3e 64 62 20 3d 20 64 62     pTab->db = db
19c60 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  ;.      pTab->nR
19c70 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54  ef = 1;.      pT
19c80 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
19c90 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
19ca0 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f  sqlite_subquery_
19cb0 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 54 61  %p_", (void*)pTa
19cc0 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  b);.      while(
19cd0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b   pSel->pPrior ){
19ce0 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
19cf0 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65  rior; }.      se
19d00 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
19d10 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
19d20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70  pSel->pEList, &p
19d30 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
19d40 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70  ->aCol);.      p
19d50 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
19d60 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62  .      pTab->tab
19d70 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
19d80 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20  meral;.#endif.  
19d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
19da0 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
19db0 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
19dc0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
19dd0 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
19de0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
19df0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
19e00 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
19e10 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  = .        sqlit
19e20 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
19e30 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e  arse,0,pFrom->zN
19e40 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61  ame,pFrom->zData
19e50 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  base);.      if(
19e60 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
19e70 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
19e80 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
19e90 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
19ea0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
19eb0 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c  || !defined (SQL
19ec0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
19ed0 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28  TABLE).      if(
19ee0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c   pTab->pSelect |
19ef0 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  | IsVirtual(pTab
19f00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
19f10 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66  We reach here if
19f20 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
19f30 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76   is a really a v
19f40 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  iew */.        i
19f50 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  f( sqlite3ViewGe
19f60 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
19f70 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74  rse, pTab) ) ret
19f80 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 0a  urn WRC_Abort;..
19f90 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46          /* If pF
19fa0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  rom->pSelect!=0 
19fb0 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
19fc0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20  dealing with a. 
19fd0 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77         ** view w
19fe0 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54  ithin a view.  T
19ff0 68 65 20 53 45 4c 45 43 54 20 73 74 72 75 63 74  he SELECT struct
1a000 75 72 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ure has already 
1a010 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  been.        ** 
1a020 63 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f 75  copied by the ou
1a030 74 65 72 20 76 69 65 77 20 73 6f 20 77 65 20 63  ter view so we c
1a040 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79  an skip the copy
1a050 20 73 74 65 70 20 68 65 72 65 0a 20 20 20 20 20   step here.     
1a060 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e     ** in the inn
1a070 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20  er view..       
1a080 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1a090 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pFrom->pSelect==
1a0a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
1a0b0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
1a0c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
1a0d0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65  (db, pTab->pSele
1a0e0 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ct, 0);.        
1a0f0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
1a100 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72  ect(pWalker, pFr
1a110 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
1a120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1a130 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
1a140 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
1a150 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74  index named by t
1a160 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  he INDEXED BY cl
1a170 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ause, if any. */
1a180 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1a190 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28  IndexedByLookup(
1a1a0 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
1a1b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
1a1c0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
1a1d0 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
1a1e0 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  s NATURAL keywor
1a1f0 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55  ds, and ON and U
1a200 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
1a210 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  joins..  */.  if
1a220 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1a230 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63  ed || sqliteProc
1a240 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20  essJoin(pParse, 
1a250 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
1a260 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
1a270 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
1a280 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
1a290 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
1a2a0 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
1a2b0 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
1a2c0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
1a2d0 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
1a2e0 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
1a2f0 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
1a300 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
1a310 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
1a320 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
1a330 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
1a340 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
1a350 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
1a360 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
1a370 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
1a380 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
1a390 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
1a3a0 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
1a3b0 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
1a3c0 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
1a3d0 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
1a3e0 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
1a3f0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
1a400 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
1a410 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
1a420 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
1a430 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
1a440 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
1a450 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
1a460 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
1a470 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
1a480 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
1a490 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
1a4a0 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  k++){.    Expr *
1a4b0 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
1a4c0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
1a4d0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
1a4e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
1a4f0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
1a500 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26  && pE->pRight &&
1a510 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
1a520 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20  =TK_ALL.        
1a530 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26   && pE->pLeft &&
1a540 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
1a550 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20  TK_ID ) break;. 
1a560 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73   }.  if( k<pELis
1a570 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
1a580 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
1a590 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
1a5a0 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
1a5b0 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
1a5c0 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
1a5d0 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
1a5e0 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
1a5f0 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
1a600 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
1a610 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
1a620 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
1a630 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
1a640 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
1a650 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1a660 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
1a670 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
1a680 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
1a690 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
1a6a0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
1a6b0 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
1a6c0 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
1a6d0 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
1a6e0 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20  mes)!=0.        
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
1a700 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1a710 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
1a720 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30  =0;..    for(k=0
1a730 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
1a740 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; k++){.      E
1a750 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70  xpr *pE = a[k].p
1a760 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
1a770 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
1a780 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45  &.           (pE
1a790 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
1a7a0 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c  pE->pRight==0 ||
1a7b0 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21   pE->pRight->op!
1a7c0 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
1a7d0 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
1a7e0 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
1a7f0 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
1a800 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
1a810 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1a820 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1a830 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1a840 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
1a850 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  k].pExpr, 0);.  
1a860 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
1a870 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
1a880 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
1a890 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e  1].zName = a[k].
1a8a0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
1a8b0 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45  .        a[k].pE
1a8c0 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  xpr = 0;.       
1a8d0 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
1a8e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1a8f0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
1a900 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
1a910 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
1a920 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
1a930 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
1a940 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
1a950 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
1a960 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
1a970 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
1a980 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
1a990 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b     char *zTName;
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
1a9b0 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
1a9c0 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
1a9d0 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
1a9e0 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20  OT && pE->pLeft 
1a9f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  ){.          zTN
1aa00 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
1aa10 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26  eFromToken(db, &
1aa20 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  pE->pLeft->token
1aa30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1aa40 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  {.          zTNa
1aa50 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
1aa60 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
1aa70 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
1aa80 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
1aa90 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
1aaa0 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
1aab0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1aac0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
1aad0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
1aae0 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41  Name = pFrom->zA
1aaf0 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
1ab00 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
1ab10 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d  || zTabName[0]==
1ab20 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
1ab30 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
1ab40 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
1ab50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1ab60 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1ab70 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
1ab80 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
1ab90 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  me && sqlite3Str
1aba0 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61  ICmp(zTName, zTa
1abb0 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  bName)!=0 ){.   
1abc0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1abd0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
1abe0 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
1abf0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
1ac00 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
1ac10 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
1ac20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
1ac30 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68 74 3b  *pExpr, *pRight;
1ac40 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
1ac50 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  r *zName = pTab-
1ac60 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
1ac70 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1ac80 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d  If a column is m
1ac90 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e  arked as 'hidden
1aca0 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  ' (currently onl
1acb0 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  y possible.     
1acc0 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69         ** for vi
1acd0 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64  rtual tables), d
1ace0 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74  o not include it
1acf0 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64   in the expanded
1ad00 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1ad10 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e  result-set list.
1ad20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ad40 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  IsHiddenColumn(&
1ad50 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29  pTab->aCol[j]) )
1ad60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1ad70 61 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c  assert(IsVirtual
1ad80 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20  (pTab));.       
1ad90 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1ada0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  .            }..
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1adc0 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30  i>0 && zTName==0
1add0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ade0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1adf0 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26  _item *pLeft = &
1ae00 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d  pTabList->a[i-1]
1ae10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ae20 69 66 28 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f  if( (pLeft[1].jo
1ae30 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
1ae40 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20  RAL)!=0 &&.     
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae60 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70     columnIndex(p
1ae70 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d  Left->pTab, zNam
1ae80 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
1ae90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
1aea0 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
1aeb0 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
1aec0 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1aee0 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  * table on the r
1aef0 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
1af00 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1af10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1af20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1af30 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
1af40 74 49 6e 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e  tIndex(pLeft[1].
1af50 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
1af60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1af70 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
1af80 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
1af90 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
1afa0 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
1afb0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
1afc0 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
1afd0 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
1afe0 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
1aff0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1b000 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
1b010 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1b020 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
1b030 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 50  Right = sqlite3P
1b040 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1b050 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
1b060 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
1b070 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ight==0 ) break;
1b080 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
1b090 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61 72  QuotedToken(pPar
1b0a0 73 65 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b  se, &pRight->tok
1b0b0 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  en, zName);.    
1b0c0 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
1b0d0 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73  Names || pTabLis
1b0e0 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
1b0f0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
1b100 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  *pLeft = sqlite3
1b110 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
1b120 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
1b130 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1b140 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
1b150 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
1b160 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
1b170 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
1b180 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20     if( pExpr==0 
1b190 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
1b1a0 20 20 20 20 20 20 20 73 65 74 51 75 6f 74 65 64         setQuoted
1b1b0 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70  Token(pParse, &p
1b1c0 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61  Left->token, zTa
1b1d0 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
1b1e0 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26        setToken(&
1b1f0 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 0a 20 20  pExpr->span, .  
1b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b210 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1b220 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
1b230 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20  Name, zName));. 
1b240 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1b250 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31  pr->span.dyn = 1
1b260 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b270 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d  pExpr->token.z =
1b280 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1b290 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e    pExpr->token.n
1b2a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1b2b0 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
1b2c0 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  .dyn = 0;.      
1b2d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b2e0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1b2f0 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
1b300 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1b310 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f  span = pExpr->to
1b320 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ken;.           
1b330 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64     pExpr->span.d
1b340 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  yn = 0;.        
1b350 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1b360 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
1b370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1b380 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
1b390 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
1b3a0 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70  arse, pNew, pExp
1b3b0 72 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29  r, &pExpr->span)
1b3c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
1b3d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1b3e0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1b3f0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1b400 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45  pParse, pNew, pE
1b410 78 70 72 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f  xpr, &pRight->to
1b420 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ken);.          
1b430 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1b440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b450 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e    if( !tableSeen
1b460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1b470 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( zTName ){.    
1b480 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b490 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1b4a0 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
1b4b0 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  %s", zTName);.  
1b4c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1b4d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1b4e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1b4f0 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70  e, "no tables sp
1b500 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  ecified");.     
1b510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1b520 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b530 44 62 46 72 65 65 28 64 62 2c 20 7a 54 4e 61 6d  DbFree(db, zTNam
1b540 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1b550 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
1b560 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
1b570 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
1b580 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
1b590 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
1b5a0 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
1b5b0 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70  ->pEList && p->p
1b5c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d  EList->nExpr>db-
1b5d0 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
1b5e0 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
1b5f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1b600 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
1b610 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
1b620 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20   result set");. 
1b630 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
1b640 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1b650 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
1b660 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
1b670 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
1b680 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
1b690 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
1b6a0 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  e Walker.xExprCa
1b6b0 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72  llback then expr
1b6c0 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20  ession trees.** 
1b6d0 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f  are walked witho
1b6e0 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62  ut any actions b
1b6f0 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61  eing taken at ea
1b700 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d  ch node.  Presum
1b710 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68  ably,.** when th
1b720 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1b730 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45  ed for Walker.xE
1b740 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
1b750 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c   .** Walker.xSel
1b760 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73  ectCallback is s
1b770 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  et to do somethi
1b780 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76  ng useful for ev
1b790 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79  ery .** subquery
1b7a0 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74   in the parser t
1b7b0 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
1b7c0 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28  nt exprWalkNoop(
1b7d0 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
1b7e0 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29   Expr *NotUsed2)
1b7f0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1b800 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
1b810 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
1b820 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1b830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1b840 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22  outine "expands"
1b850 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1b860 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ent and all of i
1b870 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  ts subqueries..*
1b880 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * For additional
1b890 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
1b8a0 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f  what it means to
1b8b0 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45   "expand" a SELE
1b8c0 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c  CT.** statement,
1b8d0 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   see the comment
1b8e0 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78   on the selectEx
1b8f0 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c  pand worker call
1b900 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  back above..**.*
1b910 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45  * Expanding a SE
1b920 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
1b930 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70  s the first step
1b940 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61   in processing a
1b950 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
1b960 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43  ment.  The SELEC
1b970 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74  T statement must
1b980 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66   be expanded bef
1b990 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f  ore.** name reso
1b9a0 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72  lution is perfor
1b9b0 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  med..**.** If an
1b9c0 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
1b9d0 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  g, an error mess
1b9e0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
1b9f0 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54  nto pParse..** T
1ba00 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1ba10 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74  ion can detect t
1ba20 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f  he problem by lo
1ba30 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d  oking at pParse-
1ba40 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20  >nErr.** and/or 
1ba50 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
1ba60 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61  ocFailed..*/.sta
1ba70 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
1ba80 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72  SelectExpand(Par
1ba90 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
1baa0 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
1bab0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53  Walker w;.  w.xS
1bac0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
1bad0 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a  selectExpander;.
1bae0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
1baf0 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  k = exprWalkNoop
1bb00 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
1bb10 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
1bb20 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
1bb30 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66  Select);.}...#if
1bb40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1bb50 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
1bb60 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72  This is a Walker
1bb70 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
1bb80 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68   callback for th
1bb90 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  e sqlite3SelectT
1bba0 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74  ypeInfo().** int
1bbb0 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  erface..**.** Fo
1bbc0 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75  r each FROM-clau
1bbd0 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64  se subquery, add
1bbe0 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e   Column.zType an
1bbf0 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a  d Column.zColl.*
1bc00 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  * information to
1bc10 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
1bc20 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73  ture that repres
1bc30 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  ents the result 
1bc40 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73  set.** of that s
1bc50 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  ubquery..**.** T
1bc60 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
1bc70 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  re that represen
1bc80 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ts the result se
1bc90 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65  t was constructe
1bca0 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78  d.** by selectEx
1bcb0 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65  pander() but the
1bcc0 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74   type and collat
1bcd0 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ion information 
1bce0 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61  was omitted.** a
1bcf0 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63  t that point bec
1bd00 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73  ause identifiers
1bd10 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65   had not yet bee
1bd20 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69  n resolved.  Thi
1bd30 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
1bd40 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65  called after ide
1bd50 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69  ntifier resoluti
1bd60 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1bd70 74 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  t selectAddSubqu
1bd80 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b  eryTypeInfo(Walk
1bd90 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
1bda0 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
1bdb0 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20   *pParse;.  int 
1bdc0 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  i;.  SrcList *pT
1bdd0 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
1bde0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1bdf0 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  From;..  assert(
1be00 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
1be10 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20  F_Resolved );.  
1be20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1be30 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
1be40 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  o)==0 ){.    p->
1be50 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48  selFlags |= SF_H
1be60 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20  asTypeInfo;.    
1be70 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
1be80 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54  ->pParse;.    pT
1be90 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
1bea0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
1beb0 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
1bec0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
1bed0 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
1bee0 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
1bef0 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
1bf00 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ab;.      if( pT
1bf10 61 62 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62  ab && (pTab->tab
1bf20 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
1bf30 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  eral)!=0 ){.    
1bf40 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
1bf50 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
1bf60 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1bf70 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c  T */.        Sel
1bf80 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
1bf90 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
1bfa0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
1bfb0 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   );.        whil
1bfc0 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
1bfd0 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  ) pSel = pSel->p
1bfe0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73  Prior;.        s
1bff0 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
1c000 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
1c010 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f  Parse, pTab->nCo
1c020 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70  l, pTab->aCol, p
1c030 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sel);.      }.  
1c040 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1c050 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
1c060 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1c070 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
1c080 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
1c090 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1c0a0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
1c0b0 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
1c0c0 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
1c0d0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
1c0e0 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
1c0f0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1c100 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
1c110 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
1c120 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
1c130 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1c140 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
1c150 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
1c160 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
1c170 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
1c180 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1c190 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
1c1a0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
1c1b0 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64  back = selectAdd
1c1c0 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
1c1d0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
1c1e0 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f  ack = exprWalkNo
1c1f0 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
1c200 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
1c210 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
1c220 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69   pSelect);.#endi
1c230 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f.}.../*.** This
1c240 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 6f 66   routine sets of
1c250 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1c260 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ent for processi
1c270 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c  ng.  The.** foll
1c280 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c  owing is accompl
1c290 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ished:.**.**    
1c2a0 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20   *  VDBE Cursor 
1c2b0 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69  numbers are assi
1c2c0 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d  gned to all FROM
1c2d0 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a  -clause terms..*
1c2e0 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72  *     *  Ephemer
1c2f0 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73  al Table objects
1c300 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
1c310 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
1c320 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20   subqueries..** 
1c330 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53      *  ON and US
1c340 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20  ING clauses are 
1c350 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45  shifted into WHE
1c360 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  RE statements.**
1c370 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64       *  Wildcard
1c380 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45  s "*" and "TABLE
1c390 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65  .*" in result se
1c3a0 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e  ts are expanded.
1c3b0 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74  .**     *  Ident
1c3c0 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73  ifiers in expres
1c3d0 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64  sion are matched
1c3e0 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   to tables..**.*
1c3f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1c400 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20  cts recursively 
1c410 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65  on all subquerie
1c420 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c  s within the SEL
1c430 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
1c440 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a  ite3SelectPrep(.
1c450 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1c460 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c470 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
1c480 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1c490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c4a0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1c4b0 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
1c4c0 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
1c4d0 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e   *pOuterNC  /* N
1c4e0 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
1c4f0 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a  container */.){.
1c500 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1c510 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1c520 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  rn;.  db = pPars
1c530 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e  e->db;.  if( p->
1c540 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
1c550 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75  sTypeInfo ) retu
1c560 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
1c570 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
1c580 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1c590 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
1c5a0 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73  lectExpand(pPars
1c5b0 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61  e, p);.  if( pPa
1c5c0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1c5d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1c5e0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1c5f0 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61  3ResolveSelectNa
1c600 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  mes(pParse, p, p
1c610 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20  OuterNC);.  if( 
1c620 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
1c630 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c640 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
1c650 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
1c660 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29  eInfo(pParse, p)
1c670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  ;.}../*.** Reset
1c680 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
1c690 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a  ccumulator..**.*
1c6a0 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20  * The aggregate 
1c6b0 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61  accumulator is a
1c6c0 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63   set of memory c
1c6d0 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a  ells that hold.*
1c6e0 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
1c6f0 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c  esults while cal
1c700 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72  culating an aggr
1c710 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20  egate.  This.** 
1c720 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73  routine simply s
1c730 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61  tores NULLs in a
1c740 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f  ll of those memo
1c750 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ry cells..*/.sta
1c760 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63  tic void resetAc
1c770 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
1c780 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
1c790 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
1c7a0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1c7b0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
1c7c0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
1c7d0 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  o_func *pFunc;. 
1c7e0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e   if( pAggInfo->n
1c7f0 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e  Func+pAggInfo->n
1c800 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20  Column==0 ){.   
1c810 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66   return;.  }.  f
1c820 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
1c830 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
1c840 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1c850 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1c860 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
1c870 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b  ->aCol[i].iMem);
1c880 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63  .  }.  for(pFunc
1c890 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
1c8a0 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  , i=0; i<pAggInf
1c8b0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
1c8c0 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Func++){.    sql
1c8d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1c8e0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46  , OP_Null, 0, pF
1c8f0 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20  unc->iMem);.    
1c900 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  if( pFunc->iDist
1c910 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
1c920 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e   Expr *pE = pFun
1c930 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  c->pExpr;.      
1c940 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1c950 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
1c960 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
1c970 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c      if( pE->x.pL
1c980 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e  ist==0 || pE->x.
1c990 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
1c9a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1c9b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c9c0 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67  e, "DISTINCT agg
1c9d0 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76  regates must hav
1c9e0 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a  e exactly one ".
1c9f0 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75             "argu
1ca00 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20  ment");.        
1ca10 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
1ca20 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1ca30 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49  se{.        KeyI
1ca40 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
1ca50 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
1ca60 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
1ca70 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
1ca80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ca90 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
1caa0 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e  hemeral, pFunc->
1cab0 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c  iDistinct, 0, 0,
1cac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cad0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1cae0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
1caf0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
1cb00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cb10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
1cb20 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
1cb30 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
1cb40 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
1cb50 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
1cb60 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
1cb70 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
1cb80 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
1cb90 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
1cba0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
1cbb0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1cbc0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1cbd0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1cbe0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1cbf0 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
1cc00 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
1cc10 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
1cc20 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
1cc30 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
1cc40 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
1cc50 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
1cc60 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
1cc70 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1cc80 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
1cc90 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
1cca0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ccb0 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op4(v, OP_AggFin
1ccc0 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
1ccd0 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
1cce0 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20  pr : 0, 0,.     
1ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd00 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
1cd10 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
1cd20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64    }.}../*.** Upd
1cd30 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ate the accumula
1cd40 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tor memory cells
1cd50 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
1cd60 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  e based on.** th
1cd70 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
1cd80 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
1cd90 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65  atic void update
1cda0 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
1cdb0 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
1cdc0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
1cdd0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1cde0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1cdf0 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
1ce00 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
1ce10 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
1ce20 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49  ol *pC;..  pAggI
1ce30 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
1ce40 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = 1;.  for(i=0, 
1ce50 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
1ce60 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
1ce70 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
1ce80 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ){.    int nArg;
1ce90 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78  .    int addrNex
1cea0 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
1ceb0 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c  egAgg;.    ExprL
1cec0 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
1ced0 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
1cee0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
1cef0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
1cf00 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
1cf10 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
1cf20 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
1cf30 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
1cf40 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41  Expr;.      regA
1cf50 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  gg = sqlite3GetT
1cf60 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1cf70 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71   nArg);.      sq
1cf80 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
1cf90 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
1cfa0 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30 29 3b  ist, regAgg, 0);
1cfb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cfc0 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20    nArg = 0;.    
1cfd0 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20    regAgg = 0;.  
1cfe0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
1cff0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
1d000 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d        addrNext =
1d010 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1d020 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1d030 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
1d040 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73  );.      codeDis
1d050 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46  tinct(pParse, pF
1d060 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
1d070 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67  rNext, 1, regAgg
1d080 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1d090 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67   pF->pFunc->flag
1d0a0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
1d0b0 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
1d0c0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1d0d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75   = 0;.      stru
1d0e0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1d0f0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69   *pItem;.      i
1d100 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
1d110 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20  rt( pList!=0 ); 
1d120 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20   /* pList!=0 if 
1d130 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45  pF->pFunc has NE
1d140 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  EDCOLL */.      
1d150 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
1d160 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20  List->a; !pColl 
1d170 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20  && j<nArg; j++, 
1d180 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1d190 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1d1a0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1d1b0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
1d1c0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1d1d0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
1d1e0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1d1f0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
1d200 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
1d210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d220 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
1d230 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
1d240 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
1d250 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
1d260 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d270 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
1d280 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c  Step, 0, regAgg,
1d290 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20   pF->iMem,.     
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2b0 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
1d2c0 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
1d2d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1d2e0 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
1d2f0 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
1d300 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
1d310 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
1d320 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  , nArg);.    sql
1d330 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
1d340 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
1d350 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
1d360 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
1d370 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
1d380 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1d390 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
1d3a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
1d3b0 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49  or(i=0, pC=pAggI
1d3c0 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67  nfo->aCol; i<pAg
1d3d0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
1d3e0 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b  tor; i++, pC++){
1d3f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1d400 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d  Code(pParse, pC-
1d410 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d  >pExpr, pC->iMem
1d420 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66  );.  }.  pAggInf
1d430 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
1d440 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
1d450 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
1d460 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1d470 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  nt given in the 
1d480 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a  p argument.  .**
1d490 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
1d4a0 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20  are distributed 
1d4b0 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20  in various ways 
1d4c0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
1d4d0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
1d4e0 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73  the SelectDest s
1d4f0 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
1d500 20 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20   to by argument 
1d510 70 44 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c  pDest.** as foll
1d520 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  ows:.**.**     p
1d530 44 65 73 74 2d 3e 65 44 65 73 74 20 20 20 20 52  Dest->eDest    R
1d540 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d  esult.**     ---
1d550 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
1d560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d580 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
1d590 53 52 54 5f 4f 75 74 70 75 74 20 20 20 20 20 20  SRT_Output      
1d5a0 47 65 6e 65 72 61 74 65 20 61 20 72 6f 77 20 6f  Generate a row o
1d5b0 66 20 6f 75 74 70 75 74 20 28 75 73 69 6e 67 20  f output (using 
1d5c0 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  the OP_ResultRow
1d5d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d5e0 20 20 20 20 20 20 20 20 6f 70 63 6f 64 65 29 20          opcode) 
1d5f0 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20  for each row in 
1d600 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
1d610 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65  **.**     SRT_Me
1d620 6d 20 20 20 20 20 20 20 20 20 4f 6e 6c 79 20 76  m         Only v
1d630 61 6c 69 64 20 69 66 20 74 68 65 20 72 65 73 75  alid if the resu
1d640 6c 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 63  lt is a single c
1d650 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20 20  olumn..**       
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74                St
1d670 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 6f  ore the first co
1d680 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73  lumn of the firs
1d690 74 20 72 65 73 75 6c 74 20 72 6f 77 0a 2a 2a 20  t result row.** 
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6b0 20 20 20 20 69 6e 20 72 65 67 69 73 74 65 72 20      in register 
1d6c0 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 74 68 65  pDest->iParm the
1d6d0 6e 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 65  n abandon the re
1d6e0 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  st.**           
1d6f0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
1d700 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 64 65   query.  This de
1d710 73 74 69 6e 61 74 69 6f 6e 20 69 6d 70 6c 69 65  stination implie
1d720 73 20 22 4c 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a  s "LIMIT 1"..**.
1d730 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20  **     SRT_Set  
1d740 20 20 20 20 20 20 20 54 68 65 20 72 65 73 75 6c         The resul
1d750 74 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67  t must be a sing
1d760 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72  le column.  Stor
1d770 65 20 65 61 63 68 0a 2a 2a 20 20 20 20 20 20 20  e each.**       
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f                ro
1d790 77 20 6f 66 20 72 65 73 75 6c 74 20 61 73 20 74  w of result as t
1d7a0 68 65 20 6b 65 79 20 69 6e 20 74 61 62 6c 65 20  he key in table 
1d7b0 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a  pDest->iParm. .*
1d7c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1d7d0 20 20 20 20 20 20 41 70 70 6c 79 20 74 68 65 20        Apply the 
1d7e0 61 66 66 69 6e 69 74 79 20 70 44 65 73 74 2d 3e  affinity pDest->
1d7f0 61 66 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20  affinity before 
1d800 73 74 6f 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20  storing.**      
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1d820 65 73 75 6c 74 73 2e 20 20 55 73 65 64 20 74 6f  esults.  Used to
1d830 20 69 6d 70 6c 65 6d 65 6e 74 20 22 49 4e 20 28   implement "IN (
1d840 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a  SELECT ...)"..**
1d850 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f  .**     SRT_Unio
1d860 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  n       Store re
1d870 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69  sults as a key i
1d880 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
1d890 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
1d8a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1d8b0 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f  Except      Remo
1d8c0 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ve results from 
1d8d0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
1d8e0 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
1d8f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1d900 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
1d910 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
1d920 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
1d930 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 20 20 20  st->iParm..**   
1d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d950 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53    This is like S
1d960 52 54 5f 45 70 68 65 6d 54 61 62 20 65 78 63 65  RT_EphemTab exce
1d970 70 74 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  pt that the tabl
1d980 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1d990 20 20 20 20 20 20 20 20 20 69 73 20 61 73 73 75           is assu
1d9a0 6d 65 64 20 74 6f 20 61 6c 72 65 61 64 79 20 62  med to already b
1d9b0 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  e open..**.**   
1d9c0 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20    SRT_EphemTab  
1d9d0 20 20 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70    Create an temp
1d9e0 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73  orary table pDes
1d9f0 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20 73 74 6f  t->iParm and sto
1da00 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  re.**           
1da10 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65            the re
1da20 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68 65 20  sult there. The 
1da30 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 6f  cursor is left o
1da40 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20 20  pen after.**    
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da60 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 54 68 69   returning.  Thi
1da70 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 54 61  s is like SRT_Ta
1da80 62 6c 65 20 65 78 63 65 70 74 20 74 68 61 74 0a  ble except that.
1da90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1daa0 20 20 20 20 20 20 20 74 68 69 73 20 64 65 73 74         this dest
1dab0 69 6e 61 74 69 6f 6e 20 75 73 65 73 20 4f 50 5f  ination uses OP_
1dac0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 6f  OpenEphemeral to
1dad0 20 63 72 65 61 74 65 0a 2a 2a 20 20 20 20 20 20   create.**      
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1daf0 68 65 20 74 61 62 6c 65 20 66 69 72 73 74 2e 0a  he table first..
1db00 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f  **.**     SRT_Co
1db10 72 6f 75 74 69 6e 65 20 20 20 47 65 6e 65 72 61  routine   Genera
1db20 74 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  te a co-routine 
1db30 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 6e  that returns a n
1db40 65 77 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  ew row of.**    
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db60 20 72 65 73 75 6c 74 73 20 65 61 63 68 20 74 69   results each ti
1db70 6d 65 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64  me it is invoked
1db80 2e 20 20 54 68 65 20 65 6e 74 72 79 20 70 6f 69  .  The entry poi
1db90 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nt.**           
1dba0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
1dbb0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73 20 73   co-routine is s
1dbc0 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
1dbd0 72 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  r pDest->iParm..
1dbe0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
1dbf0 69 73 74 73 20 20 20 20 20 20 53 74 6f 72 65 20  ists      Store 
1dc00 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  a 1 in memory ce
1dc10 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  ll pDest->iParm 
1dc20 69 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  if the result.**
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc40 20 20 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20       set is not 
1dc50 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  empty..**.**    
1dc60 20 53 52 54 5f 44 69 73 63 61 72 64 20 20 20 20   SRT_Discard    
1dc70 20 54 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c   Throw the resul
1dc80 74 73 20 61 77 61 79 2e 20 20 54 68 69 73 20 69  ts away.  This i
1dc90 73 20 75 73 65 64 20 62 79 20 53 45 4c 45 43 54  s used by SELECT
1dca0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1dcb0 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
1dcc0 74 73 20 77 69 74 68 69 6e 20 74 72 69 67 67 65  ts within trigge
1dcd0 72 73 20 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75  rs whose only pu
1dce0 72 70 6f 73 65 20 69 73 0a 2a 2a 20 20 20 20 20  rpose is.**     
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd00 74 68 65 20 73 69 64 65 2d 65 66 66 65 63 74 73  the side-effects
1dd10 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a   of functions..*
1dd20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1dd30 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
1dd40 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
1dd50 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
1dd60 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
1dd70 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
1dd80 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
1dd90 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
1dda0 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
1ddb0 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
1ddc0 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
1ddd0 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
1dde0 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
1ddf0 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
1de00 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
1de10 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
1de20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
1de30 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
1de40 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
1de50 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
1de60 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
1de70 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1de80 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
1de90 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
1dea0 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
1deb0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
1dec0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
1ded0 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
1dee0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
1def0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
1df00 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1df10 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
1df20 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
1df30 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
1df40 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
1df50 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
1df60 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1df70 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
1df80 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
1df90 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1dfa0 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
1dfb0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1dfc0 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
1dfd0 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
1dfe0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1dff0 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  pEList;      /* 
1e000 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
1e010 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
1e020 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1e030 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
1e040 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
1e050 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
1e060 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
1e070 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1e080 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
1e090 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
1e0a0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
1e0b0 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
1e0c0 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
1e0d0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
1e0e0 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
1e0f0 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
1e100 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
1e110 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
1e120 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20  pr *pHaving;    
1e130 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49       /* The HAVI
1e140 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  NG clause.  May 
1e150 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
1e160 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20   isDistinct;    
1e170 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1e180 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
1e190 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
1e1a0 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74  /.  int distinct
1e1b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ;          /* Ta
1e1c0 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74  ble to use for t
1e1d0 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20  he distinct set 
1e1e0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1e200 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
1e210 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
1e220 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  n */.  int addrS
1e230 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a  ortIndex;     /*
1e240 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f   Address of an O
1e250 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
1e260 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
1e270 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66   AggInfo sAggInf
1e280 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  o;      /* Infor
1e290 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61  mation used by a
1e2a0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
1e2b0 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20   */.  int iEnd; 
1e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e2d0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65  Address of the e
1e2e0 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  nd of the query 
1e2f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1e300 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
1e310 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1e320 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20  ection */..  db 
1e330 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1e340 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  if( p==0 || db->
1e350 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
1e360 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
1e370 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e380 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
1e390 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1e3a0 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
1e3b0 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
1e3c0 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
1e3d0 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
1e3e0 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a  of(sAggInfo));..
1e3f0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
1e400 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
1e410 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
1e420 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70  (pDest) ){.    p
1e430 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
1e440 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 73 65  .    /* In these
1e450 20 63 61 73 65 73 20 74 68 65 20 44 49 53 54 49   cases the DISTI
1e460 4e 43 54 20 6f 70 65 72 61 74 6f 72 20 6d 61 6b  NCT operator mak
1e470 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
1e480 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   to the.    ** r
1e490 65 73 75 6c 74 73 2c 20 73 6f 20 72 65 6d 6f 76  esults, so remov
1e4a0 65 20 69 74 20 69 66 20 69 74 20 77 65 72 65 20  e it if it were 
1e4b0 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
1e4c0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65  /.    assert(pDe
1e4d0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
1e4e0 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e  xists || pDest->
1e4f0 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e  eDest==SRT_Union
1e500 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
1e510 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1e520 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73  T_Except || pDes
1e530 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
1e540 73 63 61 72 64 29 3b 0a 20 20 20 20 70 2d 3e 73  scard);.    p->s
1e550 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
1e560 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73  istinct;.  }.  s
1e570 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
1e580 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a  (pParse, p, 0);.
1e590 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
1e5a0 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
1e5b0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
1e5c0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1e5d0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1e5e0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
1e5f0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
1e600 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
1e610 4f 72 64 65 72 42 79 3b 0a 20 20 69 73 41 67 67  OrderBy;.  isAgg
1e620 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
1e630 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
1e640 3d 30 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  =0;.  if( pEList
1e650 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
1e660 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20  t_end;..  /* .  
1e670 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61  ** Do not even a
1e680 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61  ttempt to genera
1e690 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77  te any code if w
1e6a0 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73  e have already s
1e6b0 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20  een.  ** errors 
1e6c0 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
1e6d0 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f  ine starts..  */
1e6e0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1e6f0 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c  Err>0 ) goto sel
1e700 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 4f  ect_end;..  /* O
1e710 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72  RDER BY is ignor
1e720 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74  ed for some dest
1e730 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  inations..  */. 
1e740 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
1e750 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
1e760 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
1e770 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
1e780 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
1e790 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
1e7a0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1e7b0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
1e7c0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
1e7d0 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  nd;..  /* Genera
1e7e0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
1e7f0 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
1e800 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
1e810 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
1e820 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1e830 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1e840 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1e850 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20  IEW).  for(i=0; 
1e860 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c  !p->pPrior && i<
1e870 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
1e880 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
1e890 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1e8a0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
1e8b0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
1e8c0 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
1e8d0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
1e8e0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pItem->pSelect;.
1e8f0 20 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62      int isAggSub
1e900 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  ;..    if( pSub=
1e910 3d 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50  =0 || pItem->isP
1e920 6f 70 75 6c 61 74 65 64 20 29 20 63 6f 6e 74 69  opulated ) conti
1e930 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63  nue;..    /* Inc
1e940 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65  rement Parse.nHe
1e950 69 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67  ight by the heig
1e960 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ht of the larges
1e970 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  t expression.   
1e980 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72 65 64   ** tree refered
1e990 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65   to by this, the
1e9a0 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20   parent select. 
1e9b0 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74  The child select
1e9c0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74  .    ** may cont
1e9d0 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ain expression t
1e9e0 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a  rees of at most.
1e9f0 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d      ** (SQLITE_M
1ea00 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61  AX_EXPR_DEPTH-Pa
1ea10 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69  rse.nHeight) hei
1ea20 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62  ght. This is a b
1ea30 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63  it.    ** more c
1ea40 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e  onservative than
1ea50 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20   necessary, but 
1ea60 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e  much easier than
1ea70 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a   enforcing.    *
1ea80 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74  * an exact limit
1ea90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
1eaa0 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20  rse->nHeight += 
1eab0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
1eac0 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20  rHeight(p);..   
1ead0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1eae0 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
1eaf0 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64   can be absorbed
1eb00 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
1eb10 2e 20 2a 2f 0a 20 20 20 20 69 73 41 67 67 53 75  . */.    isAggSu
1eb20 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c  b = (pSub->selFl
1eb30 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
1eb40 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20  te)!=0;.    if( 
1eb50 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
1eb60 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73  pParse, p, i, is
1eb70 41 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29  Agg, isAggSub) )
1eb80 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67  {.      if( isAg
1eb90 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  gSub ){.        
1eba0 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  isAgg = 1;.     
1ebb0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
1ebc0 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a  = SF_Aggregate;.
1ebd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20        }.      i 
1ebe0 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
1ebf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
1ec00 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
1ec10 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  st, SRT_EphemTab
1ec20 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
1ec30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ec40 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61   pItem->isPopula
1ec50 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ted==0 );.      
1ec60 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
1ec70 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73  arse, pSub, &des
1ec80 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  t);.      pItem-
1ec90 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31  >isPopulated = 1
1eca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ecb0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
1ecc0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1ecd0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
1ece0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
1ecf0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
1ed00 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53  ight -= sqlite3S
1ed10 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
1ed20 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  p);.    pTabList
1ed30 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
1ed40 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
1ed50 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
1ed60 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
1ed70 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
1ed80 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
1ed90 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65   = p->pEList;.#e
1eda0 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20  ndif.  pWhere = 
1edb0 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
1edc0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
1edd0 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
1ede0 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69   p->pHaving;.  i
1edf0 73 44 69 73 74 69 6e 63 74 20 3d 20 28 70 2d 3e  sDistinct = (p->
1ee00 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1ee10 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66  stinct)!=0;..#if
1ee20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ee30 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
1ee40 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
1ee50 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65  s are a sequence
1ee60 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20   of queries, do 
1ee70 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73  the earlier ones
1ee80 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69   first..  */.  i
1ee90 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
1eea0 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68      if( p->pRigh
1eeb0 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  tmost==0 ){.    
1eec0 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c    Select *pLoop,
1eed0 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20   *pRight = 0;.  
1eee0 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
1eef0 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c  .      int mxSel
1ef00 65 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ect;.      for(p
1ef10 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
1ef20 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
1ef30 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20  or, cnt++){.    
1ef40 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68      pLoop->pRigh
1ef50 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  tmost = p;.     
1ef60 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20     pLoop->pNext 
1ef70 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
1ef80 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70    pRight = pLoop
1ef90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1efa0 6d 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61  mxSelect = db->a
1efb0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
1efc0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
1efd0 43 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d  CT];.      if( m
1efe0 78 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d  xSelect && cnt>m
1eff0 78 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  xSelect ){.     
1f000 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1f010 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
1f020 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f  many terms in co
1f030 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b  mpound SELECT");
1f040 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f050 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1f060 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
1f070 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
1f080 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 23  p, pDest);.  }.#
1f090 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
1f0a0 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
1f0b0 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
1f0c0 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
1f0d0 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
1f0e0 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
1f0f0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1f100 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1f110 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75    if( checkForMu
1f120 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
1f130 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65  rror(pParse, pDe
1f140 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  st, pEList->nExp
1f150 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  r) ){.    goto s
1f160 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
1f170 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70  endif..  /* If p
1f180 6f 73 73 69 62 6c 65 2c 20 72 65 77 72 69 74 65  ossible, rewrite
1f190 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 75 73   the query to us
1f1a0 65 20 47 52 4f 55 50 20 42 59 20 69 6e 73 74 65  e GROUP BY inste
1f1b0 61 64 20 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a  ad of DISTINCT..
1f1c0 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d 69    ** GROUP BY mi
1f1d0 67 68 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  ght use an index
1f1e0 2c 20 44 49 53 54 49 4e 43 54 20 6e 65 76 65 72  , DISTINCT never
1f1f0 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   does..  */.  if
1f200 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1f210 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
1f220 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
1f230 5f 44 69 73 74 69 6e 63 74 20 26 26 20 21 70 2d  _Distinct && !p-
1f240 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
1f250 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
1f260 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
1f270 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
1f280 20 30 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42   0);.    pGroupB
1f290 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
1f2a0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
1f2b0 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
1f2c0 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74  ;.    isDistinct
1f2d0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1f2e0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
1f2f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
1f300 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e  then this sortin
1f310 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67  g.  ** index mig
1f320 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
1f330 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61  unused if the da
1f340 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20  ta can be .  ** 
1f350 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65  extracted in pre
1f360 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20  -sorted order.  
1f370 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
1f380 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ase, then the.  
1f390 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  ** OP_OpenEpheme
1f3a0 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
1f3b0 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1f3c0 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
1f3d0 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72  ce.  ** we figur
1f3e0 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73  e out that the s
1f3f0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20  orting index is 
1f400 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
1f410 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20   addrSortIndex. 
1f420 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
1f430 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
1f440 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  te that change..
1f450 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
1f460 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
1f470 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
1f480 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
1f490 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
1f4a0 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
1f4b0 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79  y);.    pOrderBy
1f4c0 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  ->iECursor = pPa
1f4d0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
1f4e0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
1f4f0 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e  [2] = addrSortIn
1f500 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  dex =.      sqli
1f510 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1f520 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1f530 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
1f540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
1f550 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
1f560 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
1f570 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  r+2, 0,.        
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
1f5a0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
1f5b0 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65  ANDOFF);.  }else
1f5c0 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e  {.    addrSortIn
1f5d0 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  dex = -1;.  }.. 
1f5e0 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
1f5f0 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
1f600 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
1f610 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
1f620 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
1f630 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1f640 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
1f650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f660 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
1f670 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d  phemeral, pDest-
1f680 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e  >iParm, pEList->
1f690 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nExpr);.  }..  /
1f6a0 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
1f6b0 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d  r..  */.  iEnd =
1f6c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1f6d0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70  Label(v);.  comp
1f6e0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
1f6f0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e  s(pParse, p, iEn
1f700 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61  d);..  /* Open a
1f710 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
1f720 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
1f730 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
1f740 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63  .  if( isDistinc
1f750 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  t ){.    KeyInfo
1f760 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
1f770 61 73 73 65 72 74 28 20 69 73 41 67 67 20 7c 7c  assert( isAgg ||
1f780 20 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20   pGroupBy );.   
1f790 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72   distinct = pPar
1f7a0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1f7b0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
1f7c0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
1f7d0 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
1f7e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1f7f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
1f800 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 69  penEphemeral, di
1f810 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f830 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
1f840 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
1f850 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65  O_HANDOFF);.  }e
1f860 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  lse{.    distinc
1f870 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  t = -1;.  }..  /
1f880 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e 64 20  * Aggregate and 
1f890 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
1f8a0 65 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65  eries are handle
1f8b0 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f  d differently */
1f8c0 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26  .  if( !isAgg &&
1f8d0 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
1f8e0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
1f8f0 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72   is for non-aggr
1f900 65 67 61 74 65 20 71 75 65 72 69 65 73 0a 20 20  egate queries.  
1f910 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65 20 64    ** Begin the d
1f920 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 20  atabase scan.   
1f930 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d   */.    pWInfo =
1f940 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1f950 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
1f960 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f  ist, pWhere, &pO
1f970 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20  rderBy, 0, 0);. 
1f980 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
1f990 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
1f9a0 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73  nd;..    /* If s
1f9b0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
1f9c0 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  t was created by
1f9d0 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
1f9e0 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a  Ephemeral .    *
1f9f0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
1fa00 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
1fa10 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
1fa20 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
1fa30 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a  Ephemeral.    **
1fa40 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
1fa50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1fa60 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d   addrSortIndex>=
1fa70 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 && pOrderBy==0
1fa80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1fa90 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
1faa0 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64  p(v, addrSortInd
1fab0 65 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d  ex, 1);.      p-
1fac0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
1fad0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20   = -1;.    }..  
1fae0 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
1faf0 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
1fb00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1fb10 72 74 28 21 69 73 44 69 73 74 69 6e 63 74 29 3b  rt(!isDistinct);
1fb20 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  .    selectInner
1fb30 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
1fb40 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
1fb50 72 64 65 72 42 79 2c 20 2d 31 2c 20 70 44 65 73  rderBy, -1, pDes
1fb60 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1fb70 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69         pWInfo->i
1fb80 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f  Continue, pWInfo
1fb90 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 20 20  ->iBreak);..    
1fba0 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
1fbb0 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
1fbc0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
1fbd0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
1fbe0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1fbf0 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 70  /* This is the p
1fc00 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
1fc10 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
1fc20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
1fc30 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
1fc40 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
1fc50 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
1fc60 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
1fc70 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
1fc80 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
1fc90 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
1fca0 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
1fcb0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
1fcc0 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
1fcd0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1fce0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
1fcf0 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
1fd00 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
1fd10 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
1fd20 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
1fd30 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
1fd40 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
1fd50 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
1fd60 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
1fd70 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
1fd80 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
1fd90 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdb0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1fdc0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
1fdd0 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
1fde0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
1fdf0 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
1fe00 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
1fe10 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
1fe20 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
1fe30 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
1fe40 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
1fe50 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69  Y order */.    i
1fe60 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
1fe70 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f     /* End of pro
1fe80 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73  cessing for this
1fe90 20 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20   SELECT */..    
1fea0 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e  /* Remove any an
1feb0 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65  d all aliases be
1fec0 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74  tween the result
1fed0 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20   set and the.   
1fee0 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61   ** GROUP BY cla
1fef0 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
1ff00 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
1ff10 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20        int k;    
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff30 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1ff40 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  ter */.      str
1ff50 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1ff60 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f  m *pItem;  /* Fo
1ff70 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
1ff80 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c  xpression in a l
1ff90 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  ist */..      fo
1ffa0 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r(k=p->pEList->n
1ffb0 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70  Expr, pItem=p->p
1ffc0 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  EList->a; k>0; k
1ffd0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
1ffe0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c        pItem->iAl
1fff0 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
20000 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72  .      for(k=pGr
20010 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49  oupBy->nExpr, pI
20020 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
20030 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
20040 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
20050 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  em->iAlias = 0;.
20060 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
20070 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
20080 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   label to jump t
20090 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  o when we want t
200a0 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72  o abort the quer
200b0 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64  y */.    addrEnd
200c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
200d0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
200e0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43   /* Convert TK_C
200f0 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f  OLUMN nodes into
20100 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61   TK_AGG_COLUMN a
20110 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20  nd make entries 
20120 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e  in.    ** sAggIn
20130 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47  fo for all TK_AG
20140 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73  G_FUNCTION nodes
20150 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20   in expressions 
20160 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45  of the.    ** SE
20170 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
20180 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
20190 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
201a0 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
201b0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
201c0 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69  ;.    sNC.pSrcLi
201d0 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
201e0 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20     sNC.pAggInfo 
201f0 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20  = &sAggInfo;.   
20200 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
20210 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
20220 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
20230 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20  nExpr+1 : 0;.   
20240 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70   sAggInfo.pGroup
20250 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
20260 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
20270 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
20280 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  C, pEList);.    
20290 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
202a0 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
202b0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69  pOrderBy);.    i
202c0 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
202d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
202e0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
202f0 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b  (&sNC, pHaving);
20300 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
20310 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
20320 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
20330 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  umn;.    for(i=0
20340 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75  ; i<sAggInfo.nFu
20350 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nc; i++){.      
20360 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
20370 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66  Property(sAggInf
20380 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
20390 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
203a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
203b0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
203c0 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
203d0 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
203e0 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
203f0 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
20400 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
20410 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
20420 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67     /* Processing
20430 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20   for aggregates 
20440 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73  with GROUP BY is
20450 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20   very different 
20460 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20  and.    ** much 
20470 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61  more complex tha
20480 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  n aggregates wit
20490 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e  hout a GROUP BY.
204a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
204b0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
204c0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
204d0 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20  nfo;  /* Keying 
204e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
204f0 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61  the group by cla
20500 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  use */.      int
20510 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   j1;            
20520 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61   /* A-vs-B compa
20530 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20  rision jump */. 
20540 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74       int addrOut
20550 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72  putRow;  /* Star
20560 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20  t of subroutine 
20570 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72  that outputs a r
20580 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20  esult row */.   
20590 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74     int regOutput
205a0 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e  Row;   /* Return
205b0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
205c0 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62  r for output sub
205d0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20  routine */.     
205e0 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72   int addrSetAbor
205f0 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  t;   /* Set the 
20600 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72  abort flag and r
20610 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69  eturn */.      i
20620 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70  nt addrTopOfLoop
20630 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65  ;  /* Top of the
20640 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20   input loop */. 
20650 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72       int addrSor
20660 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20  tingIdx; /* The 
20670 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
20680 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67   for the sorting
20690 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
206a0 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20  int addrReset;  
206b0 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e      /* Subroutin
206c0 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20  e for resetting 
206d0 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
206e0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
206f0 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  Reset;       /* 
20700 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
20710 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65  egister for rese
20720 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  t subroutine */.
20730 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
20740 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59  re is a GROUP BY
20750 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74   clause we might
20760 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20   need a sorting 
20770 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a  index to.      *
20780 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20  * implement it. 
20790 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73   Allocate that s
207a0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77  orting index now
207b0 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f  .  If it turns o
207c0 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ut.      ** that
207d0 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
207e0 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68  it after all, th
207f0 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  e OpenEphemeral 
20800 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20  instruction.    
20810 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e    ** will be con
20820 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f  verted into a No
20830 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20  op.  .      */. 
20840 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
20850 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73  rtingIdx = pPars
20860 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
20870 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
20880 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
20890 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
208a0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72  );.      addrSor
208b0 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65  tingIdx = sqlite
208c0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
208d0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
208e0 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67   .          sAgg
208f0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
20900 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
20910 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20  ngColumn, .     
20920 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70       0, (char*)p
20930 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
20940 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20  NFO_HANDOFF);.. 
20950 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69       /* Initiali
20960 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ze memory locati
20970 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55  ons used by GROU
20980 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70  P BY aggregate p
20990 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20  rocessing.      
209a0 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61  */.      iUseFla
209b0 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
209c0 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74  em;.      iAbort
209d0 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
209e0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
209f0 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50  OutputRow = ++pP
20a00 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
20a10 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
20a20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
20a30 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
20a40 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50   regReset = ++pP
20a50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
20a60 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71    addrReset = sq
20a70 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
20a80 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d  el(v);.      iAM
20a90 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
20aa0 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
20ab0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
20ac0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
20ad0 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72      iBMem = pPar
20ae0 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
20af0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
20b00 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
20b10 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
20b20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20b30 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
20b40 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
20b50 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
20b60 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66  , "clear abort f
20b70 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
20b80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20b90 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
20ba0 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
20bb0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
20bc0 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63  v, "indicate acc
20bd0 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29  umulator empty")
20be0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67  );..      /* Beg
20bf0 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  in a loop that w
20c00 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20  ill extract all 
20c10 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47  source rows in G
20c20 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20  ROUP BY order.. 
20c30 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
20c40 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73  ht involve two s
20c50 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69  eparate loops wi
20c60 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e  th an OP_Sort in
20c70 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20   between, or.   
20c80 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
20c90 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20  e a single loop 
20ca0 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64  that uses an ind
20cb0 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e  ex to extract in
20cc0 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20  formation.      
20cd0 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  ** in the right 
20ce0 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77  order to begin w
20cf0 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ith..      */.  
20d00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20d10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
20d20 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
20d30 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70  rReset);.      p
20d40 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
20d50 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
20d60 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
20d70 72 65 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30  re, &pGroupBy, 0
20d80 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
20d90 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
20da0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
20db0 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d     if( pGroupBy=
20dc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
20dd0 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   The optimizer i
20de0 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65  s able to delive
20df0 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20  r rows in group 
20e00 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20  by order so.    
20e10 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74      ** we do not
20e20 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20   have to sort.  
20e30 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
20e40 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20  eral table will 
20e50 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  be.        ** ca
20e60 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65  ncelled later be
20e70 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e  cause we still n
20e80 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70  eed to use the p
20e90 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20  KeyInfo.        
20ea0 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f 75  */.        pGrou
20eb0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
20ec0 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  y;.        group
20ed0 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20  BySort = 0;.    
20ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20ef0 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d   /* Rows are com
20f00 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74  ing out in undet
20f10 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20  ermined order.  
20f20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a  We have to push.
20f30 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20          ** each 
20f40 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  row into a sorti
20f50 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e  ng index, termin
20f60 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f  ate the first lo
20f70 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  op,.        ** t
20f80 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68  hen loop over th
20f90 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
20fa0 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
20fb0 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20  the output.     
20fc0 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20     ** in sorted 
20fd0 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f  order.        */
20fe0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
20ff0 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Base;.        in
21000 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20  t regRecord;.   
21010 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
21020 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75         int nGrou
21030 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 67 72  pBy;..        gr
21040 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20  oupBySort = 1;. 
21050 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20         nGroupBy 
21060 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
21070 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  r;.        nCol 
21080 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a  = nGroupBy + 1;.
21090 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
210a0 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20  upBy+1;.        
210b0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
210c0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
210d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
210e0 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69   sAggInfo.aCol[i
210f0 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ].iSorterColumn>
21100 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
21110 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20    nCol++;.      
21120 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
21130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
21140 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65  .        regBase
21150 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
21160 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
21170 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
21180 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
21190 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
211a0 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c  roupBy, regBase,
211b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
211c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
211d0 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73  , OP_Sequence, s
211e0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
211f0 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f 75  dx,regBase+nGrou
21200 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a 20  pBy);.        j 
21210 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20  = nGroupBy+1;.  
21220 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
21230 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
21240 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
21250 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
21260 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73  o_col *pCol = &s
21270 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b  AggInfo.aCol[i];
21280 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
21290 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
212a0 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
212b0 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20       int r1 = j 
212c0 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  + regBase;.     
212d0 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a         int r2;..
212e0 20 20 20 20 20 20 20 20 20 20 20 20 72 32 20 3d              r2 =
212f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21300 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
21310 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21330 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43    pCol->pTab, pC
21340 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f  ol->iColumn, pCo
21350 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20 30  l->iTable, r1, 0
21360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
21370 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20 20  f( r1!=r2 ){.   
21380 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21390 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
213a0 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72 31  OP_SCopy, r2, r1
213b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
213c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
213d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
213e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
213f0 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
21400 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
21410 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
21420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
21430 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
21440 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  d, regBase, nCol
21450 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
21460 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21470 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
21480 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66  xInsert, sAggInf
21490 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65  o.sortingIdx, re
214a0 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
214b0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
214c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
214d0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
214e0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
214f0 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
21500 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
21510 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
21520 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
21530 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  fo);.        sql
21540 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21550 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67 49  , OP_Sort, sAggI
21560 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
21570 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
21580 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
21590 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74  , "GROUP BY sort
215a0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  "));.        sAg
215b0 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67  gInfo.useSorting
215c0 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Idx = 1;.      }
215d0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75  ..      /* Evalu
215e0 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
215f0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
21600 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20  nd store in b0, 
21610 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20  b1, b2....      
21620 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79  ** (b0 is memory
21630 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b   location iBMem+
21640 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31  0, b1 is iBMem+1
21650 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a  , and so forth).
21660 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f        ** Then co
21670 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e  mpare the curren
21680 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
21690 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f   against the GRO
216a0 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20  UP BY terms.    
216b0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72    ** from the pr
216c0 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65  evious row curre
216d0 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61  ntly stored in a
216e0 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20  0, a1, a2....   
216f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
21700 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69  TopOfLoop = sqli
21710 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
21720 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72  dr(v);.      for
21730 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
21740 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
21750 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70         if( group
21760 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
21770 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21780 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
21790 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  mn, sAggInfo.sor
217a0 74 69 6e 67 49 64 78 2c 20 6a 2c 20 69 42 4d 65  tingIdx, j, iBMe
217b0 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  m+j);.        }e
217c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
217d0 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f  AggInfo.directMo
217e0 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
217f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
21800 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  e(pParse, pGroup
21810 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20  By->a[j].pExpr, 
21820 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
21830 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
21840 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21850 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
21860 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c  e, iAMem, iBMem,
21870 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
21880 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21890 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
218a0 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
218b0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
218c0 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
218d0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
218e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
218f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
21900 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b  mp, j1+1, 0, j1+
21910 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  1);..      /* Ge
21920 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
21930 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74   runs whenever t
21940 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e  he GROUP BY chan
21950 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ges..      ** Ch
21960 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f  anges in the GRO
21970 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74  UP BY are detect
21980 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
21990 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a  us code.      **
219a0 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72   block.  If ther
219b0 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65  e were no change
219c0 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  s, this block is
219d0 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20   skipped..      
219e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
219f0 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72   code copies cur
21a00 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65  rent group by te
21a10 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c  rms in b0,b1,b2,
21a20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ....      ** ove
21a30 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20  r to a0,a1,a2.  
21a40 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
21a50 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
21a60 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ine.      ** and
21a70 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72   resets the aggr
21a80 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
21a90 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70  r registers in p
21aa0 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20  reparation.     
21ab0 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74   ** for the next
21ac0 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e   GROUP BY batch.
21ad0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21ae0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
21af0 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65  ove(pParse, iBMe
21b00 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iAMem, pGroup
21b10 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  By->nExpr);.    
21b20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21b30 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
21b40 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
21b50 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
21b60 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
21b70 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65  ((v, "output one
21b80 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73   row"));.      s
21b90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21ba0 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41  (v, OP_IfPos, iA
21bb0 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
21bc0 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  d);.      VdbeCo
21bd0 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b  mment((v, "check
21be0 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
21bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21c00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
21c10 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61  sub, regReset, a
21c20 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
21c30 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
21c40 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61   "reset accumula
21c50 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
21c60 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67  * Update the agg
21c70 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
21c80 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ors based on the
21c90 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20   content of.    
21ca0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
21cb0 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20   row.      */.  
21cc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
21cd0 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
21ce0 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
21cf0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
21d00 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
21d10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21d20 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
21d30 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 1, iUseFlag);
21d40 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
21d50 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
21d60 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c   data in accumul
21d70 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
21d80 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f  /* End of the lo
21d90 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  op.      */.    
21da0 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
21db0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
21dc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21dd0 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49  , OP_Next, sAggI
21de0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
21df0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a  addrTopOfLoop);.
21e00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21e10 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
21e20 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
21e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21e40 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
21e50 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c   addrSortingIdx,
21e60 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   1);.      }..  
21e70 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68      /* Output th
21e80 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72  e final row of r
21e90 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20  esult.      */. 
21ea0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21eb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
21ec0 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
21ed0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
21ee0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
21ef0 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
21f00 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20  final row"));.. 
21f10 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65       /* Jump ove
21f20 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  r the subroutine
21f30 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
21f40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21f50 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
21f60 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20  , addrEnd);..   
21f70 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
21f80 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
21f90 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c   outputs a singl
21fa0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
21fb0 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
21fc0 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69  .  This subrouti
21fd0 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61  ne first looks a
21fe0 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20  t the iUseFlag. 
21ff0 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20   If iUseFlag.   
22000 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68     ** is less th
22010 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
22020 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ero, the subrout
22030 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
22040 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   If.      ** the
22050 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c   processing call
22060 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20  s for the query 
22070 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73  to abort, this s
22080 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
22090 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68  ** increments th
220a0 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d  e iAbortFlag mem
220b0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66  ory location bef
220c0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ore returning in
220d0 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  .      ** order 
220e0 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61  to signal the ca
220f0 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20  ller to abort.. 
22100 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
22110 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c  drSetAbort = sql
22120 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
22130 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
22140 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22150 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
22160 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
22170 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
22180 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20  ((v, "set abort 
22190 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
221a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
221b0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
221c0 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
221d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
221e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
221f0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
22200 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
22210 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
22220 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
22230 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22240 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
22250 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61  Pos, iUseFlag, a
22260 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b  ddrOutputRow+2);
22270 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
22280 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20  nt((v, "Groupby 
22290 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
222a0 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b   entry point"));
222b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
222c0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
222d0 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
222e0 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61  Row);.      fina
222f0 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
22300 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
22310 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  fo);.      if( p
22320 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
22330 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
22340 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
22350 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74  ving, addrOutput
22360 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55  Row+1, SQLITE_JU
22370 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
22380 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49   }.      selectI
22390 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
223a0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30   p, p->pEList, 0
223b0 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20  , 0, pOrderBy,. 
223c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223d0 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20 70       distinct, p
223e0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
223f0 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
22400 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64  OutputRow+1, add
22410 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20  rSetAbort);.    
22420 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22430 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
22440 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
22450 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
22460 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75  nt((v, "end grou
22470 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
22480 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
22490 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
224a0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
224b0 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f  ll reset the gro
224c0 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f  up-by accumulato
224d0 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
224e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
224f0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
22500 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65  Reset);.      re
22510 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
22520 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
22530 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22540 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
22550 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65  _Return, regRese
22560 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20  t);.     .    } 
22570 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42  /* endif pGroupB
22580 79 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a  y */.    else {.
22590 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
225a0 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20  pMinMax = 0;.   
225b0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65     ExprList *pDe
225c0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 38 20  l = 0;.      u8 
225d0 66 6c 61 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  flag;..      /* 
225e0 43 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65  Check if the que
225f0 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20  ry is of one of 
22600 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
22610 72 6d 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  rms:.      **.  
22620 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
22630 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  min(x) FROM ....
22640 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
22650 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e  T max(x) FROM ..
22660 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
22670 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68   ** If it is, th
22680 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20  en ask the code 
22690 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74  in where.c to at
226a0 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65  tempt to sort re
226b0 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 61  sults.      ** a
226c0 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
226d0 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f  n "ORDER ON x" o
226e0 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45  r "ORDER ON x DE
226f0 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20  SC" clause. .   
22700 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63     ** If where.c
22710 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64   is able to prod
22720 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74  uce results sort
22730 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72  ed in this order
22740 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
22750 61 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f  add vdbe code to
22760 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
22770 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f  e processing loo
22780 70 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20  p after the .   
22790 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72     ** first iter
227a0 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65  ation (since the
227b0 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
227c0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20   of the loop is 
227d0 0a 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e  .      ** guaran
227e0 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20  teed to operate 
227f0 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20  on the row with 
22800 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d  the minimum or m
22810 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 2a 2a  aximum .      **
22820 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65   value of x, the
22830 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72   only row requir
22840 65 64 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ed)..      **.  
22850 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c      ** A special
22860 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61   flag must be pa
22870 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
22880 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73  hereBegin() to s
22890 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a  lightly.      **
228a0 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 75   modify behaviou
228b0 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  r as follows:.  
228c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
228d0 20 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79    + If the query
228e0 20 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69   is a "SELECT mi
228f0 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20  n(x)", then the 
22900 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20  loop coded by.  
22910 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65      **     where
22920 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74  .c should not it
22930 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76  erate over any v
22940 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c  alues with a NUL
22950 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  L value.      **
22960 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20       for x..    
22970 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
22980 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  + The optimizer 
22990 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20  code in where.c 
229a0 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20  (the thing that 
229b0 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20 20  decides which.  
229c0 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78      **     index
229d0 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75   or indices to u
229e0 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65  se) should place
229f0 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69   a different pri
22a00 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20  ority on .      
22a10 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e  **     satisfyin
22a20 67 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27  g the 'ORDER BY'
22a30 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20   clause than it 
22a40 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61  does in other ca
22a50 73 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20  ses..      **   
22a60 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20    Refer to code 
22a70 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  and comments in 
22a80 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61  where.c for deta
22a90 69 6c 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ils..      */.  
22aa0 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61      flag = minMa
22ab0 78 51 75 65 72 79 28 70 29 3b 0a 20 20 20 20 20  xQuery(p);.     
22ac0 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20   if( flag ){.   
22ad0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
22ae0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d  prHasProperty(p-
22af0 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
22b00 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
22b10 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  t) );.        pM
22b20 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45  inMax = sqlite3E
22b30 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
22b40 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
22b50 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 30 29  Expr->x.pList,0)
22b60 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d  ;.        pDel =
22b70 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20   pMinMax;.      
22b80 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26    if( pMinMax &&
22b90 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
22ba0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
22bb0 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f  pMinMax->a[0].so
22bc0 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d  rtOrder = flag!=
22bd0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
22be0 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20  N ?1:0;.        
22bf0 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
22c00 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
22c10 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 7d  OLUMN;.        }
22c20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
22c30 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e  /* This case run
22c40 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61  s if the aggrega
22c50 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20  te has no GROUP 
22c60 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
22c70 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
22c80 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70  ing is much simp
22c90 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20  ler since there 
22ca0 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
22cb0 20 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66   row.      ** of
22cc0 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a   output..      *
22cd0 2f 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  /.      resetAcc
22ce0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
22cf0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
22d00 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
22d10 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
22d20 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
22d30 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61 78  pWhere, &pMinMax
22d40 2c 20 66 6c 61 67 2c 20 30 29 3b 0a 20 20 20 20  , flag, 0);.    
22d50 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
22d60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22d70 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
22d80 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20  (db, pDel);.    
22d90 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
22da0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
22db0 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
22dc0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
22dd0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69  ggInfo);.      i
22de0 66 28 20 21 70 4d 69 6e 4d 61 78 20 26 26 20 66  f( !pMinMax && f
22df0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  lag ){.        s
22e00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22e10 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
22e20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
22e30 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
22e40 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62  ment((v, "%s() b
22e50 79 20 69 6e 64 65 78 22 2c 28 66 6c 61 67 3d 3d  y index",(flag==
22e60 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
22e70 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29  N?"min":"max")))
22e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22e90 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
22ea0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 66  pWInfo);.      f
22eb0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
22ec0 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
22ed0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 4f  gInfo);.      pO
22ee0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
22ef0 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
22f00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22f10 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
22f20 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
22f30 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  rEnd, SQLITE_JUM
22f40 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
22f50 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  }.      selectIn
22f60 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
22f70 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
22f80 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20   0, 0, -1, .    
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fa0 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64    pDest, addrEnd
22fb0 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20  , addrEnd);..   
22fc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
22fd0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
22fe0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
22ff0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
23000 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64  Label(v, addrEnd
23010 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65  );.    .  } /* e
23020 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71  ndif aggregate q
23030 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  uery */..  /* If
23040 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
23050 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
23060 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
23070 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
23080 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
23090 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
230a0 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
230b0 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
230c0 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  y ){.    generat
230d0 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65  eSortTail(pParse
230e0 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e  , p, v, pEList->
230f0 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20  nExpr, pDest);. 
23100 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65   }..  /* Jump he
23110 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20  re to skip this 
23120 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
23130 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
23140 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a  abel(v, iEnd);..
23150 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
23160 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
23170 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68   coded.   Set th
23180 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
23190 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63   0.  ** to indic
231a0 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20  ate no errors.. 
231b0 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20   */.  rc = 0;.. 
231c0 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70   /* Control jump
231d0 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20  s to here if an 
231e0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
231f0 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75  ered above, or u
23200 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  pon.  ** success
23210 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68  ful coding of th
23220 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73  e SELECT..  */.s
23230 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a  elect_end:..  /*
23240 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
23250 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74   names if result
23260 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
23270 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74  are to be output
23280 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
23290 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
232a0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
232b0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65  Output ){.    ge
232c0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
232d0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
232e0 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
232f0 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
23300 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
23310 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Col);.  sqlite3D
23320 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e  bFree(db, sAggIn
23330 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74  fo.aFunc);.  ret
23340 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64  urn rc;.}..#if d
23350 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
23360 42 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  BUG)./*.********
23370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
233a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
233b0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66  *******.** The f
233c0 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69 73  ollowing code is
233d0 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
233e0 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
233f0 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 64 65 0a  only.  The code.
23400 2a 2a 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ** that follows 
23410 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20  does not appear 
23420 69 6e 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  in normal builds
23430 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
23440 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
23450 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65  to print out the
23460 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20   content of all 
23470 6f 72 20 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a  or part of a .**
23480 20 70 61 72 73 65 20 73 74 72 75 63 74 75 72 65   parse structure
23490 73 20 73 75 63 68 20 61 73 20 53 65 6c 65 63 74  s such as Select
234a0 20 6f 72 20 45 78 70 72 2e 20 20 53 75 63 68 20   or Expr.  Such 
234b0 70 72 69 6e 74 6f 75 74 73 20 61 72 65 20 75 73  printouts are us
234c0 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70  eful.** for help
234d0 69 6e 67 20 74 6f 20 75 6e 64 65 72 73 74 61 6e  ing to understan
234e0 64 20 77 68 61 74 20 69 73 20 68 61 70 70 65 6e  d what is happen
234f0 69 6e 67 20 69 6e 73 69 64 65 20 74 68 65 20 63  ing inside the c
23500 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
23510 20 64 75 72 69 6e 67 20 74 68 65 20 65 78 65 63   during the exec
23520 75 74 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78  ution of complex
23530 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
23540 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ts..**.** These 
23550 72 6f 75 74 69 6e 65 20 61 72 65 20 6e 6f 74 20  routine are not 
23560 63 61 6c 6c 65 64 20 61 6e 79 77 68 65 72 65 20  called anywhere 
23570 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
23580 6e 6f 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62  normal.** code b
23590 61 73 65 2e 20 20 54 68 65 6e 20 61 72 65 20 69  ase.  Then are i
235a0 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 63 61  ntended to be ca
235b0 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
235c0 20 74 68 65 20 64 65 62 75 67 67 65 72 0a 2a 2a   the debugger.**
235d0 20 6f 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61   or from tempora
235e0 72 79 20 22 70 72 69 6e 74 66 22 20 73 74 61 74  ry "printf" stat
235f0 65 6d 65 6e 74 73 20 69 6e 73 65 72 74 65 64 20  ements inserted 
23600 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a  for debugging..*
23610 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72  /.void sqlite3Pr
23620 69 6e 74 45 78 70 72 28 45 78 70 72 20 2a 70 29  intExpr(Expr *p)
23630 7b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e  {.  if( p->token
23640 2e 7a 20 26 26 20 70 2d 3e 74 6f 6b 65 6e 2e 6e  .z && p->token.n
23650 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
23660 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25  3DebugPrintf("(%
23670 2e 2a 73 22 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e  .*s", p->token.n
23680 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20  , p->token.z);. 
23690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
236a0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
236b0 28 25 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20  (%d", p->op);.  
236c0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74  }.  if( p->pLeft
236d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
236e0 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b  ebugPrintf(" ");
236f0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
23700 74 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b  tExpr(p->pLeft);
23710 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52  .  }.  if( p->pR
23720 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
23730 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23740 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
23750 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 52 69  PrintExpr(p->pRi
23760 67 68 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ght);.  }.  sqli
23770 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23780 29 22 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  )");.}.void sqli
23790 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74  te3PrintExprList
237a0 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
237b0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
237c0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
237d0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
237e0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
237f0 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  r(pList->a[i].pE
23800 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 69 3c  xpr);.    if( i<
23810 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29  pList->nExpr-1 )
23820 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
23830 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20 22 29  ebugPrintf(", ")
23840 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f  ;.    }.  }.}.vo
23850 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53  id sqlite3PrintS
23860 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c  elect(Select *p,
23870 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20   int indent){.  
23880 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23890 74 66 28 22 25 2a 73 53 45 4c 45 43 54 28 25 70  tf("%*sSELECT(%p
238a0 29 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c  ) ", indent, "",
238b0 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 72   p);.  sqlite3Pr
238c0 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  intExprList(p->p
238d0 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  EList);.  sqlite
238e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
238f0 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72  ");.  if( p->pSr
23900 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  c ){.    char *z
23910 50 72 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20  Prefix;.    int 
23920 69 3b 0a 20 20 20 20 7a 50 72 65 66 69 78 20 3d  i;.    zPrefix =
23930 20 22 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72   "FROM";.    for
23940 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d  (i=0; i<p->pSrc-
23950 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
23960 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
23970 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
23980 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a  &p->pSrc->a[i];.
23990 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
239a0 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 22 2c  ugPrintf("%*s ",
239b0 20 69 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66   indent+6, zPref
239c0 69 78 29 3b 0a 20 20 20 20 20 20 7a 50 72 65 66  ix);.      zPref
239d0 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69  ix = "";.      i
239e0 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
239f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
23a00 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23a10 22 28 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  "(\n");.        
23a20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65  sqlite3PrintSele
23a30 63 74 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  ct(pItem->pSelec
23a40 74 2c 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20  t, indent+10);. 
23a50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
23a60 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 29 22  bugPrintf("%*s)"
23a70 2c 20 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b  , indent+8, "");
23a80 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
23a90 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b   pItem->zName ){
23aa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23ab0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73 22  DebugPrintf("%s"
23ac0 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
23ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23ae0 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29  f( pItem->pTab )
23af0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23b00 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 74  3DebugPrintf("(t
23b10 61 62 6c 65 3a 20 25 73 29 22 2c 20 70 49 74 65  able: %s)", pIte
23b20 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  m->pTab->zName);
23b30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23b40 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
23b50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23b60 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23b70 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e   AS %s", pItem->
23b80 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d  zAlias);.      }
23b90 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70 2d 3e  .      if( i<p->
23ba0 70 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a  pSrc->nSrc-1 ){.
23bb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
23bc0 65 62 75 67 50 72 69 6e 74 66 28 22 2c 22 29 3b  ebugPrintf(",");
23bd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
23be0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23bf0 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  f("\n");.    }. 
23c00 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65   }.  if( p->pWhe
23c10 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  re ){.    sqlite
23c20 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
23c30 73 20 57 48 45 52 45 20 22 2c 20 69 6e 64 65 6e  s WHERE ", inden
23c40 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69  t, "");.    sqli
23c50 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e  te3PrintExpr(p->
23c60 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c  pWhere);.    sql
23c70 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23c80 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  "\n");.  }.  if(
23c90 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a   p->pGroupBy ){.
23ca0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23cb0 50 72 69 6e 74 66 28 22 25 2a 73 20 47 52 4f 55  Printf("%*s GROU
23cc0 50 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20  P BY ", indent, 
23cd0 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "");.    sqlite3
23ce0 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d  PrintExprList(p-
23cf0 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
23d00 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23d10 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  tf("\n");.  }.  
23d20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29  if( p->pHaving )
23d30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
23d40 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 48 41  ugPrintf("%*s HA
23d50 56 49 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20  VING ", indent, 
23d60 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "");.    sqlite3
23d70 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 48 61  PrintExpr(p->pHa
23d80 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  ving);.    sqlit
23d90 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
23da0 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n");.  }.  if( p
23db0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
23dc0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23dd0 69 6e 74 66 28 22 25 2a 73 20 4f 52 44 45 52 20  intf("%*s ORDER 
23de0 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  BY ", indent, ""
23df0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
23e00 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  intExprList(p->p
23e10 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71  OrderBy);.    sq
23e20 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23e30 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a  ("\n");.  }.}./*
23e40 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75   End of the stru
23e50 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69 6e  cture debug prin
23e60 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a  ting code.******
23e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23eb0 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20  *******/.#endif 
23ec0 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
23ed0 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
23ee0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
23ef0 20 2a 2f 0a                                       */.