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

Artifact 4d0b77fd76ff80f09a798ee98953e344c9de8fbb:


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 34  select.c,v 1.504
0200: 20 32 30 30 39 2f 30 32 2f 32 35 20 30 38 3a 35   2009/02/25 08:5
0210: 36 3a 34 37 20 64 61 6e 69 65 6c 6b 31 39 37 37  6:47 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 54  RMAL;.}../*.** T
18f70 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
18f80 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
18f90 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
18fa0 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
18fb0 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
18fc0 65 63 6f 6e 64 20 61 72 67 6d 65 6e 74 20 69 73  econd argment is
18fd0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
18fe0 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f  aggregate-info o
18ff0 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20  bject. This .** 
19000 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
19010 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
19020 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
19030 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
19040 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
19050 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c  **.** where tabl
19060 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  e is a database 
19070 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62  table, not a sub
19080 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
19090 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a   If the query.**
190a0 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73   does match this
190b0 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61   pattern, then a
190c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
190d0 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70  Table object rep
190e0 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62  resenting.** <tb
190f0 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  l> is returned. 
19100 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
19110 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
19120 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d  tic Table *isSim
19130 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20  pleCount(Select 
19140 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  *p, AggInfo *pAg
19150 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20  gInfo){.  Table 
19160 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70  *pTab;.  Expr *p
19170 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Expr;..  assert(
19180 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b   !p->pGroupBy );
19190 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  ..  if( p->pWher
191a0 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  e || p->pEList->
191b0 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20  nExpr!=1 .   || 
191c0 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
191d0 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30   || p->pSrc->a[0
191e0 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20  ].pSelect.  ){. 
191f0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
19200 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  .  pTab = p->pSr
19210 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
19220 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
19230 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
19240 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
19250 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20   !pTab->pSelect 
19260 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69  && pExpr );..  i
19270 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
19280 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
19290 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
192a0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
192b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
192c0 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  ( (pAggInfo->aFu
192d0 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 6c 61  nc[0].pFunc->fla
192e0 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  gs&SQLITE_FUNC_C
192f0 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72  OUNT)==0 ) retur
19300 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
19310 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69  ->flags&EP_Disti
19320 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nct ) return 0;.
19330 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
19340 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
19350 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
19360 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
19370 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
19380 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
19390 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
193a0 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
193b0 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
193c0 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
193d0 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
193e0 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
193f0 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
19400 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
19410 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
19420 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
19430 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
19440 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
19450 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
19460 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
19470 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
19480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
19490 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
194a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
194b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
194c0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
194d0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
194e0 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a  From->zIndex ){.
194f0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
19500 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
19510 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20     char *zIndex 
19520 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b  = pFrom->zIndex;
19530 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
19540 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
19550 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20  Tab->pIndex; .  
19560 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71        pIdx && sq
19570 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64  lite3StrICmp(pId
19580 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78  x->zName, zIndex
19590 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  ); .        pIdx
195a0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20  =pIdx->pNext.   
195b0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64   );.    if( !pId
195c0 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
195d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
195e0 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
195f0 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20  x: %s", zIndex, 
19600 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
19610 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
19620 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e     }.    pFrom->
19630 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
19640 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
19650 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19660 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
19670 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  a Walker callbac
19680 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67  k for "expanding
19690 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
196a0 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64  ment..** "Expand
196b0 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f  ing" means to do
196c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
196d0 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
196e0 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
196f0 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
19700 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
19710 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
19720 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
19730 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
19740 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
19750 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
19760 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
19770 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
19780 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
19790 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
197a0 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
197b0 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
197c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
197d0 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
197e0 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
197f0 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
19800 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
19810 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
19820 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
19830 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
19840 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
19850 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
19860 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
19870 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
19880 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
19890 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
198a0 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
198b0 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
198c0 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
198d0 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
198e0 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  resistent repres
198f0 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
19900 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
19910 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
19920 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
19930 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
19940 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e  accomodate the N
19950 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
19960 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
19970 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
19980 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
19990 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
199a0 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20    (4)  Scan the 
199b0 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
199c0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
199d0 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
199e0 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
199f0 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
19a00 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
19a10 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
19a20 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
19a30 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
19a40 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
19a50 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
19a60 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
19a70 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
19a80 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
19a90 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
19aa0 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  LE..**.*/.static
19ab0 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e   int selectExpan
19ac0 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  der(Walker *pWal
19ad0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
19ae0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
19af0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
19b00 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  se;.  int i, j, 
19b10 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  k;.  SrcList *pT
19b20 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
19b30 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74  st *pEList;.  st
19b40 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
19b50 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69  m *pFrom;.  sqli
19b60 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
19b70 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d  ->db;..  if( db-
19b80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29  >mallocFailed  )
19b90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
19ba0 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66  _Abort;.  }.  if
19bb0 28 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20  ( p->pSrc==0 || 
19bc0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
19bd0 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29  F_Expanded)!=0 )
19be0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
19bf0 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 2d  _Prune;.  }.  p-
19c00 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
19c10 45 78 70 61 6e 64 65 64 3b 0a 20 20 70 54 61 62  Expanded;.  pTab
19c20 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
19c30 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
19c40 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  List;..  /* Make
19c50 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
19c60 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
19c70 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
19c80 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
19c90 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
19ca0 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
19cb0 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
19cc0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
19cd0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
19ce0 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
19cf0 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
19d00 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
19d10 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19d20 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
19d30 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
19d40 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
19d50 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
19d60 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
19d70 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
19d80 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
19d90 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
19da0 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
19db0 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
19dc0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
19dd0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
19de0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
19df0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
19e00 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
19e10 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69  ble *pTab;.    i
19e20 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
19e30 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
19e40 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
19e50 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
19e60 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
19e70 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
19e80 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
19e90 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
19ea0 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( i==0 );.     
19eb0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
19ec0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
19ed0 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
19ee0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
19ef0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
19f00 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
19f10 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
19f20 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41  lect;.      /* A
19f30 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
19f40 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
19f50 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
19f60 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21     assert( pSel!
19f70 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
19f80 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
19f90 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
19fa0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
19fb0 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20  alker, pSel);.  
19fc0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
19fd0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
19fe0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
19ff0 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
1a000 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1a010 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1a020 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
1a030 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  b->db = db;.    
1a040 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
1a050 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e  ;.      pTab->zN
1a060 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
1a070 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
1a080 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20  _subquery_%p_", 
1a090 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20  (void*)pTab);.  
1a0a0 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
1a0b0 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20  >pPrior ){ pSel 
1a0c0 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20  = pSel->pPrior; 
1a0d0 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 43 6f  }.      selectCo
1a0e0 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
1a0f0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  t(pParse, pSel->
1a100 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
1a110 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
1a120 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69  );.      pTab->i
1a130 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20  PKey = -1;.     
1a140 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
1a150 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b  |= TF_Ephemeral;
1a160 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
1a170 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
1a180 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
1a190 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
1a1a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
1a1b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a1c0 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
1a1d0 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
1a1e0 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
1a1f0 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
1a200 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 30  teTable(pParse,0
1a210 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46  ,pFrom->zName,pF
1a220 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  rom->zDatabase);
1a230 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1a240 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1a250 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
1a260 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21  b->nRef++;.#if !
1a270 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1a280 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
1a290 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
1a2a0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
1a2b0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
1a2c0 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69  >pSelect || IsVi
1a2d0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
1a2e0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
1a2f0 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
1a300 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
1a310 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
1a320 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1a330 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
1a340 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
1a350 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
1a360 43 5f 41 62 6f 72 74 3b 0a 0a 20 20 20 20 20 20  C_Abort;..      
1a370 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70    /* If pFrom->p
1a380 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61  Select!=0 it mea
1a390 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
1a3a0 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20  g with a.       
1a3b0 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20   ** view within 
1a3c0 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c  a view.  The SEL
1a3d0 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61  ECT structure ha
1a3e0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  s already been. 
1a3f0 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64         ** copied
1a400 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69   by the outer vi
1a410 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69  ew so we can ski
1a420 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20  p the copy step 
1a430 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
1a440 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65  in the inner vie
1a450 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
1a460 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
1a470 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
1a480 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e           pFrom->
1a490 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
1a4a0 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
1a4b0 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Tab->pSelect, 0)
1a4c0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1a4d0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
1a4e0 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53  alker, pFrom->pS
1a4f0 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
1a500 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
1a510 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
1a520 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
1a530 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44  named by the IND
1a540 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
1a550 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
1a560 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  f( sqlite3Indexe
1a570 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  dByLookup(pParse
1a580 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
1a590 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
1a5a0 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rt;.    }.  }.. 
1a5b0 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
1a5c0 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
1a5d0 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
1a5e0 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
1a5f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
1a600 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
1a610 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
1a620 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  n(pParse, p) ){.
1a630 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
1a640 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  bort;.  }..  /* 
1a650 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
1a660 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
1a670 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
1a680 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
1a690 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
1a6a0 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
1a6b0 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
1a6c0 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
1a6d0 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
1a6e0 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
1a6f0 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
1a700 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
1a710 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
1a720 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
1a730 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  TK_ALL operator 
1a740 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
1a750 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
1a760 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20  e column list.. 
1a770 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
1a780 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
1a790 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
1a7a0 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73  _ALL expressions
1a7b0 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a   and expand.  **
1a7c0 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
1a7d0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
1a7e0 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
1a7f0 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
1a800 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
1a810 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
1a820 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
1a830 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
1a840 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
1a850 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
1a860 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
1a870 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
1a880 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
1a890 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70  EList->a[k].pExp
1a8a0 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  r;.    if( pE->o
1a8b0 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61  p==TK_ALL ) brea
1a8c0 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  k;.    if( pE->o
1a8d0 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
1a8e0 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70  >pRight && pE->p
1a8f0 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  Right->op==TK_AL
1a900 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 45  L.         && pE
1a910 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70  ->pLeft && pE->p
1a920 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Left->op==TK_ID 
1a930 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
1a940 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
1a950 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
1a960 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
1a970 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
1a980 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
1a990 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
1a9a0 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
1a9b0 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
1a9c0 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
1a9d0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
1a9e0 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
1a9f0 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
1aa00 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
1aa10 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
1aa20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
1aa30 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1aa40 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
1aa50 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
1aa60 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
1aa70 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
1aa80 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
1aa90 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
1aaa0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1aab0 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
1aac0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
1aad0 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67          && (flag
1aae0 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
1aaf0 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
1ab00 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
1ab10 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
1ab20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1ab30 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
1ab40 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
1ab50 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20  !=TK_ALL &&.    
1ab60 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d         (pE->op!=
1ab70 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
1ab80 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  ight==0 || pE->p
1ab90 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  Right->op!=TK_AL
1aba0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  L) ){.        /*
1abb0 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
1abc0 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
1abd0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
1abe0 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
1abf0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
1ac00 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
1ac10 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1ac20 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  , pNew, a[k].pEx
1ac30 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
1ac40 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
1ac50 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
1ac60 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
1ac70 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
1ac80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ac90 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
1aca0 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  0;.        a[k].
1acb0 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
1acc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1acd0 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
1ace0 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
1acf0 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
1ad00 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
1ad10 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
1ad20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
1ad30 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
1ad40 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
1ad50 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
1ad60 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
1ad70 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20  r *zTName;      
1ad80 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
1ad90 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
1ada0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
1adb0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
1adc0 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pE->pLeft ){.   
1add0 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
1ade0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1adf0 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e 70 4c  oken(db, &pE->pL
1ae00 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  eft->token);.   
1ae10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ae20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30        zTName = 0
1ae30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ae40 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
1ae50 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
1ae60 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
1ae70 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
1ae80 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
1ae90 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
1aea0 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
1aeb0 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
1aec0 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pFrom->zAlias;.
1aed0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
1aee0 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61  abName==0 || zTa
1aef0 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a  bName[0]==0 ){ .
1af00 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
1af10 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
1af20 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
1af30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
1af40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1af50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1af60 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
1af70 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1af80 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
1af90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1afa0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1afb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1afc0 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
1afd0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1afe0 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
1aff0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
1b000 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
1b010 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20  , *pRight;.     
1b020 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
1b030 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
1b040 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20  j].zName;..     
1b050 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
1b060 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
1b070 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72  as 'hidden' (cur
1b080 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73  rently only poss
1b090 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  ible.           
1b0a0 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20   ** for virtual 
1b0b0 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20  tables), do not 
1b0c0 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68  include it in th
1b0d0 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
1b0e0 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
1b0f0 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20  -set list..     
1b100 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1b110 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
1b120 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
1b130 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  aCol[j]) ){.    
1b140 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1b150 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  (IsVirtual(pTab)
1b160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1b170 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1b180 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1b190 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
1b1a0 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   zTName==0 ){.  
1b1b0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
1b1c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1b1d0 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69  *pLeft = &pTabLi
1b1e0 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20  st->a[i-1];.    
1b1f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
1b200 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65  Left[1].jointype
1b210 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
1b220 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
1b230 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
1b240 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e  umnIndex(pLeft->
1b250 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  pTab, zName)>=0 
1b260 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1b270 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
1b280 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
1b290 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
1b2a0 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
1b2b0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
1b2c0 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  e on the right *
1b2d0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1b2e0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1b2f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
1b310 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
1b320 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e 67  (pLeft[1].pUsing
1b330 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
1b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b350 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
1b360 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
1b370 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
1b380 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
1b390 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
1b3a0 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
1b3b0 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
1b3c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
1b3d0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1b3f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1b400 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
1b410 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1b420 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c  Parse, TK_ID, 0,
1b430 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
1b440 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d 3d      if( pRight==
1b450 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
1b460 20 20 20 20 20 20 20 73 65 74 51 75 6f 74 65 64         setQuoted
1b470 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70  Token(pParse, &p
1b480 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e  Right->token, zN
1b490 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1b4a0 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
1b4b0 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  || pTabList->nSr
1b4c0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>1 ){.         
1b4d0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
1b4e0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1b4f0 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30  pParse, TK_ID, 0
1b500 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
1b510 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
1b520 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1b530 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
1b540 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
1b550 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1b560 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61   pExpr==0 ) brea
1b570 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
1b580 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28   setQuotedToken(
1b590 70 50 61 72 73 65 2c 20 26 70 4c 65 66 74 2d 3e  pParse, &pLeft->
1b5a0 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29  token, zTabName)
1b5b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b5c0 73 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d  setToken(&pExpr-
1b5d0 3e 73 70 61 6e 2c 20 0a 20 20 20 20 20 20 20 20  >span, .        
1b5e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b5f0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
1b600 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
1b610 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
1b620 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70         pExpr->sp
1b630 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20  an.dyn = 1;.    
1b640 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1b650 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20  >token.z = 0;.  
1b660 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1b670 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a  r->token.n = 0;.
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1b690 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d  xpr->token.dyn =
1b6a0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1b6b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1b6c0 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69       pExpr = pRi
1b6d0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
1b6e0 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d     pExpr->span =
1b6f0 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20   pExpr->token;. 
1b700 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1b710 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 30  pr->span.dyn = 0
1b720 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1b730 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b740 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
1b750 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
1b760 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1b770 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1b780 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45  pNew, pExpr, &pE
1b790 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
1b7a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
1b7c0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
1b7d0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1b7e0 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26  , pNew, pExpr, &
1b7f0 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a  pRight->token);.
1b800 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1b810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b820 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1b830 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20  !tableSeen ){.  
1b840 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
1b850 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
1b860 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1b870 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
1b880 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a  ch table: %s", z
1b890 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  TName);.        
1b8a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b8b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1b8c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
1b8d0 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
1b8e0 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  d");.          }
1b8f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b900 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1b910 28 64 62 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  (db, zTName);.  
1b920 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b930 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1b940 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74  elete(db, pEList
1b950 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
1b960 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66   = pNew;.  }.#if
1b970 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
1b980 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  MN.  if( p->pELi
1b990 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d  st && p->pEList-
1b9a0 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69  >nExpr>db->aLimi
1b9b0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
1b9c0 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
1b9d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b9e0 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
1b9f0 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
1ba00 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e  t set");.  }.#en
1ba10 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43  dif.  return WRC
1ba20 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
1ba30 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e  .** No-op routin
1ba40 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d  e for the parse-
1ba50 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a  tree walker..**.
1ba60 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
1ba70 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b  tine is the Walk
1ba80 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
1ba90 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e   then expression
1baa0 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61   trees.** are wa
1bab0 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79  lked without any
1bac0 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74   actions being t
1bad0 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64  aken at each nod
1bae0 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a  e.  Presumably,.
1baf0 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
1bb00 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
1bb10 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
1bb20 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57  lback then .** W
1bb30 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
1bb40 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20  lback is set to 
1bb50 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65  do something use
1bb60 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a  ful for every .*
1bb70 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
1bb80 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
1bb90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
1bba0 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72  rWalkNoop(Walker
1bbb0 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20   *NotUsed, Expr 
1bbc0 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
1bbd0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
1bbe0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
1bbf0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  2);.  return WRC
1bc00 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
1bc10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1bc20 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c   "expands" a SEL
1bc30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
1bc40 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
1bc50 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20  queries..** For 
1bc60 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
1bc70 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69  mation on what i
1bc80 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61  t means to "expa
1bc90 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20  nd" a SELECT.** 
1bca0 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74  statement, see t
1bcb0 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
1bcc0 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77  e selectExpand w
1bcd0 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61  orker callback a
1bce0 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61  bove..**.** Expa
1bcf0 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73  nding a SELECT s
1bd00 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20  tatement is the 
1bd10 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72  first step in pr
1bd20 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45  ocessing a.** SE
1bd30 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
1bd40 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
1bd50 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78  ement must be ex
1bd60 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a  panded before.**
1bd70 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
1bd80 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
1bd90 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  *.** If anything
1bda0 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20   goes wrong, an 
1bdb0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
1bdc0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50   written into pP
1bdd0 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  arse..** The cal
1bde0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  ling function ca
1bdf0 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f  n detect the pro
1be00 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  blem by looking 
1be10 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a  at pParse->nErr.
1be20 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65  ** and/or pParse
1be30 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1be40 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1be50 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
1be60 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50  Expand(Parse *pP
1be70 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
1be80 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72  elect){.  Walker
1be90 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43   w;.  w.xSelectC
1bea0 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
1beb0 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 45  Expander;.  w.xE
1bec0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
1bed0 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
1bee0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
1bef0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
1bf00 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
1bf10 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  );.}...#ifndef S
1bf20 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1bf30 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  ERY./*.** This i
1bf40 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  s a Walker.xSele
1bf50 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62  ctCallback callb
1bf60 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ack for the sqli
1bf70 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66  te3SelectTypeInf
1bf80 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  o().** interface
1bf90 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68  ..**.** For each
1bfa0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
1bfb0 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d  query, add Colum
1bfc0 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75  n.zType and Colu
1bfd0 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f  mn.zColl.** info
1bfe0 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54  rmation to the T
1bff0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
1c000 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
1c010 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a  he result set.**
1c020 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72   of that subquer
1c030 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62  y..**.** The Tab
1c040 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
1c050 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
1c060 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20   result set was 
1c070 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62  constructed.** b
1c080 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  y selectExpander
1c090 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20  () but the type 
1c0a0 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
1c0b0 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d  formation was om
1c0c0 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74  itted.** at that
1c0d0 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69   point because i
1c0e0 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e  dentifiers had n
1c0f0 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f  ot yet been reso
1c100 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  lved.  This.** r
1c110 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1c120 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65   after identifie
1c130 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  r resolution..*/
1c140 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
1c150 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
1c160 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57  eInfo(Walker *pW
1c170 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
1c180 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
1c190 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  se;.  int i;.  S
1c1a0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
1c1b0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1c1c0 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
1c1d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
1c1e0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
1c1f0 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 28 70  lved );.  if( (p
1c200 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1c210 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20  HasTypeInfo)==0 
1c220 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  ){.    p->selFla
1c230 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65  gs |= SF_HasType
1c240 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72 73 65  Info;.    pParse
1c250 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
1c260 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  se;.    pTabList
1c270 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
1c280 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
1c290 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
1c2a0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1c2b0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
1c2c0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
1c2d0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
1c2e0 20 20 20 20 69 66 28 20 70 54 61 62 20 26 26 20      if( pTab && 
1c2f0 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
1c300 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
1c310 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1c320 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
1c330 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1c340 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
1c350 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
1c360 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
1c370 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 61 73  lect;.        as
1c380 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20 20  sert( pSel );.  
1c390 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
1c3a0 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  l->pPrior ) pSel
1c3b0 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
1c3c0 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 41  .        selectA
1c3d0 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
1c3e0 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
1c3f0 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61   pTab->nCol, pTa
1c400 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 29 3b 0a  b->aCol, pSel);.
1c410 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c420 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
1c430 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69  ontinue;.}.#endi
1c440 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
1c450 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61  outine adds data
1c460 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
1c470 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f  ng sequence info
1c480 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68  rmation to.** th
1c490 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
1c4a0 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63  es of all FROM-c
1c4b0 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
1c4c0 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   in a.** SELECT 
1c4d0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
1c4e0 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   Use this routin
1c4f0 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  e after name res
1c500 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
1c510 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
1c520 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
1c530 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c540 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
1c550 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1c560 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1c570 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
1c580 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
1c590 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
1c5a0 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e  ryTypeInfo;.  w.
1c5b0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
1c5c0 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  exprWalkNoop;.  
1c5d0 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
1c5e0 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
1c5f0 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
1c600 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  ct);.#endif.}...
1c610 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1c620 6e 65 20 73 65 74 73 20 6f 66 20 61 20 53 45 4c  ne sets of a SEL
1c630 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  ECT statement fo
1c640 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  r processing.  T
1c650 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
1c660 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a  is accomplished:
1c670 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44  .**.**     *  VD
1c680 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE Cursor number
1c690 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  s are assigned t
1c6a0 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  o all FROM-claus
1c6b0 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20  e terms..**     
1c6c0 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62  *  Ephemeral Tab
1c6d0 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  le objects are c
1c6e0 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46  reated for all F
1c6f0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1c700 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  eries..**     * 
1c710 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1c720 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65  auses are shifte
1c730 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61  d into WHERE sta
1c740 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a  tements.**     *
1c750 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20    Wildcards "*" 
1c760 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e  and "TABLE.*" in
1c770 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65   result sets are
1c780 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20   expanded..**   
1c790 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73    *  Identifiers
1c7a0 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   in expression a
1c7b0 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61  re matched to ta
1c7c0 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  bles..**.** This
1c7d0 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65   routine acts re
1c7e0 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c  cursively on all
1c7f0 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
1c800 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  in the SELECT..*
1c810 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
1c820 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73  lectPrep(.  Pars
1c830 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1c840 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
1c850 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
1c860 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
1c870 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
1c880 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
1c890 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
1c8a0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
1c8b0 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  erNC  /* Name co
1c8c0 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69  ntext for contai
1c8d0 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ner */.){.  sqli
1c8e0 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 70  te3 *db;.  if( p
1c8f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1c900 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1c910 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
1c920 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
1c930 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  nfo ) return;.  
1c940 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1c950 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1c960 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
1c970 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
1c980 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b  pand(pParse, p);
1c990 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1c9a0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
1c9b0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
1c9c0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
1c9d0 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50  veSelectNames(pP
1c9e0 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e  arse, p, pOuterN
1c9f0 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  C);.  if( pParse
1ca00 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
1ca10 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1ca20 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
1ca30 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
1ca40 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f  pParse, p);.}../
1ca50 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
1ca60 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
1ca70 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
1ca80 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
1ca90 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
1caa0 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
1cab0 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
1cac0 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
1cad0 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
1cae0 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
1caf0 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
1cb00 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20  e simply stores 
1cb10 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
1cb20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c  those memory cel
1cb30 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
1cb40 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
1cb50 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
1cb60 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
1cb70 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
1cb80 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1cb90 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
1cba0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
1cbb0 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70   *pFunc;.  if( p
1cbc0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70  AggInfo->nFunc+p
1cbd0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
1cbe0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1cbf0 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
1cc00 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
1cc10 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
1cc20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cc30 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1cc40 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  , pAggInfo->aCol
1cc50 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  [i].iMem);.  }. 
1cc60 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
1cc70 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
1cc80 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
1cc90 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
1cca0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1ccb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1ccc0 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69  ull, 0, pFunc->i
1ccd0 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 46  Mem);.    if( pF
1cce0 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d  unc->iDistinct>=
1ccf0 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
1cd00 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78  *pE = pFunc->pEx
1cd10 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
1cd20 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1cd30 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pE, EP_xIsSel
1cd40 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ect) );.      if
1cd50 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30  ( pE->x.pList==0
1cd60 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d   || pE->x.pList-
1cd70 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
1cd80 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1cd90 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49  rMsg(pParse, "DI
1cda0 53 54 49 4e 43 54 20 61 67 67 72 65 67 61 74 65  STINCT aggregate
1cdb0 73 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63  s must have exac
1cdc0 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20  tly one ".      
1cdd0 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29       "argument")
1cde0 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d  ;.        pFunc-
1cdf0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
1ce00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ce10 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
1ce20 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
1ce30 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
1ce40 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73  arse, pE->x.pLis
1ce50 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
1ce60 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1ce70 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1ce80 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  l, pFunc->iDisti
1ce90 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
1cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ceb0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1cec0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
1ced0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
1cee0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
1cef0 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
1cf00 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
1cf10 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
1cf20 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1cf30 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
1cf40 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
1cf50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1cf60 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
1cf70 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
1cf80 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
1cf90 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
1cfa0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1cfb0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1cfc0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
1cfd0 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
1cfe0 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
1cff0 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
1d000 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
1d010 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
1d020 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
1d030 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1d040 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1d050 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
1d060 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1d070 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ect) );.    sqli
1d080 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1d090 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46   OP_AggFinal, pF
1d0a0 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20  ->iMem, pList ? 
1d0b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
1d0c0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1d0d0 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
1d0e0 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
1d0f0 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a  FUNCDEF);.  }.}.
1d100 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
1d110 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65  e accumulator me
1d120 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  mory cells for a
1d130 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65  n aggregate base
1d140 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
1d150 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
1d160 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1d170 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75  oid updateAccumu
1d180 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
1d190 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
1d1a0 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
1d1b0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1d1c0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
1d1d0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
1d1e0 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
1d1f0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
1d200 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
1d210 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
1d220 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
1d230 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
1d240 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1d250 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
1d260 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
1d270 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
1d280 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
1d290 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1d2a0 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
1d2b0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
1d2c0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1d2d0 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
1d2e0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1d2f0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1d300 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
1d310 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
1d320 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
1d330 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1d340 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
1d350 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1d360 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
1d370 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
1d380 65 67 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 7d  egAgg, 0);.    }
1d390 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
1d3a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41   = 0;.      regA
1d3b0 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gg = 0;.    }.  
1d3c0 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
1d3d0 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
1d3e0 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
1d3f0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1d400 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
1d410 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
1d420 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
1d430 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73  pParse, pF->iDis
1d440 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c  tinct, addrNext,
1d450 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20   1, regAgg);.   
1d460 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70   }.    if( pF->p
1d470 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53 51  Func->flags & SQ
1d480 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
1d490 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
1d4a0 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
1d4b0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
1d4c0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1d4d0 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
1d4e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1d4f0 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
1d500 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
1d510 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
1d520 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
1d530 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
1d540 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
1d550 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
1d560 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
1d570 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1d580 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1d590 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
1d5a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1d5b0 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
1d5c0 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
1d5d0 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
1d5e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1d5f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1d600 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
1d610 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
1d620 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
1d630 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  EQ);.    }.    s
1d640 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1d650 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20  (v, OP_AggStep, 
1d660 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69  0, regAgg, pF->i
1d670 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Mem,.           
1d680 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
1d690 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
1d6a0 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71  FUNCDEF);.    sq
1d6b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1d6c0 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a  5(v, (u8)nArg);.
1d6d0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1d6e0 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
1d6f0 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
1d700 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1d710 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1d720 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
1d730 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
1d740 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b   if( addrNext ){
1d750 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d760 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1d770 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
1d780 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30   }.  }.  for(i=0
1d790 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pC=pAggInfo->a
1d7a0 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  Col; i<pAggInfo-
1d7b0 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69  >nAccumulator; i
1d7c0 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73  ++, pC++){.    s
1d7d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1d7e0 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72  Parse, pC->pExpr
1d7f0 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d  , pC->iMem);.  }
1d800 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
1d810 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a  ectMode = 0;.}..
1d820 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1d830 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45  ode for the SELE
1d840 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76  CT statement giv
1d850 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75  en in the p argu
1d860 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ment.  .**.** Th
1d870 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
1d880 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72  stributed in var
1d890 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64  ious ways depend
1d8a0 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f  ing on the.** co
1d8b0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53 65  ntents of the Se
1d8c0 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
1d8d0 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
1d8e0 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74 0a   argument pDest.
1d8f0 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ** as follows:.*
1d900 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d 3e  *.**     pDest->
1d910 65 44 65 73 74 20 20 20 20 52 65 73 75 6c 74 0a  eDest    Result.
1d920 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  **     ---------
1d930 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
1d940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d960 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4f 75  --.**     SRT_Ou
1d970 74 70 75 74 20 20 20 20 20 20 47 65 6e 65 72 61  tput      Genera
1d980 74 65 20 61 20 72 6f 77 20 6f 66 20 6f 75 74 70  te a row of outp
1d990 75 74 20 28 75 73 69 6e 67 20 74 68 65 20 4f 50  ut (using the OP
1d9a0 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20 20 20  _ResultRow.**   
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9c0 20 20 6f 70 63 6f 64 65 29 20 66 6f 72 20 65 61    opcode) for ea
1d9d0 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20 72 65  ch row in the re
1d9e0 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  sult set..**.** 
1d9f0 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20      SRT_Mem     
1da00 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69      Only valid i
1da10 66 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  f the result is 
1da20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e  a single column.
1da30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1da40 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68          Store th
1da50 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  e first column o
1da60 66 20 74 68 65 20 66 69 72 73 74 20 72 65 73 75  f the first resu
1da70 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  lt row.**       
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1da90 20 72 65 67 69 73 74 65 72 20 70 44 65 73 74 2d   register pDest-
1daa0 3e 69 50 61 72 6d 20 74 68 65 6e 20 61 62 61 6e  >iParm then aban
1dab0 64 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a 2a 20  don the rest.** 
1dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dad0 20 20 20 20 6f 66 20 74 68 65 20 71 75 65 72 79      of the query
1dae0 2e 20 20 54 68 69 73 20 64 65 73 74 69 6e 61 74  .  This destinat
1daf0 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c 49 4d  ion implies "LIM
1db00 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  IT 1"..**.**    
1db10 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20   SRT_Set        
1db20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74   The result must
1db30 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   be a single col
1db40 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61 63 68  umn.  Store each
1db50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1db60 20 20 20 20 20 20 20 20 72 6f 77 20 6f 66 20 72          row of r
1db70 65 73 75 6c 74 20 61 73 20 74 68 65 20 6b 65 79  esult as the key
1db80 20 69 6e 20 74 61 62 6c 65 20 70 44 65 73 74 2d   in table pDest-
1db90 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20  >iParm. .**     
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbb0 41 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69  Apply the affini
1dbc0 74 79 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69  ty pDest->affini
1dbd0 74 79 20 62 65 66 6f 72 65 20 73 74 6f 72 69 6e  ty before storin
1dbe0 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  g.**            
1dbf0 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 73           results
1dc00 2e 20 20 55 73 65 64 20 74 6f 20 69 6d 70 6c 65  .  Used to imple
1dc10 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c 45 43 54  ment "IN (SELECT
1dc20 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20   ...)"..**.**   
1dc30 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20    SRT_Union     
1dc40 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
1dc50 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65  as a key in a te
1dc60 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
1dc70 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
1dc80 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
1dc90 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
1dca0 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65  ults from the te
1dcb0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
1dcc0 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
1dcd0 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20  *     SRT_Table 
1dce0 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
1dcf0 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  lts in temporary
1dd00 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
1dd10 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  arm..**         
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 69 73              This
1dd30 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 45 70 68   is like SRT_Eph
1dd40 65 6d 54 61 62 20 65 78 63 65 70 74 20 74 68 61  emTab except tha
1dd50 74 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20  t the table.**  
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd70 20 20 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f     is assumed to
1dd80 20 61 6c 72 65 61 64 79 20 62 65 20 6f 70 65 6e   already be open
1dd90 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1dda0 45 70 68 65 6d 54 61 62 20 20 20 20 43 72 65 61  EphemTab    Crea
1ddb0 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20  te an temporary 
1ddc0 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
1ddd0 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20  rm and store.** 
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddf0 20 20 20 20 74 68 65 20 72 65 73 75 6c 74 20 74      the result t
1de00 68 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f 72  here. The cursor
1de10 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61 66   is left open af
1de20 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ter.**          
1de30 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1de40 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 6c  ning.  This is l
1de50 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20 65 78  ike SRT_Table ex
1de60 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20 20 20  cept that.**    
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de80 20 74 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f   this destinatio
1de90 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e 45 70  n uses OP_OpenEp
1dea0 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65 61 74  hemeral to creat
1deb0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1dec0 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
1ded0 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20  le first..**.** 
1dee0 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e      SRT_Coroutin
1def0 65 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 63  e   Generate a c
1df00 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72  o-routine that r
1df10 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72 6f 77  eturns a new row
1df20 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
1df30 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
1df40 74 73 20 65 61 63 68 20 74 69 6d 65 20 69 74 20  ts each time it 
1df50 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68 65  is invoked.  The
1df60 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a 2a 20   entry point.** 
1df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df80 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f      of the co-ro
1df90 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65 64 20  utine is stored 
1dfa0 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73  in register pDes
1dfb0 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  t->iParm..**.** 
1dfc0 20 20 20 20 53 52 54 5f 45 78 69 73 74 73 20 20      SRT_Exists  
1dfd0 20 20 20 20 53 74 6f 72 65 20 61 20 31 20 69 6e      Store a 1 in
1dfe0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65   memory cell pDe
1dff0 73 74 2d 3e 69 50 61 72 6d 20 69 66 20 74 68 65  st->iParm if the
1e000 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20   result.**      
1e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1e020 65 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e  et is not empty.
1e030 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44  .**.**     SRT_D
1e040 69 73 63 61 72 64 20 20 20 20 20 54 68 72 6f 77  iscard     Throw
1e050 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 77 61   the results awa
1e060 79 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  y.  This is used
1e070 20 62 79 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20   by SELECT.**   
1e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e090 20 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74    statements wit
1e0a0 68 69 6e 20 74 72 69 67 67 65 72 73 20 77 68 6f  hin triggers who
1e0b0 73 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20  se only purpose 
1e0c0 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  is.**           
1e0d0 20 20 20 20 20 20 20 20 20 20 74 68 65 20 73 69            the si
1e0e0 64 65 2d 65 66 66 65 63 74 73 20 6f 66 20 66 75  de-effects of fu
1e0f0 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  nctions..**.** T
1e100 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1e110 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
1e120 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
1e130 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
1e140 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
1e150 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
1e160 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1e170 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
1e180 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
1e190 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e1a0 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
1e1b0 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
1e1c0 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
1e1d0 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
1e1e0 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
1e1f0 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74   do that..*/.int
1e200 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
1e210 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1e220 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e230 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
1e240 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1e250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e260 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1e270 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
1e280 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
1e290 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57  *pDest      /* W
1e2a0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
1e2b0 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  he query results
1e2c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
1e2d0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
1e2e0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
1e2f0 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
1e300 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
1e310 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69  Return from sqli
1e320 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
1e330 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
1e340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e350 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
1e360 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
1e370 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
1e380 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20  sAgg;           
1e390 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
1e3a0 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
1e3b0 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
1e3c0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1e3d0 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
1e3e0 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
1e3f0 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
1e400 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
1e410 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
1e420 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
1e430 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
1e440 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
1e450 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1e460 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
1e470 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1e480 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20  pOrderBy;    /* 
1e490 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
1e4a0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
1e4b0 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
1e4c0 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
1e4d0 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
1e4e0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
1e4f0 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
1e500 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
1e510 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
1e520 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
1e530 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73  L */.  int isDis
1e540 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
1e550 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
1e560 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
1e570 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
1e580 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20  t distinct;     
1e590 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1e5a0 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
1e5b0 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69  tinct set */.  i
1e5c0 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
1e5d0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
1e5e0 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
1e5f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
1e600 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64   int addrSortInd
1e610 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  ex;     /* Addre
1e620 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e  ss of an OP_Open
1e630 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
1e640 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e  ction */.  AggIn
1e650 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20  fo sAggInfo;    
1e660 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1e670 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61   used by aggrega
1e680 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
1e690 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20  int iEnd;       
1e6a0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1e6b0 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20  s of the end of 
1e6c0 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  the query */.  s
1e6d0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
1e6e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1e6f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1e700 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72   */..  db = pPar
1e710 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d  se->db;.  if( p=
1e720 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
1e730 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
1e740 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65  ->nErr ){.    re
1e750 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
1e760 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1e770 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1e780 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
1e790 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
1e7a0 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66   memset(&sAggInf
1e7b0 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67  o, 0, sizeof(sAg
1e7c0 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 70 4f 72 64  gInfo));..  pOrd
1e7d0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1e7e0 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61  By;.  if( Ignora
1e7f0 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
1e800 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ) ){.    p->pOrd
1e810 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  erBy = 0;..    /
1e820 2a 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  * In these cases
1e830 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70   the DISTINCT op
1e840 65 72 61 74 6f 72 20 6d 61 6b 65 73 20 6e 6f 20  erator makes no 
1e850 64 69 66 66 65 72 65 6e 63 65 20 74 6f 20 74 68  difference to th
1e860 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73  e.    ** results
1e870 2c 20 73 6f 20 72 65 6d 6f 76 65 20 69 74 20 69  , so remove it i
1e880 66 20 69 74 20 77 65 72 65 20 73 70 65 63 69 66  f it were specif
1e890 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ied..    */.    
1e8a0 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44  assert(pDest->eD
1e8b0 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20  est==SRT_Exists 
1e8c0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
1e8d0 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20  =SRT_Union || . 
1e8e0 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
1e8f0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65  >eDest==SRT_Exce
1e900 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  pt || pDest->eDe
1e910 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 29  st==SRT_Discard)
1e920 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
1e930 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
1e940 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
1e950 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73  SelectPrep(pPars
1e960 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70 54 61 62  e, p, 0);.  pTab
1e970 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
1e980 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
1e990 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 50 61 72  List;.  if( pPar
1e9a0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
1e9b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1e9c0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
1e9d0 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f  end;.  }.  p->pO
1e9e0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
1e9f0 79 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d  y;.  isAgg = (p-
1ea00 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
1ea10 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
1ea20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20  if( pEList==0 ) 
1ea30 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1ea40 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20  ..  /* .  ** Do 
1ea50 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74  not even attempt
1ea60 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79   to generate any
1ea70 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76 65   code if we have
1ea80 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20   already seen.  
1ea90 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65  ** errors before
1eaa0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   this routine st
1eab0 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  arts..  */.  if(
1eac0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
1ead0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1eae0 64 3b 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42  d;..  /* ORDER B
1eaf0 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  Y is ignored for
1eb00 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f   some destinatio
1eb10 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ns..  */.  if( I
1eb20 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
1eb30 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 4f  pDest) ){.    pO
1eb40 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
1eb50 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
1eb60 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
1eb70 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
1eb80 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1eb90 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
1eba0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
1ebb0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1ebc0 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
1ebd0 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
1ebe0 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
1ebf0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1ec00 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1ec10 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1ec20 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
1ec30 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50   for(i=0; !p->pP
1ec40 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69  rior && i<pTabLi
1ec50 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
1ec60 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1ec70 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1ec80 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
1ec90 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
1eca0 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
1ecb0 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
1ecc0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e  >pSelect;.    in
1ecd0 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20  t isAggSub;..   
1ece0 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20   if( pSub==0 || 
1ecf0 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74  pItem->isPopulat
1ed00 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  ed ) continue;..
1ed10 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
1ed20 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62   Parse.nHeight b
1ed30 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20  y the height of 
1ed40 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72  the largest expr
1ed50 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72  ession.    ** tr
1ed60 65 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79  ee refered to by
1ed70 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e   this, the paren
1ed80 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68  t select. The ch
1ed90 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a  ild select.    *
1eda0 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78  * may contain ex
1edb0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f  pression trees o
1edc0 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a  f at most.    **
1edd0 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50   (SQLITE_MAX_EXP
1ede0 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48  R_DEPTH-Parse.nH
1edf0 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54  eight) height. T
1ee00 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20  his is a bit.   
1ee10 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76   ** more conserv
1ee20 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73  ative than neces
1ee30 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65  sary, but much e
1ee40 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72  asier than enfor
1ee50 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65  cing.    ** an e
1ee60 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20  xact limit..    
1ee70 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
1ee80 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65  Height += sqlite
1ee90 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
1eea0 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  t(p);..    /* Ch
1eeb0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1eec0 65 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62  e subquery can b
1eed0 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20  e absorbed into 
1eee0 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20  the parent. */. 
1eef0 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28 70     isAggSub = (p
1ef00 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1ef10 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
1ef20 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65  ;.    if( flatte
1ef30 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  nSubquery(pParse
1ef40 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69  , p, i, isAgg, i
1ef50 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20  sAggSub) ){.    
1ef60 20 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29    if( isAggSub )
1ef70 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20  {.        isAgg 
1ef80 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
1ef90 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41  selFlags |= SF_A
1efa0 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20  ggregate;.      
1efb0 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a  }.      i = -1;.
1efc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1efd0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1efe0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
1eff0 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65  T_EphemTab, pIte
1f000 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
1f010 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1f020 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3d 3d 30  ->isPopulated==0
1f030 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1f040 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
1f050 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
1f060 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70      pItem->isPop
1f070 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  ulated = 1;.    
1f080 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  }.    if( pParse
1f090 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
1f0a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1f0b0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
1f0c0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  end;.    }.    p
1f0d0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
1f0e0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
1f0f0 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20  xprHeight(p);.  
1f100 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
1f110 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49  pSrc;.    if( !I
1f120 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
1f130 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
1f140 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
1f150 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20  rderBy;.    }.  
1f160 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  }.  pEList = p->
1f170 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20  pEList;.#endif. 
1f180 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
1f190 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  ere;.  pGroupBy 
1f1a0 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
1f1b0 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
1f1c0 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74 69  aving;.  isDisti
1f1d0 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  nct = (p->selFla
1f1e0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1f1f0 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53  )!=0;..#ifndef S
1f200 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
1f210 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
1f220 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20  If there is are 
1f230 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75  a sequence of qu
1f240 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61  eries, do the ea
1f250 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74  rlier ones first
1f260 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1f270 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
1f280 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
1f290 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  =0 ){.      Sele
1f2a0 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67  ct *pLoop, *pRig
1f2b0 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  ht = 0;.      in
1f2c0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  t cnt = 0;.     
1f2d0 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a 20   int mxSelect;. 
1f2e0 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70       for(pLoop=p
1f2f0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
1f300 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e  Loop->pPrior, cn
1f310 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t++){.        pL
1f320 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  oop->pRightmost 
1f330 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  = p;.        pLo
1f340 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67  op->pNext = pRig
1f350 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67  ht;.        pRig
1f360 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20  ht = pLoop;.    
1f370 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c 65    }.      mxSele
1f380 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  ct = db->aLimit[
1f390 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
1f3a0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a 20  POUND_SELECT];. 
1f3b0 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65 63       if( mxSelec
1f3c0 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65 63  t && cnt>mxSelec
1f3d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1f3e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1f3f0 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74  rse, "too many t
1f400 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64  erms in compound
1f410 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20   SELECT");.     
1f420 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f430 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
1f440 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
1f450 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
1f460 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  st);.  }.#endif.
1f470 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
1f480 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
1f490 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
1f4a0 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
1f4b0 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
1f4c0 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66  output..  */.#if
1f4d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f4e0 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
1f4f0 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
1f500 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70  umnSelectError(p
1f510 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45  Parse, pDest, pE
1f520 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
1f530 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
1f540 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  end;.  }.#endif.
1f550 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c  .  /* If possibl
1f560 65 2c 20 72 65 77 72 69 74 65 20 74 68 65 20 71  e, rewrite the q
1f570 75 65 72 79 20 74 6f 20 75 73 65 20 47 52 4f 55  uery to use GROU
1f580 50 20 42 59 20 69 6e 73 74 65 61 64 20 6f 66 20  P BY instead of 
1f590 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a 20 47  DISTINCT..  ** G
1f5a0 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75 73  ROUP BY might us
1f5b0 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53 54  e an index, DIST
1f5c0 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73 2e  INCT never does.
1f5d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
1f5e0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1f5f0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1f600 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
1f610 6e 63 74 20 26 26 20 21 70 2d 3e 70 47 72 6f 75  nct && !p->pGrou
1f620 70 42 79 20 29 7b 0a 20 20 20 20 70 2d 3e 70 47  pBy ){.    p->pG
1f630 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
1f640 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
1f650 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  p->pEList, 0);. 
1f660 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
1f670 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
1f680 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
1f690 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  F_Distinct;.    
1f6a0 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  isDistinct = 0;.
1f6b0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1f6c0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
1f6d0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
1f6e0 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a  his sorting.  **
1f6f0 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
1f700 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64   up being unused
1f710 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
1f720 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63   be .  ** extrac
1f730 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
1f740 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61  d order.  If tha
1f750 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
1f760 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f  hen the.  ** OP_
1f770 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
1f780 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
1f790 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  e changed to an 
1f7a0 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a  OP_Noop once.  *
1f7b0 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  * we figure out 
1f7c0 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
1f7d0 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65   index is not ne
1f7e0 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53  eded.  The addrS
1f7f0 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61  ortIndex.  ** va
1f800 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
1f810 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61  o facilitate tha
1f820 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
1f830 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
1f840 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
1f850 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79  eyInfo;.    pKey
1f860 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
1f870 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
1f880 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  e, pOrderBy);.  
1f890 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
1f8a0 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
1f8b0 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64  Tab++;.    p->ad
1f8c0 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
1f8d0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
1f8e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f8f0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
1f900 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
1f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f920 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
1f930 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64  ->iECursor, pOrd
1f940 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30  erBy->nExpr+2, 0
1f950 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1f970 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
1f980 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
1f990 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f9a0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20  addrSortIndex = 
1f9b0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  -1;.  }..  /* If
1f9c0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
1f9d0 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
1f9e0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
1f9f0 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
1fa00 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
1fa10 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
1fa20 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  emTab ){.    sql
1fa30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1fa40 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
1fa50 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  al, pDest->iParm
1fa60 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
1fa70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
1fa80 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
1fa90 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  /.  iEnd = sqlit
1faa0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1fab0 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  v);.  computeLim
1fac0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
1fad0 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20  se, p, iEnd);.. 
1fae0 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75   /* Open a virtu
1faf0 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
1fb00 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
1fb10 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
1fb20 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20   isDistinct ){. 
1fb30 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
1fb40 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  Info;.    assert
1fb50 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75  ( isAgg || pGrou
1fb60 70 42 79 20 29 3b 0a 20 20 20 20 64 69 73 74 69  pBy );.    disti
1fb70 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
1fb80 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ab++;.    pKeyIn
1fb90 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
1fba0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1fbb0 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
1fbc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fbd0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
1fbe0 65 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e 63 74  emeral, distinct
1fbf0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
1fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc10 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
1fc20 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
1fc30 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OFF);.  }else{. 
1fc40 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31     distinct = -1
1fc50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72  ;.  }..  /* Aggr
1fc60 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67  egate and non-ag
1fc70 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
1fc80 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66  are handled diff
1fc90 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28  erently */.  if(
1fca0 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75   !isAgg && pGrou
1fcb0 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBy==0 ){.    /*
1fcc0 20 54 68 69 73 20 63 61 73 65 20 69 73 20 66 6f   This case is fo
1fcd0 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  r non-aggregate 
1fce0 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2a 20 42  queries.    ** B
1fcf0 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
1fd00 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20  e scan.    */.  
1fd10 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
1fd20 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
1fd30 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
1fd40 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79  Where, &pOrderBy
1fd50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
1fd60 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
1fd70 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
1fd80 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67     /* If sorting
1fd90 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20   index that was 
1fda0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69  created by a pri
1fdb0 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
1fdc0 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74  ral .    ** inst
1fdd0 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70  ruction ended up
1fde0 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65   not being neede
1fdf0 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74  d, then change t
1fe00 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
1fe10 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ral.    ** into 
1fe20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20  an OP_Noop..    
1fe30 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53  */.    if( addrS
1fe40 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70  ortIndex>=0 && p
1fe50 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
1fe60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1fe70 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
1fe80 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 31 29  ddrSortIndex, 1)
1fe90 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
1fea0 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
1feb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
1fec0 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
1fed0 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a  inner loop.    *
1fee0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 21 69 73  /.    assert(!is
1fef0 44 69 73 74 69 6e 63 74 29 3b 0a 20 20 20 20 73  Distinct);.    s
1ff00 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
1ff10 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
1ff20 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
1ff30 2c 20 2d 31 2c 20 70 44 65 73 74 2c 0a 20 20 20  , -1, pDest,.   
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff50 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
1ff60 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ue, pWInfo->iBre
1ff70 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64  ak);..    /* End
1ff80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1ff90 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
1ffa0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1ffb0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
1ffc0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
1ffd0 73 20 69 73 20 74 68 65 20 70 72 6f 63 65 73 73  s is the process
1ffe0 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
1fff0 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20  e queries */.   
20000 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
20010 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
20020 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73  text for process
20030 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e  ing aggregate in
20040 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
20050 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20   int iAMem;     
20060 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
20070 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74  m address for st
20080 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52  oring current GR
20090 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
200a0 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iBMem;        
200b0 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
200c0 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69  ddress for previ
200d0 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ous GROUP BY */.
200e0 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67      int iUseFlag
200f0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ;       /* Mem a
20100 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66  ddress holding f
20110 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lag indicating t
20120 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20  hat at least.   
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20140 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20       ** one row 
20150 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  of the input to 
20160 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68  the aggregator h
20170 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  as been.        
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20190 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ** processed */.
201a0 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c      int iAbortFl
201b0 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ag;     /* Mem a
201c0 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75  ddress which cau
201d0 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20  ses query abort 
201e0 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
201f0 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f     int groupBySo
20200 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63  rt;    /* Rows c
20210 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20  ome from source 
20220 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
20230 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
20240 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  rEnd;        /* 
20250 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e  End of processin
20260 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  g for this SELEC
20270 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  T */..    /* Rem
20280 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
20290 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
202a0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
202b0 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
202c0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
202d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
202e0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
202f0 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20310 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
20320 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
20330 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
20340 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
20350 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
20360 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
20370 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
20380 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
20390 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
203a0 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
203b0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
203c0 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20  pItem->iAlias = 
203d0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
203e0 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
203f0 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
20400 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
20410 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
20420 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41         pItem->iA
20430 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
20440 7d 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20 20 2f  }.    }.. .    /
20450 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c  * Create a label
20460 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e   to jump to when
20470 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72   we want to abor
20480 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  t the query */. 
20490 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c     addrEnd = sql
204a0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
204b0 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  l(v);..    /* Co
204c0 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20  nvert TK_COLUMN 
204d0 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47  nodes into TK_AG
204e0 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b  G_COLUMN and mak
204f0 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20  e entries in.   
20500 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72   ** sAggInfo for
20510 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43   all TK_AGG_FUNC
20520 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78  TION nodes in ex
20530 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
20540 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  .    ** SELECT s
20550 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
20560 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
20570 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
20580 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
20590 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
205a0 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
205b0 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43  TabList;.    sNC
205c0 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67  .pAggInfo = &sAg
205d0 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49  gInfo;.    sAggI
205e0 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
205f0 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
20600 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b  pGroupBy->nExpr+
20610 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49  1 : 0;.    sAggI
20620 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  nfo.pGroupBy = p
20630 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c  GroupBy;.    sql
20640 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
20650 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
20660 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
20670 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
20680 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72  ist(&sNC, pOrder
20690 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61  By);.    if( pHa
206a0 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  ving ){.      sq
206b0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
206c0 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
206d0 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
206e0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
206f0 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
20700 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
20710 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
20720 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
20730 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
20740 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
20750 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  ty(sAggInfo.aFun
20760 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78  c[i].pExpr, EP_x
20770 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
20780 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
20790 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
207a0 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
207b0 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c  c[i].pExpr->x.pL
207c0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
207d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
207e0 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
207f0 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
20800 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
20810 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
20820 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
20830 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
20840 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
20850 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
20860 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
20870 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
20880 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
20890 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
208a0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
208b0 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
208c0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
208d0 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
208e0 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20  .      int j1;  
208f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d             /* A-
20900 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
20910 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
20920 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
20930 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
20940 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
20950 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
20960 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
20970 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
20980 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
20990 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
209a0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
209b0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
209c0 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
209d0 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
209e0 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
209f0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
20a00 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
20a10 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
20a20 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
20a30 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
20a40 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
20a50 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
20a60 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
20a70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
20a80 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
20a90 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
20aa0 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
20ab0 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
20ac0 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
20ad0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
20ae0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
20af0 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
20b00 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
20b10 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
20b20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
20b30 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
20b40 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
20b50 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
20b60 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
20b70 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
20b80 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
20b90 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
20ba0 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
20bb0 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
20bc0 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e  er all, the Open
20bd0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
20be0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
20bf0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
20c00 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
20c10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
20c20 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
20c30 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
20c40 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
20c50 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
20c60 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
20c70 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  , pGroupBy);.   
20c80 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64     addrSortingId
20c90 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  x = sqlite3VdbeA
20ca0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
20cb0 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20  Ephemeral, .    
20cc0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
20cd0 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
20ce0 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
20cf0 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
20d00 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
20d10 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
20d20 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f  NDOFF);..      /
20d30 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
20d40 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73  ory locations us
20d50 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61  ed by GROUP BY a
20d60 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73  ggregate process
20d70 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ing.      */.   
20d80 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b     iUseFlag = ++
20d90 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
20da0 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d      iAbortFlag =
20db0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
20dc0 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75 74  .      regOutput
20dd0 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Row = ++pParse->
20de0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
20df0 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
20e00 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
20e10 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65  (v);.      regRe
20e20 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
20e30 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
20e40 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56  Reset = sqlite3V
20e50 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
20e60 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70  .      iAMem = p
20e70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
20e80 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
20e90 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
20ea0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42  >nExpr;.      iB
20eb0 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
20ec0 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
20ed0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
20ee0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
20ef0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20f00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
20f10 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46  eger, 0, iAbortF
20f20 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
20f30 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65  Comment((v, "cle
20f40 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ar abort flag"))
20f50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20f60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20f70 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65  Integer, 0, iUse
20f80 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
20f90 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
20fa0 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74  dicate accumulat
20fb0 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 0a 20 20  or empty"));..  
20fc0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
20fd0 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
20fe0 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
20ff0 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
21000 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
21010 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
21020 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
21030 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
21040 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
21050 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
21060 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
21070 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
21080 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
21090 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
210a0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
210b0 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
210c0 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
210d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
210e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
210f0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
21100 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
21110 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
21120 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
21130 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
21140 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
21150 47 72 6f 75 70 42 79 2c 20 30 2c 20 30 29 3b 0a  GroupBy, 0, 0);.
21160 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
21170 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
21180 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28  t_end;.      if(
21190 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
211a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
211b0 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65  ptimizer is able
211c0 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73   to deliver rows
211d0 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64   in group by ord
211e0 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a  er so.        **
211f0 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
21200 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50  to sort.  The OP
21210 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74  _OpenEphemeral t
21220 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  able will be.   
21230 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65       ** cancelle
21240 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20  d later because 
21250 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
21260 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66   use the pKeyInf
21270 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  o.        */.   
21280 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20       pGroupBy = 
21290 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
212a0 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
212b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
212c0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  e{.        /* Ro
212d0 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75  ws are coming ou
212e0 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65  t in undetermine
212f0 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76  d order.  We hav
21300 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20  e to push.      
21310 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e    ** each row in
21320 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
21330 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ex, terminate th
21340 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20  e first loop,.  
21350 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f        ** then lo
21360 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74  op over the sort
21370 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64  ing index in ord
21380 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75  er to get the ou
21390 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  tput.        ** 
213a0 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a  in sorted order.
213b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
213c0 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a     int regBase;.
213d0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52          int regR
213e0 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69  ecord;.        i
213f0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt nCol;.       
21400 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a   int nGroupBy;..
21410 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
21420 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
21430 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f   nGroupBy = pGro
21440 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
21450 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f       nCol = nGro
21460 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20  upBy + 1;.      
21470 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
21480 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
21490 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
214a0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
214b0 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
214c0 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
214d0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
214e0 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
214f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
21500 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
21510 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21520 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
21530 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
21540 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
21550 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
21560 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
21570 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
21580 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20  , regBase, 0);. 
21590 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
215a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
215b0 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66  equence, sAggInf
215c0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67  o.sortingIdx,reg
215d0 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a  Base+nGroupBy);.
215e0 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
215f0 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20  upBy+1;.        
21600 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
21610 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
21620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
21630 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
21640 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66  *pCol = &sAggInf
21650 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  o.aCol[i];.     
21660 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
21670 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
21680 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
21690 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42  nt r1 = j + regB
216a0 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ase;.           
216b0 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20   int r2;..      
216c0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
216d0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
216e0 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20  umn(pParse, .   
216f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21700 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
21710 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43  ->pTab, pCol->iC
21720 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61  olumn, pCol->iTa
21730 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20  ble, r1, 0);.   
21740 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31 21           if( r1!
21750 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =r2 ){.         
21760 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21770 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
21780 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20  py, r2, r1);.   
21790 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
217a0 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
217b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
217c0 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63  }.        regRec
217d0 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
217e0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
217f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21800 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
21810 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
21820 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52  Base, nCol, regR
21830 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
21840 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21850 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
21860 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
21870 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72  ingIdx, regRecor
21880 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
21890 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
218a0 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
218b0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
218c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
218d0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
218e0 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  gBase, nCol);.  
218f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
21900 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
21910 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21920 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
21930 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
21940 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
21950 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
21960 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
21970 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20  UP BY sort"));. 
21980 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
21990 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  useSortingIdx = 
219a0 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  1;.      }..    
219b0 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
219c0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
219d0 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
219e0 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
219f0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
21a00 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
21a10 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
21a20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
21a30 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
21a40 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
21a50 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
21a60 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
21a70 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
21a80 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
21a90 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
21aa0 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
21ab0 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
21ac0 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
21ad0 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
21ae0 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
21af0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
21b00 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
21b10 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
21b20 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
21b30 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
21b40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
21b50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
21b60 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41  v, OP_Column, sA
21b70 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
21b80 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  x, j, iBMem+j);.
21b90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21ba0 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
21bb0 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  o.directMode = 1
21bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
21bd0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
21be0 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
21bf0 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b  j].pExpr, iBMem+
21c00 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  j);.        }.  
21c10 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
21c20 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
21c30 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d   OP_Compare, iAM
21c40 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75  em, iBMem, pGrou
21c50 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  pBy->nExpr,.    
21c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c70 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
21c80 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
21c90 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73  O);.      j1 = s
21ca0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
21cb0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
21cc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21cd0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31  3(v, OP_Jump, j1
21ce0 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20  +1, 0, j1+1);.. 
21cf0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
21d00 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
21d10 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
21d20 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
21d30 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20       ** Changes 
21d40 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
21d50 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
21d60 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
21d70 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
21d80 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
21d90 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
21da0 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
21db0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
21dc0 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
21dd0 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
21de0 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
21df0 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
21e00 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
21e10 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
21e20 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
21e30 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
21e40 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
21e50 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
21e60 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
21e70 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
21e80 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
21e90 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
21ea0 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
21eb0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
21ec0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
21ed0 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d  arse, iBMem, iAM
21ee0 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
21ef0 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
21f00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21f10 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
21f20 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
21f30 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
21f40 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
21f50 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
21f60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21f70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21f80 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c  _IfPos, iAbortFl
21f90 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  ag, addrEnd);.  
21fa0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
21fb0 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74  (v, "check abort
21fc0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
21fd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21fe0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
21ff0 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
22000 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
22010 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65  omment((v, "rese
22020 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  t accumulator"))
22030 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
22040 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65  te the aggregate
22050 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61   accumulators ba
22060 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
22070 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  nt of.      ** t
22080 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20  he current row. 
22090 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
220a0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
220b0 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20  e(v, j1);.      
220c0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
220d0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
220e0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
220f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22100 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
22110 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
22120 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
22130 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20   "indicate data 
22140 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  in accumulator")
22150 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64  );..      /* End
22160 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20   of the loop.   
22170 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
22180 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
22190 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
221a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
221b0 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
221c0 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
221d0 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
221e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
221f0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
22200 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
22210 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
22220 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53  eToNoop(v, addrS
22230 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a 20  ortingIdx, 1);. 
22240 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
22250 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
22260 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
22270 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
22280 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22290 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
222a0 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
222b0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
222c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
222d0 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  , "output final 
222e0 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  row"));..      /
222f0 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  * Jump over the 
22300 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20  subroutines.    
22310 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
22320 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22330 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
22340 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  End);..      /* 
22350 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
22360 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
22370 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ts a single row 
22380 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
22390 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69      ** set.  Thi
223a0 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72  s subroutine fir
223b0 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  st looks at the 
223c0 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55  iUseFlag.  If iU
223d0 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  seFlag.      ** 
223e0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
223f0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
22400 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73  he subroutine is
22410 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20   a no-op.  If.  
22420 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
22430 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20  ssing calls for 
22440 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f  the query to abo
22450 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  rt, this subrout
22460 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ine.      ** inc
22470 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f  rements the iAbo
22480 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f  rtFlag memory lo
22490 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65  cation before re
224a0 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20  turning in.     
224b0 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67   ** order to sig
224c0 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  nal the caller t
224d0 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a  o abort..      *
224e0 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41  /.      addrSetA
224f0 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  bort = sqlite3Vd
22500 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
22510 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22520 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22530 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f  Integer, 1, iAbo
22540 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
22550 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
22560 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29  set abort flag")
22570 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22580 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
22590 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
225a0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71  utRow);.      sq
225b0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
225c0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74  Label(v, addrOut
225d0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61  putRow);.      a
225e0 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
225f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
22600 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
22610 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22620 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
22630 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
22640 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20  putRow+2);.     
22650 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
22660 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74   "Groupby result
22670 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79   generator entry
22680 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20   point"));.     
22690 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
226a0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
226b0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
226c0 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
226d0 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
226e0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
226f0 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67       if( pHaving
22700 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22710 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
22720 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
22730 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
22740 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
22750 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
22760 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
22770 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
22780 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70  >pEList, 0, 0, p
22790 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
227b0 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227d0 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
227e0 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62  Row+1, addrSetAb
227f0 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ort);.      sqli
22800 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
22810 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
22820 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
22830 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
22840 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65   "end groupby re
22850 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29  sult generator")
22860 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
22870 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
22880 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73  ne that will res
22890 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20  et the group-by 
228a0 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20  accumulator.    
228b0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
228c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
228d0 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29  el(v, addrReset)
228e0 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  ;.      resetAcc
228f0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
22900 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
22910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22920 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
22930 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20  n, regReset);.  
22940 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64     .    } /* end
22950 69 66 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20  if pGroupBy */. 
22960 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
22970 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d  ExprList *pDel =
22980 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
22990 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
229a0 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  NT.      Table *
229b0 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
229c0 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65  (pTab = isSimple
229d0 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e  Count(p, &sAggIn
229e0 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  fo))!=0 ){.     
229f0 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c     /* If isSimpl
22a00 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73  eCount() returns
22a10 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
22a20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c  Table structure,
22a30 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
22a40 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
22a50 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
22a60 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  m:.        **.  
22a70 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
22a80 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
22a90 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a  <tbl>.        **
22aa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72  .        ** wher
22ab0 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
22ac0 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72  cture returned r
22ad0 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20  epresents table 
22ae0 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a  <tbl>..        *
22af0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
22b00 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  s statement is s
22b10 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74  o common that it
22b20 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70   is optimized sp
22b30 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20  ecially. The.   
22b40 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74       ** OP_Count
22b50 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
22b60 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20  executed either 
22b70 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61  on the intkey ta
22b80 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  ble that.       
22b90 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
22ba0 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20   data for table 
22bb0 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20  <tbl> or on one 
22bc0 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20  of its indexes. 
22bd0 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  It.        ** is
22be0 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75   better to execu
22bf0 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20  te the op on an 
22c00 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65  index, as indexe
22c10 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20  s are almost.   
22c20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
22c30 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73  pread across les
22c40 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65  s pages than the
22c50 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ir corresponding
22c60 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20   tables..       
22c70 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
22c80 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69  t int iDb = sqli
22c90 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
22ca0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
22cb0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
22cc0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
22cd0 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Csr = pParse->nT
22ce0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72  ab++;     /* Cur
22cf0 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72  sor to scan b-tr
22d00 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ee */.        In
22d10 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
22d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d30 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
22d40 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
22d50 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
22d60 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Info = 0;       
22d70 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e          /* Keyin
22d80 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69  fo for scanned i
22d90 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
22da0 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
22db0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22dc0 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64       /* Best ind
22dd0 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20  ex found so far 
22de0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
22df0 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75  Root = pTab->tnu
22e00 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
22e10 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
22e20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a  scanned b-tree *
22e30 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  /..        sqlit
22e40 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
22e50 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
22e60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22e70 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
22e80 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
22e90 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
22ea0 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  e);..        /* 
22eb0 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69  Search for the i
22ec0 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68  ndex that has th
22ed0 65 20 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20 6f  e least amount o
22ee0 66 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20 20  f columns. If.  
22ef0 20 20 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69        ** there i
22f00 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2c  s such an index,
22f10 20 61 6e 64 20 69 74 20 68 61 73 20 6c 65 73 73   and it has less
22f20 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20 74 68   columns than th
22f30 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  e table.        
22f40 2a 2a 20 64 6f 65 73 2c 20 74 68 65 6e 20 77 65  ** does, then we
22f50 20 63 61 6e 20 61 73 73 75 6d 65 20 74 68 61 74   can assume that
22f60 20 69 74 20 63 6f 6e 73 75 6d 65 73 20 6c 65 73   it consumes les
22f70 73 20 73 70 61 63 65 20 6f 6e 20 64 69 73 6b 20  s space on disk 
22f80 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  and.        ** w
22f90 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65  ill therefore be
22fa0 20 63 68 65 61 70 65 72 20 74 6f 20 73 63 61 6e   cheaper to scan
22fb0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
22fc0 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a  e query result..
22fd0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68          ** In th
22fe0 69 73 20 63 61 73 65 20 73 65 74 20 69 52 6f 6f  is case set iRoo
22ff0 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
23000 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
23010 20 69 6e 64 65 78 20 62 2d 74 72 65 65 0a 20 20   index b-tree.  
23020 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 4b 65        ** and pKe
23030 79 49 6e 66 6f 20 74 6f 20 74 68 65 20 4b 65 79  yInfo to the Key
23040 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 72  Info structure r
23050 65 71 75 69 72 65 64 20 74 6f 20 6e 61 76 69 67  equired to navig
23060 61 74 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  ate the.        
23070 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ** index..      
23080 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
23090 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20  In practice the 
230a0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
230b0 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  e will not be us
230c0 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a  ed. It is only .
230d0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65          ** passe
230e0 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65  d to keep OP_Ope
230f0 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20  nRead happy..   
23100 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23110 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
23120 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
23130 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
23140 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
23150 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 6e 43  Best || pIdx->nC
23160 6f 6c 75 6d 6e 3c 70 42 65 73 74 2d 3e 6e 43 6f  olumn<pBest->nCo
23170 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
23180 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78      pBest = pIdx
23190 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
231a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
231b0 69 66 28 20 70 42 65 73 74 20 26 26 20 70 42 65  if( pBest && pBe
231c0 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 54 61 62  st->nColumn<pTab
231d0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
231e0 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73      iRoot = pBes
231f0 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  t->tnum;.       
23200 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
23210 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
23220 6f 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29  o(pParse, pBest)
23230 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
23240 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72       /* Open a r
23250 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
23260 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f   execute the OP_
23270 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65  Count, close the
23280 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20   cursor. */.    
23290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
232a0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
232b0 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f  Read, iCsr, iRoo
232c0 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  t, iDb);.       
232d0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
232e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
232f0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
23300 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b  , -1, (char *)pK
23310 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
23320 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
23330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
23340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23350 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43  (v, OP_Count, iC
23360 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  sr, sAggInfo.aFu
23370 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20  nc[0].iMem);.   
23380 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23390 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
233a0 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20  se, iCsr);.     
233b0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
233c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
233d0 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20  EECOUNT */.     
233e0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   {.        /* Ch
233f0 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79  eck if the query
23400 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
23410 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
23420 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
23430 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
23440 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e  T min(x) FROM ..
23450 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ..        **   S
23460 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
23470 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
23480 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69  .        ** If i
23490 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74  t is, then ask t
234a0 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  he code in where
234b0 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  .c to attempt to
234c0 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20   sort results.  
234d0 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74        ** as if t
234e0 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
234f0 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44  ER ON x" or "ORD
23500 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c  ER ON x DESC" cl
23510 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a  ause. .        *
23520 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20  * If where.c is 
23530 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20  able to produce 
23540 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69  results sorted i
23550 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68  n this order, th
23560 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  en.        ** ad
23570 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62  d vdbe code to b
23580 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
23590 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20  processing loop 
235a0 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20  after the .     
235b0 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72     ** first iter
235c0 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65  ation (since the
235d0 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
235e0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20   of the loop is 
235f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72  .        ** guar
23600 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74  anteed to operat
23610 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74  e on the row wit
23620 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72  h the minimum or
23630 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20   maximum .      
23640 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c    ** value of x,
23650 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65   the only row re
23660 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20  quired)..       
23670 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
23680 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75   special flag mu
23690 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  st be passed to 
236a0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
236b0 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a  n() to slightly.
236c0 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
236d0 79 20 62 65 68 61 76 69 6f 75 72 20 61 73 20 66  y behaviour as f
236e0 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20  ollows:.        
236f0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
23700 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  + If the query i
23710 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28  s a "SELECT min(
23720 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  x)", then the lo
23730 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20  op coded by.    
23740 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65      **     where
23750 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74  .c should not it
23760 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76  erate over any v
23770 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c  alues with a NUL
23780 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  L value.        
23790 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20  **     for x..  
237a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
237b0 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69   **   + The opti
237c0 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68  mizer code in wh
237d0 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67  ere.c (the thing
237e0 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68   that decides wh
237f0 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ich.        **  
23800 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69     index or indi
23810 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75  ces to use) shou
23820 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65  ld place a diffe
23830 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e  rent priority on
23840 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20   .        **    
23850 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20   satisfying the 
23860 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73  'ORDER BY' claus
23870 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69  e than it does i
23880 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20  n other cases.. 
23890 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65         **     Re
238a0 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20  fer to code and 
238b0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72  comments in wher
238c0 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  e.c for details.
238d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
238e0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d      ExprList *pM
238f0 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20  inMax = 0;.     
23900 20 20 20 75 38 20 66 6c 61 67 20 3d 20 6d 69 6e     u8 flag = min
23910 4d 61 78 51 75 65 72 79 28 70 29 3b 0a 20 20 20  MaxQuery(p);.   
23920 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b       if( flag ){
23930 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
23940 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
23950 72 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  rty(p->pEList->a
23960 5b 30 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49  [0].pExpr, EP_xI
23970 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
23980 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20        pMinMax = 
23990 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
239a0 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
239b0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 78 2e  ->a[0].pExpr->x.
239c0 70 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20 20 20  pList,0);.      
239d0 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d      pDel = pMinM
239e0 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ax;.          if
239f0 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62  ( pMinMax && !db
23a00 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
23a10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  {.            pM
23a20 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74  inMax->a[0].sort
23a30 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48  Order = flag!=WH
23a40 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
23a50 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20  ?1:0;.          
23a60 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
23a70 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
23a80 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
23a90 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a   }.        }.  .
23aa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
23ab0 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65  case runs if the
23ac0 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e   aggregate has n
23ad0 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
23ae0 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20  e.  The.        
23af0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ** processing is
23b00 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69   much simpler si
23b10 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  nce there is onl
23b20 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20  y a single row. 
23b30 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74         ** of out
23b40 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  put..        */.
23b50 20 20 20 20 20 20 20 20 72 65 73 65 74 41 63 63          resetAcc
23b60 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
23b70 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
23b80 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
23b90 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
23ba0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
23bb0 2c 20 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d  , pWhere, &pMinM
23bc0 61 78 2c 20 66 6c 61 67 2c 20 30 29 3b 0a 20 20  ax, flag, 0);.  
23bd0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
23be0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
23bf0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
23c00 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
23c10 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
23c20 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
23c30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
23c40 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
23c50 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
23c60 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fo);.        if(
23c70 20 21 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c 61   !pMinMax && fla
23c80 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  g ){.          s
23c90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23ca0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
23cb0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
23cc0 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
23cd0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29  omment((v, "%s()
23ce0 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20   by index",.    
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61              (fla
23d00 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g==WHERE_ORDERBY
23d10 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22  _MIN?"min":"max"
23d20 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  )));.        }. 
23d30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
23d40 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
23d50 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65          finalize
23d60 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
23d70 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
23d80 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
23d90 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
23da0 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
23db0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23dc0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
23dd0 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
23de0 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a  ddrEnd, SQLITE_J
23df0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
23e00 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74    }.      select
23e10 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
23e20 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
23e30 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20  0, 0, 0, -1, .  
23e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e50 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45      pDest, addrE
23e60 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  nd, addrEnd);.  
23e70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
23e80 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
23e90 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  el);.    }.    s
23ea0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
23eb0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
23ec0 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
23ed0 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
23ee0 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49  query */..  /* I
23ef0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
23f00 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
23f10 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
23f20 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
23f30 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
23f40 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
23f50 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
23f60 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
23f70 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  By ){.    genera
23f80 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
23f90 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d  e, p, v, pEList-
23fa0 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
23fb0 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68    }..  /* Jump h
23fc0 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73  ere to skip this
23fd0 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71   query.  */.  sq
23fe0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
23ff0 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a  Label(v, iEnd);.
24000 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
24010 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
24020 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
24030 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
24040 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
24050 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
24060 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
24070 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
24080 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
24090 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
240a0 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
240b0 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
240c0 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
240d0 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
240e0 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f  select_end:..  /
240f0 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
24100 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c  n names if resul
24110 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
24120 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75   are to be outpu
24130 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  t..  */.  if( rc
24140 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
24150 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
24160 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67  _Output ){.    g
24170 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
24180 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
24190 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
241a0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  }..  sqlite3DbFr
241b0 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
241c0 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
241d0 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49  DbFree(db, sAggI
241e0 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65  nfo.aFunc);.  re
241f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
24200 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
24210 45 42 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a  EBUG)./*.*******
24220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24260 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
24270 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69  following code i
24280 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
24290 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
242a0 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 64 65   only.  The code
242b0 0a 2a 2a 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  .** that follows
242c0 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
242d0 20 69 6e 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64   in normal build
242e0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  s..**.** These r
242f0 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
24300 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 74 68   to print out th
24310 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c  e content of all
24320 20 6f 72 20 70 61 72 74 20 6f 66 20 61 20 0a 2a   or part of a .*
24330 2a 20 70 61 72 73 65 20 73 74 72 75 63 74 75 72  * parse structur
24340 65 73 20 73 75 63 68 20 61 73 20 53 65 6c 65 63  es such as Selec
24350 74 20 6f 72 20 45 78 70 72 2e 20 20 53 75 63 68  t or Expr.  Such
24360 20 70 72 69 6e 74 6f 75 74 73 20 61 72 65 20 75   printouts are u
24370 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c  seful.** for hel
24380 70 69 6e 67 20 74 6f 20 75 6e 64 65 72 73 74 61  ping to understa
24390 6e 64 20 77 68 61 74 20 69 73 20 68 61 70 70 65  nd what is happe
243a0 6e 69 6e 67 20 69 6e 73 69 64 65 20 74 68 65 20  ning inside the 
243b0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a  code generator.*
243c0 2a 20 64 75 72 69 6e 67 20 74 68 65 20 65 78 65  * during the exe
243d0 63 75 74 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65  cution of comple
243e0 78 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  x SELECT stateme
243f0 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  nts..**.** These
24400 20 72 6f 75 74 69 6e 65 20 61 72 65 20 6e 6f 74   routine are not
24410 20 63 61 6c 6c 65 64 20 61 6e 79 77 68 65 72 65   called anywhere
24420 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
24430 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20   normal.** code 
24440 62 61 73 65 2e 20 20 54 68 65 6e 20 61 72 65 20  base.  Then are 
24450 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 63  intended to be c
24460 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
24470 6e 20 74 68 65 20 64 65 62 75 67 67 65 72 0a 2a  n the debugger.*
24480 2a 20 6f 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72  * or from tempor
24490 61 72 79 20 22 70 72 69 6e 74 66 22 20 73 74 61  ary "printf" sta
244a0 74 65 6d 65 6e 74 73 20 69 6e 73 65 72 74 65 64  tements inserted
244b0 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a   for debugging..
244c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
244d0 72 69 6e 74 45 78 70 72 28 45 78 70 72 20 2a 70  rintExpr(Expr *p
244e0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  ){.  if( p->toke
244f0 6e 2e 7a 20 26 26 20 70 2d 3e 74 6f 6b 65 6e 2e  n.z && p->token.
24500 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  n>0 ){.    sqlit
24510 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
24520 25 2e 2a 73 22 2c 20 70 2d 3e 74 6f 6b 65 6e 2e  %.*s", p->token.
24530 6e 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a  n, p->token.z);.
24540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
24550 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24560 22 28 25 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20  "(%d", p->op);. 
24570 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66   }.  if( p->pLef
24580 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
24590 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29  DebugPrintf(" ")
245a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
245b0 6e 74 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 29  ntExpr(p->pLeft)
245c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
245d0 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  Right ){.    sql
245e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
245f0 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  " ");.    sqlite
24600 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 52  3PrintExpr(p->pR
24610 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ight);.  }.  sql
24620 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24630 22 29 22 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ")");.}.void sql
24640 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
24650 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t(ExprList *pLis
24660 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  t){.  int i;.  f
24670 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
24680 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
24690 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
246a0 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pr(pList->a[i].p
246b0 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 69  Expr);.    if( i
246c0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20  <pList->nExpr-1 
246d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
246e0 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20 22  DebugPrintf(", "
246f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76  );.    }.  }.}.v
24700 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
24710 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70  Select(Select *p
24720 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20  , int indent){. 
24730 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24740 6e 74 66 28 22 25 2a 73 53 45 4c 45 43 54 28 25  ntf("%*sSELECT(%
24750 70 29 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  p) ", indent, ""
24760 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  , p);.  sqlite3P
24770 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  rintExprList(p->
24780 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
24790 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
247a0 6e 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  n");.  if( p->pS
247b0 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  rc ){.    char *
247c0 7a 50 72 65 66 69 78 3b 0a 20 20 20 20 69 6e 74  zPrefix;.    int
247d0 20 69 3b 0a 20 20 20 20 7a 50 72 65 66 69 78 20   i;.    zPrefix 
247e0 3d 20 22 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f  = "FROM";.    fo
247f0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63  r(i=0; i<p->pSrc
24800 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
24810 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
24820 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
24830 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b   &p->pSrc->a[i];
24840 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
24850 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 22  bugPrintf("%*s "
24860 2c 20 69 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65  , indent+6, zPre
24870 66 69 78 29 3b 0a 20 20 20 20 20 20 7a 50 72 65  fix);.      zPre
24880 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  fix = "";.      
24890 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
248a0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
248b0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
248c0 28 22 28 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ("(\n");.       
248d0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c   sqlite3PrintSel
248e0 65 63 74 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65  ect(pItem->pSele
248f0 63 74 2c 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a  ct, indent+10);.
24900 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
24910 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 29  ebugPrintf("%*s)
24920 22 2c 20 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29  ", indent+8, "")
24930 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
24940 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29  ( pItem->zName )
24950 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24960 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73  3DebugPrintf("%s
24970 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ", pItem->zName)
24980 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24990 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20  if( pItem->pTab 
249a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
249b0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
249c0 74 61 62 6c 65 3a 20 25 73 29 22 2c 20 70 49 74  table: %s)", pIt
249d0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
249e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
249f0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
24a00 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
24a10 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24a20 22 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d  " AS %s", pItem-
24a30 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  >zAlias);.      
24a40 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70 2d  }.      if( i<p-
24a50 3e 70 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b  >pSrc->nSrc-1 ){
24a60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24a70 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 22 29  DebugPrintf(",")
24a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24a90 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24aa0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  tf("\n");.    }.
24ab0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68    }.  if( p->pWh
24ac0 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ere ){.    sqlit
24ad0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
24ae0 2a 73 20 57 48 45 52 45 20 22 2c 20 69 6e 64 65  *s WHERE ", inde
24af0 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
24b00 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
24b10 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
24b20 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24b30 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ("\n");.  }.  if
24b40 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  ( p->pGroupBy ){
24b50 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
24b60 67 50 72 69 6e 74 66 28 22 25 2a 73 20 47 52 4f  gPrintf("%*s GRO
24b70 55 50 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c  UP BY ", indent,
24b80 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
24b90 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70  3PrintExprList(p
24ba0 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
24bb0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24bc0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
24bd0 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20   if( p->pHaving 
24be0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
24bf0 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 48  bugPrintf("%*s H
24c00 41 56 49 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c  AVING ", indent,
24c10 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
24c20 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 48  3PrintExpr(p->pH
24c30 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
24c40 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24c50 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
24c60 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
24c70 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24c80 72 69 6e 74 66 28 22 25 2a 73 20 4f 52 44 45 52  rintf("%*s ORDER
24c90 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22   BY ", indent, "
24ca0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
24cb0 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  rintExprList(p->
24cc0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73  pOrderBy);.    s
24cd0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24ce0 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f  f("\n");.  }.}./
24cf0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72  * End of the str
24d00 75 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69  ucture debug pri
24d10 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a  nting code.*****
24d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d60 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
24d70 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
24d80 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
24d90 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
24da0 29 20 2a 2f 0a                                   ) */.