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

Artifact c1899b14f5eb3d3b71aeb02d541d6c5052ad3b70:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 34 36 33  select.c,v 1.463
0200: 20 32 30 30 38 2f 30 38 2f 30 34 20 30 33 3a 35   2008/08/04 03:5
0210: 31 3a 32 34 20 64 61 6e 69 65 6c 6b 31 39 37 37  1:24 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 65 44  Dest->eDest = eD
04c0: 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 50  est;.  pDest->iP
04d0: 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70  arm = iParm;.  p
04e0: 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Dest->affinity =
04f0: 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65   0;.  pDest->iMe
0500: 6d 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e  m = 0;.  pDest->
0510: 6e 4d 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a  nMem = 0;.}.../*
0520: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
0530: 65 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  ew Select struct
0540: 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ure and return a
0550: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74   pointer to that
0560: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
0570: 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  /.Select *sqlite
0580: 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61  3SelectNew(.  Pa
0590: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
05a0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
05b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
05c0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
05d0: 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d    /* which colum
05e0: 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e  ns to include in
05f0: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20   the result */. 
0600: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
0610: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
0620: 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69  OM clause -- whi
0630: 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61  ch tables to sca
0640: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  n */.  Expr *pWh
0650: 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
0660: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
0670: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
0680: 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74  pGroupBy,   /* t
0690: 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
06a0: 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  se */.  Expr *pH
06b0: 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a  aving,        /*
06c0: 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
06d0: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
06e0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
06f0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
0700: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ause */.  int is
0710: 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20  Distinct,       
0720: 2f 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44  /* true if the D
0730: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0740: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0750: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20  Expr *pLimit,   
0760: 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76        /* LIMIT v
0770: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0780: 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  s not used */.  
0790: 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20  Expr *pOffset   
07a0: 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20        /* OFFSET 
07b0: 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61  value.  NULL mea
07c0: 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a  ns no offset */.
07d0: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  ){.  Select *pNe
07e0: 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e  w;.  Select stan
07f0: 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  din;.  sqlite3 *
0800: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0810: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0820: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
0830: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
0840: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4f  );.  assert( !pO
0850: 66 66 73 65 74 20 7c 7c 20 70 4c 69 6d 69 74 20  ffset || pLimit 
0860: 29 3b 20 20 20 2f 2a 20 43 61 6e 27 74 20 68 61  );   /* Can't ha
0870: 76 65 20 4f 46 46 53 45 54 20 77 69 74 68 6f 75  ve OFFSET withou
0880: 74 20 4c 49 4d 49 54 2e 20 2a 2f 0a 20 20 69 66  t LIMIT. */.  if
0890: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
08a0: 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64 69 6e   pNew = &standin
08b0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  ;.    memset(pNe
08c0: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w, 0, sizeof(*pN
08d0: 65 77 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ew));.  }.  if( 
08e0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
08f0: 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   pEList = sqlite
0900: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
0910: 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74  pParse, 0, sqlit
0920: 65 33 45 78 70 72 28 64 62 2c 54 4b 5f 41 4c 4c  e3Expr(db,TK_ALL
0930: 2c 30 2c 30 2c 30 29 2c 20 30 29 3b 0a 20 20 7d  ,0,0,0), 0);.  }
0940: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
0950: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77  = pEList;.  pNew
0960: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0970: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
0980: 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e  pWhere;.  pNew->
0990: 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
09a0: 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  pBy;.  pNew->pHa
09b0: 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a  ving = pHaving;.
09c0: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
09d0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
09e0: 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  New->isDistinct 
09f0: 3d 20 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  = isDistinct;.  
0a00: 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  pNew->op = TK_SE
0a10: 4c 45 43 54 3b 0a 20 20 61 73 73 65 72 74 28 20  LECT;.  assert( 
0a20: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c  pOffset==0 || pL
0a30: 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65  imit!=0 );.  pNe
0a40: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  w->pLimit = pLim
0a50: 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66  it;.  pNew->pOff
0a60: 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
0a70: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
0a80: 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[0] = -1;.  p
0a90: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
0aa0: 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[1] = -1;.  pNe
0ab0: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
0ac0: 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70  2] = -1;.  if( p
0ad0: 4e 65 77 3d 3d 26 73 74 61 6e 64 69 6e 29 20 7b  New==&standin) {
0ae0: 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74  .    clearSelect
0af0: 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (db, pNew);.    
0b00: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pNew = 0;.  }.  
0b10: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
0b20: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
0b30: 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74   given Select st
0b40: 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20  ructure and all 
0b50: 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63 74  of its substruct
0b60: 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ures..*/.void sq
0b70: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
0b80: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  e(sqlite3 *db, S
0b90: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28  elect *p){.  if(
0ba0: 20 70 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 53   p ){.    clearS
0bb0: 65 6c 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20  elect(db, p);.  
0bc0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
0bd0: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  db, p);.  }.}../
0be0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20  *.** Given 1 to 
0bf0: 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70 72  3 identifiers pr
0c00: 65 63 65 65 64 69 6e 67 20 74 68 65 20 4a 4f 49  eceeding the JOI
0c10: 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72  N keyword, deter
0c20: 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65  mine the.** type
0c30: 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72   of join.  Retur
0c40: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  n an integer con
0c50: 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65  stant that expre
0c60: 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a  sses that type.*
0c70: 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  * in terms of th
0c80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20  e following bit 
0c90: 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  values:.**.**   
0ca0: 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20    JT_INNER.**   
0cb0: 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20    JT_CROSS.**   
0cc0: 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20    JT_OUTER.**   
0cd0: 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20    JT_NATURAL.** 
0ce0: 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20      JT_LEFT.**  
0cf0: 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a     JT_RIGHT.**.*
0d00: 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a  * A full outer j
0d10: 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69  oin is the combi
0d20: 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46  nation of JT_LEF
0d30: 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a  T and JT_RIGHT..
0d40: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65  **.** If an ille
0d50: 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  gal or unsupport
0d60: 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20  ed join type is 
0d70: 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c  seen, then still
0d80: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69   return.** a joi
0d90: 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20  n type, but put 
0da0: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
0db0: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0dc0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0dd0: 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a  JoinType(Parse *
0de0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
0df0: 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f  A, Token *pB, To
0e00: 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20  ken *pC){.  int 
0e10: 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
0e20: 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b  Token *apAll[3];
0e30: 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73  .  Token *p;.  s
0e40: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
0e50: 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
0e60: 68 61 72 20 7a 4b 65 79 77 6f 72 64 5b 38 5d 3b  har zKeyword[8];
0e70: 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b 0a 20  .    u8 nChar;. 
0e80: 20 20 20 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20     u8 code;.  } 
0e90: 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20  keywords[] = {. 
0ea0: 20 20 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20     { "natural", 
0eb0: 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c  7, JT_NATURAL },
0ec0: 0a 20 20 20 20 7b 20 22 6c 65 66 74 22 2c 20 20  .    { "left",  
0ed0: 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f    4, JT_LEFT|JT_
0ee0: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0ef0: 72 69 67 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f  right",   5, JT_
0f00: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
0f10: 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20  ,.    { "full", 
0f20: 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54     4, JT_LEFT|JT
0f30: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
0f40: 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65 72 22  },.    { "outer"
0f50: 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20  ,   5, JT_OUTER 
0f60: 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72 22  },.    { "inner"
0f70: 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20  ,   5, JT_INNER 
0f80: 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73 73 22  },.    { "cross"
0f90: 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c  ,   5, JT_INNER|
0fa0: 4a 54 5f 43 52 4f 53 53 20 7d 2c 0a 20 20 7d 3b  JT_CROSS },.  };
0fb0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61  .  int i, j;.  a
0fc0: 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20  pAll[0] = pA;.  
0fd0: 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20  apAll[1] = pB;. 
0fe0: 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a   apAll[2] = pC;.
0ff0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26    for(i=0; i<3 &
1000: 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29  & apAll[i]; i++)
1010: 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b  {.    p = apAll[
1020: 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  i];.    for(j=0;
1030: 20 6a 3c 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72   j<sizeof(keywor
1040: 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f  ds)/sizeof(keywo
1050: 72 64 73 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a 20  rds[0]); j++){. 
1060: 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 6b       if( p->n==k
1070: 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61 72  eywords[j].nChar
1080: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73   .          && s
1090: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28  qlite3StrNICmp((
10a0: 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 6b 65 79 77  char*)p->z, keyw
10b0: 6f 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64  ords[j].zKeyword
10c0: 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20  , p->n)==0 ){.  
10d0: 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c        jointype |
10e0: 3d 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f  = keywords[j].co
10f0: 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  de;.        brea
1100: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1110: 0a 20 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65  .    if( j>=size
1120: 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a  of(keywords)/siz
1130: 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29  eof(keywords[0])
1140: 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   ){.      jointy
1150: 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a  pe |= JT_ERROR;.
1160: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1170: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20   }.  }.  if(.   
1180: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a    (jointype & (J
1190: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
11a0: 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  ))==(JT_INNER|JT
11b0: 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20  _OUTER) ||.     
11c0: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45  (jointype & JT_E
11d0: 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RROR)!=0.  ){.  
11e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
11f0: 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73  p = " ";.    ass
1200: 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20  ert( pB!=0 );.  
1210: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
1220: 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69  Sp++; }.    sqli
1230: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1240: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20  se, "unknown or 
1250: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1260: 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20   type: ".       
1270: 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c  "%T %T%s%T", pA,
1280: 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20   pB, zSp, pC);. 
1290: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
12a0: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20  _INNER;.  }else 
12b0: 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a  if( jointype & J
12c0: 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20 73  T_RIGHT ){.    s
12d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12e0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52  Parse, .      "R
12f0: 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55  IGHT and FULL OU
1300: 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f  TER JOINs are no
1310: 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70  t currently supp
1320: 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69  orted");.    joi
1330: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
1340: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
1350: 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ointype;.}../*.*
1360: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
1370: 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69  ex of a column i
1380: 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75  n a table.  Retu
1390: 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c  rn -1 if the col
13a0: 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  umn.** is not co
13b0: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74  ntained in the t
13c0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
13d0: 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  int columnIndex(
13e0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e  Table *pTab, con
13f0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a  st char *zCol){.
1400: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1410: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
1420: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1430: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1440: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
1450: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72  me, zCol)==0 ) r
1460: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
1470: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
1480: 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
1490: 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f 20 61   of a token to a
14a0: 20 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e 61 74   '\000'-terminat
14b0: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  ed string..*/.st
14c0: 61 74 69 63 20 76 6f 69 64 20 73 65 74 54 6f 6b  atic void setTok
14d0: 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e  en(Token *p, con
14e0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 70  st char *z){.  p
14f0: 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a 20 20  ->z = (u8*)z;.  
1500: 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65  p->n = z ? strle
1510: 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 70 2d 3e 64  n(z) : 0;.  p->d
1520: 79 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  yn = 0;.}../*.**
1530: 20 53 65 74 20 74 68 65 20 74 6f 6b 65 6e 20 74   Set the token t
1540: 6f 20 74 68 65 20 64 6f 75 62 6c 65 2d 71 75 6f  o the double-quo
1550: 74 65 64 20 61 6e 64 20 65 73 63 61 70 65 64 20  ted and escaped 
1560: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  version of the s
1570: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 0a 2a 2a  tring pointed.**
1580: 20 74 6f 20 62 79 20 7a 2e 20 46 6f 72 20 65 78   to by z. For ex
1590: 61 6d 70 6c 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 20  ample;.**.**    
15a0: 7b 61 22 62 63 7d 20 20 2d 3e 20 20 7b 22 61 22  {a"bc}  ->  {"a"
15b0: 22 62 63 22 7d 0a 2a 2f 0a 73 74 61 74 69 63 20  "bc"}.*/.static 
15c0: 76 6f 69 64 20 73 65 74 51 75 6f 74 65 64 54 6f  void setQuotedTo
15d0: 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ken(Parse *pPars
15e0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e  e, Token *p, con
15f0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 0a 20 20  st char *z){..  
1600: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
1610: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20  string contains 
1620: 61 6e 79 20 22 20 63 68 61 72 61 63 74 65 72 73  any " characters
1630: 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68  . If it does, th
1640: 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  en.  ** this fun
1650: 63 74 69 6f 6e 20 77 69 6c 6c 20 6d 61 6c 6c 6f  ction will mallo
1660: 63 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74  c space to creat
1670: 65 20 61 20 71 75 6f 74 65 64 20 76 65 72 73 69  e a quoted versi
1680: 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  on of.  ** the s
1690: 74 72 69 6e 67 20 69 6e 2e 20 4f 74 68 65 72 77  tring in. Otherw
16a0: 69 73 65 2c 20 73 61 76 65 20 61 20 63 61 6c 6c  ise, save a call
16b0: 20 74 6f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e   to sqlite3MPrin
16c0: 74 66 28 29 20 62 79 0a 20 20 2a 2a 20 6a 75 73  tf() by.  ** jus
16d0: 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 6f  t copying the po
16e0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 72  inter to the str
16f0: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73  ing..  */.  cons
1700: 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a  t char *z2 = z;.
1710: 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 0a    while( *z2 ){.
1720: 20 20 20 20 69 66 28 20 2a 7a 32 3d 3d 27 22 27      if( *z2=='"'
1730: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 32   ) break;.    z2
1740: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 2a  ++;.  }..  if( *
1750: 7a 32 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 72  z2 ){.    /* Str
1760: 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 22 20 63  ing contains " c
1770: 68 61 72 61 63 74 65 72 73 20 2d 20 63 6f 70 79  haracters - copy
1780: 20 61 6e 64 20 71 75 6f 74 65 20 74 68 65 20 73   and quote the s
1790: 74 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 70 2d  tring. */.    p-
17a0: 3e 7a 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  >z = (u8 *)sqlit
17b0: 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
17c0: 2d 3e 64 62 2c 20 22 5c 22 25 77 5c 22 22 2c 20  ->db, "\"%w\"", 
17d0: 7a 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a  z);.    if( p->z
17e0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 20 3d   ){.      p->n =
17f0: 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29   strlen((char *)
1800: 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 2d 3e  p->z);.      p->
1810: 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  dyn = 1;.    }. 
1820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53   }else{.    /* S
1830: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 6e  tring contains n
1840: 6f 20 22 20 63 68 61 72 61 63 74 65 72 73 20 2d  o " characters -
1850: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
1860: 72 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 7a 20 3d  r. */.    p->z =
1870: 20 28 75 38 2a 29 7a 3b 0a 20 20 20 20 70 2d 3e   (u8*)z;.    p->
1880: 6e 20 3d 20 28 7a 32 20 2d 20 7a 29 3b 0a 20 20  n = (z2 - z);.  
1890: 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 20 20    p->dyn = 0;.  
18a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  }.}../*.** Creat
18b0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
18c0: 6e 6f 64 65 20 66 6f 72 20 61 6e 20 69 64 65 6e  node for an iden
18d0: 74 69 66 69 65 72 20 77 69 74 68 20 74 68 65 20  tifier with the 
18e0: 6e 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f  name of zName.*/
18f0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 43 72  .Expr *sqlite3Cr
1900: 65 61 74 65 49 64 45 78 70 72 28 50 61 72 73 65  eateIdExpr(Parse
1910: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
1920: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1930: 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 73  Token dummy;.  s
1940: 65 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20  etToken(&dummy, 
1950: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
1960: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
1970: 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20  arse, TK_ID, 0, 
1980: 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 2f  0, &dummy);.}../
1990: 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20  *.** Add a term 
19a0: 74 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70  to the WHERE exp
19b0: 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78  ression in *ppEx
19c0: 70 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  pr that requires
19d0: 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c   the.** zCol col
19e0: 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20  umn to be equal 
19f0: 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  in the two table
1a00: 73 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62  s pTab1 and pTab
1a10: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
1a20: 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a  d addWhereTerm(.
1a30: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1a50: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1a60: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a70: 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Col,        /* N
1a80: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
1a90: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62  n */.  const Tab
1aa0: 6c 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20  le *pTab1,      
1ab0: 2f 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a  /* First table *
1ac0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1ad0: 7a 41 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a 20  zAlias1,     /* 
1ae0: 41 6c 69 61 73 20 66 6f 72 20 66 69 72 73 74 20  Alias for first 
1af0: 74 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e  table.  May be N
1b00: 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  ULL */.  const T
1b10: 61 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20  able *pTab2,    
1b20: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c    /* Second tabl
1b30: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1b40: 72 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20 20  r *zAlias2,     
1b50: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 73 65 63  /* Alias for sec
1b60: 6f 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61 79 20  ond table.  May 
1b70: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
1b80: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
1b90: 2c 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75  ,     /* VDBE cu
1ba0: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 72 69 67  rsor for the rig
1bb0: 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ht table */.  Ex
1bc0: 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20  pr **ppExpr,    
1bd0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1be0: 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
1bf0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
1c00: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75  on */.  int isOu
1c10: 74 65 72 4a 6f 69 6e 20 20 20 20 20 20 20 20 20  terJoin         
1c20: 20 2f 2a 20 54 72 75 65 20 69 66 20 64 65 61 6c   /* True if deal
1c30: 69 6e 67 20 77 69 74 68 20 61 6e 20 4f 55 54 45  ing with an OUTE
1c40: 52 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 45  R join */.){.  E
1c50: 78 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62  xpr *pE1a, *pE1b
1c60: 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20  , *pE1c;.  Expr 
1c70: 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70  *pE2a, *pE2b, *p
1c80: 45 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b  E2c;.  Expr *pE;
1c90: 0a 0a 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74  ..  pE1a = sqlit
1ca0: 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70  e3CreateIdExpr(p
1cb0: 50 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20  Parse, zCol);.  
1cc0: 70 45 32 61 20 3d 20 73 71 6c 69 74 65 33 43 72  pE2a = sqlite3Cr
1cd0: 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73  eateIdExpr(pPars
1ce0: 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20  e, zCol);.  if( 
1cf0: 7a 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20  zAlias1==0 ){.  
1d00: 20 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61 62    zAlias1 = pTab
1d10: 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20  1->zName;.  }.  
1d20: 70 45 31 62 20 3d 20 73 71 6c 69 74 65 33 43 72  pE1b = sqlite3Cr
1d30: 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73  eateIdExpr(pPars
1d40: 65 2c 20 7a 41 6c 69 61 73 31 29 3b 0a 20 20 69  e, zAlias1);.  i
1d50: 66 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29 7b  f( zAlias2==0 ){
1d60: 0a 20 20 20 20 7a 41 6c 69 61 73 32 20 3d 20 70  .    zAlias2 = p
1d70: 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d  Tab2->zName;.  }
1d80: 0a 20 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65  .  pE2b = sqlite
1d90: 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50  3CreateIdExpr(pP
1da0: 61 72 73 65 2c 20 7a 41 6c 69 61 73 32 29 3b 0a  arse, zAlias2);.
1db0: 20 20 70 45 31 63 20 3d 20 73 71 6c 69 74 65 33    pE1c = sqlite3
1dc0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
1dd0: 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61  _DOT, pE1b, pE1a
1de0: 2c 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73  , 0);.  pE2c = s
1df0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1e00: 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 32 62  se, TK_DOT, pE2b
1e10: 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45  , pE2a, 0);.  pE
1e20: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1e30: 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70  pParse, TK_EQ, p
1e40: 45 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20  E1c, pE2c, 0);. 
1e50: 20 69 66 28 20 70 45 20 26 26 20 69 73 4f 75 74   if( pE && isOut
1e60: 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78  erJoin ){.    Ex
1e70: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
1e80: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
1e90: 20 20 20 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f      pE->iRightJo
1ea0: 69 6e 54 61 62 6c 65 20 3d 20 69 52 69 67 68 74  inTable = iRight
1eb0: 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  JoinTable;.  }. 
1ec0: 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74   *ppExpr = sqlit
1ed0: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
1ee0: 2d 3e 64 62 2c 2a 70 70 45 78 70 72 2c 20 70 45  ->db,*ppExpr, pE
1ef0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
1f00: 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
1f10: 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20  property on all 
1f20: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76  terms of the giv
1f30: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  en expression..*
1f40: 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78  * And set the Ex
1f50: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
1f60: 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72  le to iTable for
1f70: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
1f80: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
1f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46  ..**.** The EP_F
1fa0: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
1fb0: 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d   is used on term
1fc0: 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  s of an expressi
1fd0: 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68  on to tell.** th
1fe0: 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  e LEFT OUTER JOI
1ff0: 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  N processing log
2000: 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72  ic that this ter
2010: 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  m is part of the
2020: 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63  .** join restric
2030: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69  tion specified i
2040: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2050: 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74  G clause and not
2060: 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68   a part.** of th
2070: 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57  e more general W
2080: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68  HERE clause.  Th
2090: 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f  ese terms are mo
20a0: 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a  ved over to the.
20b0: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
20c0: 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63  during join proc
20d0: 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65  essing but we ne
20e0: 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
20f0: 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67  hat they.** orig
2100: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
2110: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2120: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72  ..**.** The Expr
2130: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
2140: 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45   tells the WHERE
2150: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
2160: 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65  ng that the.** e
2170: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64  xpression depend
2180: 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68  s on table iRigh
2190: 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20  tJoinTable even 
21a0: 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73  if that table is
21b0: 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74   not.** explicit
21c0: 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  ly mentioned in 
21d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
21e0: 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   That informatio
21f0: 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66  n is needed.** f
2200: 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68  or cases like th
2210: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
2220: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
2230: 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
2240: 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78  .a=t2.b AND t1.x
2250: 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65  =5.**.** The whe
2260: 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  re clause needs 
2270: 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  to defer the han
2280: 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e  dling of the t1.
2290: 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69  x=5.** term unti
22a0: 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c  l after the t2 l
22b0: 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  oop of the join.
22c0: 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61    In that way, a
22d0: 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20  .** NULL t2 row 
22e0: 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
22f0: 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d   whenever t1.x!=
2300: 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  5.  If we do not
2310: 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61  .** defer the ha
2320: 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35  ndling of t1.x=5
2330: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f  , it will be pro
2340: 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65  cessed immediate
2350: 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20  ly.** after the 
2360: 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73  t1 loop and rows
2370: 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69   with t1.x!=5 wi
2380: 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20  ll never appear 
2390: 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  in.** the output
23a0: 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72  , which is incor
23b0: 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
23c0: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
23d0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54  (Expr *p, int iT
23e0: 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20  able){.  while( 
23f0: 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  p ){.    ExprSet
2400: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
2410: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d  romJoin);.    p-
2420: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
2430: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 73   = iTable;.    s
2440: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c  etJoinExpr(p->pL
2450: 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  eft, iTable);.  
2460: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
2470: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  .  } .}../*.** T
2480: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63  his routine proc
2490: 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69  esses the join i
24a0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
24b0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
24c0: 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49  t..** ON and USI
24d0: 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63  NG clauses are c
24e0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78  onverted into ex
24f0: 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tra terms of the
2500: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
2510: 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20  * NATURAL joins 
2520: 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72  also create extr
2530: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
2540: 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  erms..**.** The 
2550: 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20  terms of a FROM 
2560: 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61  clause are conta
2570: 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65  ined in the Sele
2580: 63 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72  ct.pSrc structur
2590: 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d  e..** The left m
25a0: 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65  ost table is the
25b0: 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
25c0: 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68  Select.pSrc.  Th
25d0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20  e right-most.** 
25e0: 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73  table is the las
25f0: 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f  t entry.  The jo
2600: 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68  in operator is h
2610: 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79  eld in the entry
2620: 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e   to.** the left.
2630: 20 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63    Thus entry 0 c
2640: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e  ontains the join
2650: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68   operator for th
2660: 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a  e join between.*
2670: 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20  * entries 0 and 
2680: 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53  1.  Any ON or US
2690: 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f  ING clauses asso
26a0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
26b0: 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f  join are.** also
26c0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
26d0: 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a   left entry..**.
26e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
26f0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
2700: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
2710: 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61  ountered..*/.sta
2720: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72  tic int sqlitePr
2730: 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20  ocessJoin(Parse 
2740: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
2750: 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  *p){.  SrcList *
2760: 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  pSrc;           
2770: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61         /* All ta
2780: 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
2790: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
27a0: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27c0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
27d0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
27e0: 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20  t_item *pLeft;  
27f0: 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65     /* Left table
2800: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
2810: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2820: 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20  t_item *pRight; 
2830: 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c     /* Right tabl
2840: 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a  e being joined *
2850: 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  /..  pSrc = p->p
2860: 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26  Src;.  pLeft = &
2870: 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52  pSrc->a[0];.  pR
2880: 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d  ight = &pLeft[1]
2890: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
28a0: 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b  Src->nSrc-1; i++
28b0: 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66  , pRight++, pLef
28c0: 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  t++){.    Table 
28d0: 2a 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66  *pLeftTab = pLef
28e0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62  t->pTab;.    Tab
28f0: 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20  le *pRightTab = 
2900: 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20  pRight->pTab;.  
2910: 20 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a    int isOuter;..
2920: 20 20 20 20 69 66 28 20 70 4c 65 66 74 54 61 62      if( pLeftTab
2930: 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62  ==0 || pRightTab
2940: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2950: 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70      isOuter = (p
2960: 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20  Right->jointype 
2970: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a  & JT_OUTER)!=0;.
2980: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  .    /* When the
2990: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
29a0: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64   is present, add
29b0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
29c0: 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  rms for.    ** e
29d0: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74  very column that
29e0: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
29f0: 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a  have in common..
2a00: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2a10: 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20  Right->jointype 
2a20: 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a  & JT_NATURAL ){.
2a30: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
2a40: 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d  ->pOn || pRight-
2a50: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
2a60: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2a70: 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41  sg(pParse, "a NA
2a80: 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e  TURAL join may n
2a90: 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20  ot have ".      
2aa0: 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55       "an ON or U
2ab0: 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29  SING clause", 0)
2ac0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2ad0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2ae0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65    for(j=0; j<pLe
2af0: 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ftTab->nCol; j++
2b00: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
2b10: 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54 61  *zName = pLeftTa
2b20: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
2b30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
2b40: 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74  lumnIndex(pRight
2b50: 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  Tab, zName)>=0 )
2b60: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57  {.          addW
2b70: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
2b80: 20 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62   zName, pLeftTab
2b90: 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c  , pLeft->zAlias,
2ba0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc0: 70 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68  pRightTab, pRigh
2bd0: 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20  t->zAlias,.     
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d           pRight-
2c00: 3e 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57  >iCursor, &p->pW
2c10: 68 65 72 65 2c 20 69 73 4f 75 74 65 72 29 3b 0a  here, isOuter);.
2c20: 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
2c30: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c40: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c   }..    /* Disal
2c50: 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  low both ON and 
2c60: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e  USING clauses in
2c70: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20   the same join. 
2c80: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
2c90: 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69  ight->pOn && pRi
2ca0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
2cb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2cc0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
2cd0: 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f  nnot have both O
2ce0: 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20  N and USING ".  
2cf0: 20 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69        "clauses i
2d00: 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22  n the same join"
2d10: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2d20: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
2d30: 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75   Add the ON clau
2d40: 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  se to the end of
2d50: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2d60: 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  e, connected by.
2d70: 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70      ** an AND op
2d80: 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  erator..    */. 
2d90: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
2da0: 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
2db0: 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69  isOuter ) setJoi
2dc0: 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f  nExpr(pRight->pO
2dd0: 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73  n, pRight->iCurs
2de0: 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57  or);.      p->pW
2df0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
2e00: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
2e10: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69  , p->pWhere, pRi
2e20: 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  ght->pOn);.     
2e30: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30   pRight->pOn = 0
2e40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2e50: 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72  Create extra ter
2e60: 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20  ms on the WHERE 
2e70: 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20  clause for each 
2e80: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20  column named.   
2e90: 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47   ** in the USING
2ea0: 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c   clause.  Exampl
2eb0: 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61  e: If the two ta
2ec0: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
2ed0: 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20  d are .    ** A 
2ee0: 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53  and B and the US
2ef0: 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73  ING clause names
2f00: 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68   X, Y, and Z, th
2f10: 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20  en add this.    
2f20: 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ** to the WHERE 
2f30: 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42  clause:    A.X=B
2f40: 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41  .X AND A.Y=B.Y A
2f50: 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a  ND A.Z=B.Z.    *
2f60: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
2f70: 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  r if any column 
2f80: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
2f90: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73   USING clause is
2fa0: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74  .    ** not cont
2fb0: 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61  ained in both ta
2fc0: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
2fd0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
2fe0: 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  ( pRight->pUsing
2ff0: 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74   ){.      IdList
3000: 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74   *pList = pRight
3010: 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20  ->pUsing;.      
3020: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74  for(j=0; j<pList
3030: 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nId; j++){.   
3040: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
3050: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a   = pList->a[j].z
3060: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
3070: 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c  ( columnIndex(pL
3080: 65 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30  eftTab, zName)<0
3090: 20 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28   || columnIndex(
30a0: 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65  pRightTab, zName
30b0: 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )<0 ){.         
30c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
30d0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
30e0: 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75   join using colu
30f0: 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22  mn %s - column "
3100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f  .            "no
3110: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74  t present in bot
3120: 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65  h tables", zName
3130: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
3140: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
3150: 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72  .        addWher
3160: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e  eTerm(pParse, zN
3170: 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70  ame, pLeftTab, p
3180: 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20  Left->zAlias, . 
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
31b0: 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41  tTab, pRight->zA
31c0: 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lias,.          
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e0: 20 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f    pRight->iCurso
31f0: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 2c 20 69  r, &p->pWhere, i
3200: 73 4f 75 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  sOuter);.      }
3210: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3220: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
3230: 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f  Insert code into
3240: 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70   "v" that will p
3250: 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f  ush the record o
3260: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
3270: 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74  .** stack into t
3280: 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74  he sorter..*/.st
3290: 61 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e  atic void pushOn
32a0: 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61 72 73  toSorter(.  Pars
32b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
32c0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
32d0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
32e0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
32f0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
3300: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c   clause */.  Sel
3310: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
3320: 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65      /* The whole
3330: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3340: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61  t */.  int regDa
3350: 74 61 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ta            /*
3360: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
3370: 67 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72  g data to be sor
3380: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ted */.){.  Vdbe
3390: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
33a0: 64 62 65 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  dbe;.  int nExpr
33b0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
33c0: 70 72 3b 0a 20 20 69 6e 74 20 72 65 67 42 61 73  pr;.  int regBas
33d0: 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
33e0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
33f0: 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20  nExpr+2);.  int 
3400: 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
3410: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
3420: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
3430: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
3440: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
3450: 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a  y, regBase, 0);.
3460: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3470: 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  Op2(v, OP_Sequen
3480: 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  ce, pOrderBy->iE
3490: 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b  Cursor, regBase+
34a0: 6e 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  nExpr);.  sqlite
34b0: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
34c0: 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72  arse, regData, r
34d0: 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 31 2c 20  egBase+nExpr+1, 
34e0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
34f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
3500: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73  keRecord, regBas
3510: 65 2c 20 6e 45 78 70 72 20 2b 20 32 2c 20 72 65  e, nExpr + 2, re
3520: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
3530: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3540: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
3550: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
3560: 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  r, regRecord);. 
3570: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
3580: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
3590: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
35a0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
35b0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
35c0: 42 61 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a  Base, nExpr+2);.
35d0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
35e0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74  Limit ){.    int
35f0: 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20   addr1, addr2;. 
3600: 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20     int iLimit;. 
3610: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e     if( pSelect->
3620: 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  iOffset ){.     
3630: 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63   iLimit = pSelec
3640: 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20  t->iOffset+1;.  
3650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
3660: 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d  Limit = pSelect-
3670: 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20  >iLimit;.    }. 
3680: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
3690: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
36a0: 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69  OP_IfZero, iLimi
36b0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
36c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
36d0: 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20  AddImm, iLimit, 
36e0: 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d  -1);.    addr2 =
36f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3700: 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
3710: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3720: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
3730: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3740: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c  beAddOp1(v, OP_L
3750: 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  ast, pOrderBy->i
3760: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  ECursor);.    sq
3770: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
3780: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f  v, OP_Delete, pO
3790: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
37a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
37b0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
37c0: 64 72 32 29 3b 0a 20 20 20 20 70 53 65 6c 65 63  dr2);.    pSelec
37d0: 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  t->iLimit = 0;. 
37e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
37f0: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
3800: 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a  t the OFFSET.*/.
3810: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
3820: 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a  Offset(.  Vdbe *
3830: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  v,          /* G
3840: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
3850: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53  o this VM */.  S
3860: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
3870: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
3880: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
3890: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  oded */.  int iC
38a0: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
38b0: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
38c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
38d0: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
38e0: 70 2d 3e 69 4f 66 66 73 65 74 20 26 26 20 69 43  p->iOffset && iC
38f0: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20  ontinue!=0 ){.  
3900: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
3910: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3920: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
3930: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b  p->iOffset, -1);
3940: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
3950: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
3960: 20 4f 50 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f   OP_IfNeg, p->iO
3970: 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
3980: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3990: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f   OP_Goto, 0, iCo
39a0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62  ntinue);.    Vdb
39b0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b  eComment((v, "sk
39c0: 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64  ip OFFSET record
39d0: 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  s"));.    sqlite
39e0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
39f0: 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   addr);.  }.}../
3a00: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68  *.** Add code th
3a10: 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f  at will check to
3a20: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e   make sure the N
3a30: 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
3a40: 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66  ing at iMem.** f
3a50: 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65  orm a distinct e
3a60: 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61  ntry.  iTab is a
3a70: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
3a80: 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f  hat holds previo
3a90: 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d  usly.** seen com
3aa0: 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  binations of the
3ab0: 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65   N values.  A ne
3ac0: 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20  w entry is made 
3ad0: 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68  in iTab.** if th
3ae0: 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75  e current N valu
3af0: 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a  es are new..**.*
3b00: 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  * A jump to addr
3b10: 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61  Repeat is made a
3b20: 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65  nd the N+1 value
3b30: 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f  s are popped fro
3b40: 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69  m the.** stack i
3b50: 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d  f the top N elem
3b60: 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73  ents are not dis
3b70: 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  tinct..*/.static
3b80: 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e   void codeDistin
3b90: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
3ba0: 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
3bb0: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
3bc0: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
3bd0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
3be0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72          /* A sor
3bf0: 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20  ting index used 
3c00: 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74  to test for dist
3c10: 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e  inctness */.  in
3c20: 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20  t addrRepeat,   
3c30: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
3c40: 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74   if not distinct
3c50: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
3c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3c70: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a  er of elements *
3c80: 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20  /.  int iMem    
3c90: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
3ca0: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  element */.){.  
3cb0: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72  Vdbe *v;.  int r
3cc0: 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65  1;..  v = pParse
3cd0: 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20  ->pVdbe;.  r1 = 
3ce0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
3cf0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
3d00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
3d10: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
3d20: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
3d30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3d40: 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  p3(v, OP_Found, 
3d50: 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74  iTab, addrRepeat
3d60: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
3d70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3d80: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62  _IdxInsert, iTab
3d90: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
3da0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
3db0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
3dc0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
3dd0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
3de0: 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20  hen a SELECT is 
3df0: 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 73 75  used within a su
3e00: 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28  bexpression.** (
3e10: 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20  example:  "a IN 
3e20: 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
3e30: 61 62 6c 65 29 22 29 20 62 75 74 20 69 74 20 68  able)") but it h
3e40: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72  as more than 1 r
3e50: 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e  esult.** column.
3e60: 20 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20    We do this in 
3e70: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63  a subroutine bec
3e80: 61 75 73 65 20 74 68 65 20 65 72 72 6f 72 20 6f  ause the error o
3e90: 63 63 75 72 73 20 69 6e 20 6d 75 6c 74 69 70 6c  ccurs in multipl
3ea0: 65 0a 2a 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f 0a  e.** places..*/.
3eb0: 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
3ec0: 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65  ForMultiColumnSe
3ed0: 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72  lectError(.  Par
3ee0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3ef0: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
3f00: 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  xt. */.  SelectD
3f10: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a  est *pDest,   /*
3f20: 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20   Destination of 
3f30: 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a  SELECT results *
3f40: 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20  /.  int nExpr   
3f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3f60: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
3f70: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
3f80: 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20   SELECT */.){.  
3f90: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
3fa0: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20  t->eDest;.  if( 
3fb0: 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65 73  nExpr>1 && (eDes
3fc0: 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
3fd0: 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b  est==SRT_Set) ){
3fe0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
3ff0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e  rMsg(pParse, "on
4000: 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  ly a single resu
4010: 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22  lt allowed for "
4020: 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43  .       "a SELEC
4030: 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  T that is part o
4040: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  f an expression"
4050: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
4060: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
4070: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
4080: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4090: 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  e generates the 
40a0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73  code for the ins
40b0: 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ide of the inner
40c0: 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45   loop.** of a SE
40d0: 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  LECT..**.** If s
40e0: 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d  rcTab and nColum
40f0: 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c  n are both zero,
4100: 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74   then the pEList
4110: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
4120: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e  are evaluated in
4130: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
4140: 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  e data for this 
4150: 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e  row.  If nColumn
4160: 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61 20  >0.** then data 
4170: 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73  is pulled from s
4180: 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74  rcTab and pEList
4190: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f   is used only to
41a0: 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61   get the.** data
41b0: 74 79 70 65 73 20 66 6f 72 20 65 61 63 68 20 63  types for each c
41c0: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
41d0: 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65   void selectInne
41e0: 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a  rLoop(.  Parse *
41f0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4200: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
4210: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
4220: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
4230: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
4240: 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  ete select state
4250: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
4260: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4270: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
4280: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
4290: 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20  being extracted 
42a0: 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c  */.  int srcTab,
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
42c0: 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74  Pull data from t
42d0: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  his table */.  i
42e0: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
42f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4300: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
4310: 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20  he source table 
4320: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
4330: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
4340: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72  If not NULL, sor
4350: 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20  t results using 
4360: 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  this key */.  in
4370: 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20  t distinct,     
4380: 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c        /* If >=0,
4390: 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c   make sure resul
43a0: 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74 20  ts are distinct 
43b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
43c0: 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pDest,      /* 
43d0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
43e0: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  f the results */
43f0: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
4400: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ,          /* Ju
4410: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
4420: 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f  nue with next ro
4430: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  w */.  int iBrea
4440: 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
4450: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
4460: 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
4470: 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b  inner loop */.){
4480: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
4490: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
44a0: 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69  t i;.  int hasDi
44b0: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f  stinct;        /
44c0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
44d0: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
44e0: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
44f0: 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20  nt regResult;   
4500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4510: 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f  art of memory ho
4520: 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74  lding result set
4530: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20   */.  int eDest 
4540: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20  = pDest->eDest; 
4550: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
4560: 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a  ose of results *
4570: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  /.  int iParm = 
4580: 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 20 20 20  pDest->iParm;   
4590: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
45a0: 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65  t to disposal me
45b0: 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  thod */.  int nR
45c0: 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20  esultCol;       
45d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
45e0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
45f0: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30  s */..  if( v==0
4600: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
4610: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
4620: 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20  ;.  hasDistinct 
4630: 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 3b 0a 20  = distinct>=0;. 
4640: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
4650: 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74   && !hasDistinct
4660: 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73   ){.    codeOffs
4670: 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
4680: 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ue);.  }..  /* P
4690: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
46a0: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
46b0: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
46c0: 29 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f  ){.    nResultCo
46d0: 6c 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d  l = nColumn;.  }
46e0: 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c  else{.    nResul
46f0: 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  tCol = pEList->n
4700: 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Expr;.  }.  if( 
4710: 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29  pDest->iMem==0 )
4720: 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65  {.    pDest->iMe
4730: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
4740: 2b 31 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e  +1;.    pDest->n
4750: 4d 65 6d 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  Mem = nResultCol
4760: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
4770: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
4780: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44  ;.  }else if( pD
4790: 65 73 74 2d 3e 6e 4d 65 6d 21 3d 6e 52 65 73 75  est->nMem!=nResu
47a0: 6c 74 43 6f 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  ltCol ){.    /* 
47b0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
47c0: 6e 20 74 77 6f 20 53 45 4c 45 43 54 73 20 6f 66  n two SELECTs of
47d0: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
47e0: 43 54 20 68 61 76 65 20 64 69 66 66 65 72 69 6e  CT have differin
47f0: 67 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73  g.    ** numbers
4800: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
4810: 6e 73 2e 20 20 54 68 65 20 65 72 72 6f 72 20 6d  ns.  The error m
4820: 65 73 73 61 67 65 20 77 69 6c 6c 20 62 65 20 67  essage will be g
4830: 65 6e 65 72 61 74 65 64 20 62 79 0a 20 20 20 20  enerated by.    
4840: 2a 2a 20 61 20 68 69 67 68 65 72 2d 6c 65 76 65  ** a higher-leve
4850: 6c 20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20  l routine. */.  
4860: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
4870: 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73  regResult = pDes
4880: 74 2d 3e 69 4d 65 6d 3b 0a 20 20 69 66 28 20 6e  t->iMem;.  if( n
4890: 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20  Column>0 ){.    
48a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
48b0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
48c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
48d0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
48e0: 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65  srcTab, i, regRe
48f0: 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20  sult+i);.    }. 
4900: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
4910: 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  !=SRT_Exists ){.
4920: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
4930: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20  stination is an 
4940: 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72  EXISTS(...) expr
4950: 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75  ession, the actu
4960: 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  al.    ** values
4970: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
4980: 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20   SELECT are not 
4990: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
49a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
49b0: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
49c0: 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67  rse, pEList, reg
49d0: 52 65 73 75 6c 74 2c 20 65 44 65 73 74 3d 3d 53  Result, eDest==S
49e0: 52 54 5f 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  RT_Callback);.  
49f0: 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 52  }.  nColumn = nR
4a00: 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 2f 2a 20  esultCol;..  /* 
4a10: 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  If the DISTINCT 
4a20: 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73  keyword was pres
4a30: 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  ent on the SELEC
4a40: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  T statement.  **
4a50: 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61   and this row ha
4a60: 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f  s been seen befo
4a70: 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  re, then do not 
4a80: 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20  make this row.  
4a90: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  ** part of the r
4aa0: 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
4ab0: 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b  ( hasDistinct ){
4ac0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c  .    assert( pEL
4ad0: 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ist!=0 );.    as
4ae0: 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45  sert( pEList->nE
4af0: 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  xpr==nColumn );.
4b00: 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
4b10: 28 70 50 61 72 73 65 2c 20 64 69 73 74 69 6e 63  (pParse, distinc
4b20: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43  t, iContinue, nC
4b30: 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 73 75 6c 74  olumn, regResult
4b40: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  );.    if( pOrde
4b50: 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
4b60: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
4b70: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20   iContinue);.   
4b80: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 63 68   }.  }..  if( ch
4b90: 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d  eckForMultiColum
4ba0: 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  nSelectError(pPa
4bb0: 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69  rse, pDest, pELi
4bc0: 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
4bd0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
4be0: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
4bf0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
4c00: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
4c10: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
4c20: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
4c30: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
4c40: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
4c50: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
4c60: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
4c70: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61  ND_SELECT.    ca
4c80: 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a  se SRT_Union: {.
4c90: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
4ca0: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
4cb0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
4cc0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
4cd0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4ce0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
4cf0: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
4d00: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
4d10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4d20: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
4d30: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
4d40: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4d50: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
4d60: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
4d70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4d80: 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f  Construct a reco
4d90: 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72  rd from the quer
4da0: 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e  y result, but in
4db0: 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
4dc0: 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f  saving that reco
4dd0: 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20  rd, use it as a 
4de0: 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c  key to delete el
4df0: 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20  ements from.    
4e00: 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
4e10: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
4e20: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
4e30: 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20  T_Except: {.    
4e40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4e50: 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c  Op3(v, OP_IdxDel
4e60: 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ete, iParm, regR
4e70: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
4e80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4e90: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
4ea0: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
4eb0: 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
4ec0: 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
4ed0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4ee0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
4ef0: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
4f00: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
4f10: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
4f20: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
4f30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4f40: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
4f50: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
4f60: 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b  t, nColumn, r1);
4f70: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
4f80: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
4f90: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
4fa0: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
4fb0: 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65  p, r1);.      }e
4fc0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
4fd0: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
4fe0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
4ff0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5000: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5010: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
5020: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
5030: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5040: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
5050: 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
5060: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5070: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
5080: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
5090: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
50a0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
50b0: 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
50c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
50d0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
50e0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
50f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
5100: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5110: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
5120: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
5130: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
5140: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
5150: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
5160: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
5170: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
5180: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
5190: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
51a0: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
51b0: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
51c0: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
51d0: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
51e0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
51f0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
5200: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
5210: 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79       p->affinity
5220: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
5230: 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74  eAffinity(pEList
5240: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
5250: 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a  est->affinity);.
5260: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
5270: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  By ){.        /*
5280: 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65   At first glance
5290: 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b   you would think
52a0: 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69   we could optimi
52b0: 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20  ze out the.     
52c0: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69     ** ORDER BY i
52d0: 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63  n this case sinc
52e0: 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65  e the order of e
52f0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65  ntries in the se
5300: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  t.        ** doe
5310: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42  s not matter.  B
5320: 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62  ut there might b
5330: 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
5340: 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20  , in which.     
5350: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f     ** case the o
5360: 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72  rder does matter
5370: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68   */.        push
5380: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
5390: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
53a0: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
53b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
53c0: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
53d0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
53e0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
53f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
5400: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5410: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 72   regResult, 1, r
5420: 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c  1, &p->affinity,
5430: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
5440: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
5450: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
5460: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31  se, regResult, 1
5470: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5480: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5490: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
54a0: 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
54b0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
54c0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
54d0: 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r1);.      }.   
54e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
54f0: 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
5500: 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ow exist in the 
5510: 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f  result set, reco
5520: 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64  rd that fact and
5530: 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20   abort..    */. 
5540: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
5550: 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts: {.      sqli
5560: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5570: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
5580: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  iParm);.      /*
5590: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
55a0: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
55b0: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
55c0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
55d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
55e0: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
55f0: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
5600: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
5610: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
5620: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
5630: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
5640: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
5650: 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
5660: 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
5670: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
5680: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
5690: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
56a0: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
56b0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
56c0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
56d0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
56e0: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
56f0: 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29  y, p, regResult)
5700: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5710: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5720: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
5730: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 69 50  e, regResult, iP
5740: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  arm, 1);.       
5750: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
5760: 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
5770: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
5780: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d  or us */.      }
5790: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
57a0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
57b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
57c0: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
57d0: 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64     /* Send the d
57e0: 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  ata to the callb
57f0: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  ack function or 
5800: 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e  to a subroutine.
5810: 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20    In the.    ** 
5820: 63 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75  case of a subrou
5830: 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75  tine, the subrou
5840: 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72  tine itself is r
5850: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20  esponsible for. 
5860: 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68     ** popping th
5870: 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
5880: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20  stack..    */.  
5890: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
58a0: 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53  tine:.    case S
58b0: 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20  RT_Callback: {. 
58c0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
58d0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  y ){.        int
58e0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
58f0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5900: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5910: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5920: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
5930: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c  Result, nColumn,
5940: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75   r1);.        pu
5950: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
5960: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
5970: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
5980: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5990: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
59a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
59b0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
59c0: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
59d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
59e0: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
59f0: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a   pDest->iParm);.
5a00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5a10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5a20: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
5a30: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
5a40: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
5a50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
5a60: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
5a70: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
5a80: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
5a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5aa0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
5ab0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5ac0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
5ad0: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
5ae0: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
5af0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
5b00: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
5b10: 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
5b20: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
5b30: 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
5b40: 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
5b50: 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
5b60: 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
5b70: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
5b80: 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
5b90: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
5ba0: 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
5bb0: 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
5bc0: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
5bd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
5be0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
5bf0: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
5c00: 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20  Discard );.     
5c10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
5c20: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  ndif.  }..  /* J
5c30: 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
5c40: 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
5c50: 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
5c60: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
5c70: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
5c80: 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
5c90: 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 66 20 74 68  ==0 );  /* If th
5ca0: 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
5cb0: 42 59 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 0a  BY, the call to.
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
5ce0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20  ushOntoSorter() 
5cf0: 77 6f 75 6c 64 20 68 61 76 65 20 63 6c 65 61 72  would have clear
5d00: 65 64 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a  ed p->iLimit */.
5d10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5d20: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
5d30: 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d  mm, p->iLimit, -
5d40: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
5d50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5d60: 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  IfZero, p->iLimi
5d70: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a  t, iBreak);.  }.
5d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
5d90: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
5da0: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65  t, generate a Ke
5db0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5dc0: 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20  that records.** 
5dd0: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
5de0: 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20  quence for each 
5df0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
5e00: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  at expression li
5e10: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
5e20: 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20   ExprList is an 
5e30: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
5e40: 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e  P BY clause then
5e50: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a   the resulting.*
5e60: 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  * KeyInfo struct
5e70: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
5e80: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
5e90: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e  ing a virtual in
5ea0: 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  dex to.** implem
5eb0: 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e  ent that clause.
5ec0: 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73    If the ExprLis
5ed0: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
5ee0: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a  set of a SELECT.
5ef0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49  ** then the KeyI
5f00: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
5f10: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
5f20: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
5f30: 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78  virtual.** index
5f40: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
5f50: 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a  DISTINCT test..*
5f60: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
5f70: 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
5f80: 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
5f90: 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  in from malloc. 
5fa0: 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
5fb0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
5fc0: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69  onsible for seei
5fd0: 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
5fe0: 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
5ff0: 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20  ally.** freed.  
6000: 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  Add the KeyInfo 
6010: 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65  structure to the
6020: 20 50 34 20 66 69 65 6c 64 20 6f 66 20 61 6e 20   P4 field of an 
6030: 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20  opcode using.** 
6040: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
6050: 46 46 20 69 73 20 74 68 65 20 75 73 75 61 6c 20  FF is the usual 
6060: 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77  way of dealing w
6070: 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61  ith this..*/.sta
6080: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79  tic KeyInfo *key
6090: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
60a0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
60b0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
60c0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
60d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
60e0: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79  int nExpr;.  Key
60f0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73  Info *pInfo;.  s
6100: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
6110: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
6120: 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20  t i;..  nExpr = 
6130: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
6140: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  pInfo = sqlite3D
6150: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
6160: 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b  sizeof(*pInfo) +
6170: 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43   nExpr*(sizeof(C
6180: 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20  ollSeq*)+1) );. 
6190: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
61a0: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
61b0: 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66  der = (u8*)&pInf
61c0: 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b  o->aColl[nExpr];
61d0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65  .    pInfo->nFie
61e0: 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20  ld = nExpr;.    
61f0: 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43  pInfo->enc = ENC
6200: 28 64 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  (db);.    for(i=
6210: 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
6220: 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c  a; i<nExpr; i++,
6230: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
6240: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
6250: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
6260: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
6270: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
6280: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  >pExpr);.      i
6290: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
62a0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d       pColl = db-
62b0: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
62c0: 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d    }.      pInfo-
62d0: 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c  >aColl[i] = pCol
62e0: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
62f0: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
6300: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
6310: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
6320: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a  turn pInfo;.}...
6330: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
6340: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
6350: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
6360: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
6370: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
6380: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
6390: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
63a0: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
63b0: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
63c0: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
63d0: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
63e0: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
63f0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
6400: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
6410: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
6420: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
6430: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
6440: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
6450: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
6460: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
6470: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
6480: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
6490: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
64a0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
64b0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20   */.  Vdbe *v,  
64c0: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
64d0: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
64e0: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
64f0: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f   nColumn,      /
6500: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
6510: 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  mns of data */. 
6520: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
6530: 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  st /* Write the 
6540: 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68  sorted results h
6550: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
6560: 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  brk = sqlite3Vdb
6570: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
6580: 20 69 6e 74 20 63 6f 6e 74 20 3d 20 73 71 6c 69   int cont = sqli
6590: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
65a0: 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  (v);.  int addr;
65b0: 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69  .  int iTab;.  i
65c0: 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30  nt pseudoTab = 0
65d0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
65e0: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
65f0: 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65  erBy;..  int eDe
6600: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
6610: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
6620: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a   pDest->iParm;..
6630: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
6640: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20  int regRowid;.. 
6650: 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79   iTab = pOrderBy
6660: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66  ->iECursor;.  if
6670: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
6680: 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d  lback || eDest==
6690: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
66a0: 0a 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d  .    pseudoTab =
66b0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
66c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
66d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74  AddOp2(v, OP_Set
66e0: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 6e  NumColumns, 0, n
66f0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c  Column);.    sql
6700: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6710: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
6720: 20 70 73 65 75 64 6f 54 61 62 2c 20 65 44 65 73   pseudoTab, eDes
6730: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 29  t==SRT_Callback)
6740: 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 31  ;.  }.  addr = 1
6750: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
6760: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  dOp2(v, OP_Sort,
6770: 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63   iTab, brk);.  c
6780: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
6790: 63 6f 6e 74 29 3b 0a 20 20 72 65 67 52 6f 77 20  cont);.  regRow 
67a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
67b0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72  Reg(pParse);.  r
67c0: 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  egRowid = sqlite
67d0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
67e0: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
67f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
6800: 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72  olumn, iTab, pOr
6810: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31  derBy->nExpr + 1
6820: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73 77 69  , regRow);.  swi
6830: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
6840: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
6850: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
6860: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
6870: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6880: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
6890: 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  d, iParm, regRow
68a0: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
68b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
68c0: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
68d0: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
68e0: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
68f0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
6900: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
6910: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6920: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
6930: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
6940: 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  Y.    case SRT_S
6950: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
6960: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
6970: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6980: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
6990: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
69a0: 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c  ow, 1, regRowid,
69b0: 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31   &p->affinity, 1
69c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
69d0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
69e0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
69f0: 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20  regRow, 1);.    
6a00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6a10: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
6a20: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
6a30: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65  owid);.      bre
6a40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6a50: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
6a60: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
6a70: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
6a80: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
6a90: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
6aa0: 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ow, iParm, 1);. 
6ab0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
6ac0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
6ad0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
6ae0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
6af0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6b00: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 52  ndif.    case SR
6b10: 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20  T_Callback:.    
6b20: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
6b30: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ne: {.      int 
6b40: 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
6b50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6b60: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
6b70: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
6b80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6b90: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 73  v, OP_Insert, ps
6ba0: 65 75 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c  eudoTab, regRow,
6bb0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
6bc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
6bd0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
6be0: 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52      assert( regR
6bf0: 6f 77 21 3d 70 44 65 73 74 2d 3e 69 4d 65 6d 2b  ow!=pDest->iMem+
6c00: 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i );.        sql
6c10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6c20: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65  , OP_Column, pse
6c30: 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74  udoTab, i, pDest
6c40: 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 20  ->iMem+i);.     
6c50: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44 65   }.      if( eDe
6c60: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
6c70: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6c80: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6c90: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
6ca0: 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c  Dest->iMem, nCol
6cb0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  umn);.        sq
6cc0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
6cd0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
6ce0: 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d  rse, pDest->iMem
6cf0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
6d00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6d10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6d20: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
6d30: 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20  pDest->iParm);. 
6d40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6d50: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
6d60: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
6d70: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
6d80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6d90: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
6da0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6db0: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a  Parse, regRow);.
6dc0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
6dd0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
6de0: 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a  regRowid);..  /*
6df0: 20 4c 49 4d 49 54 20 68 61 73 20 62 65 65 6e 20   LIMIT has been 
6e00: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74  implemented by t
6e10: 68 65 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  he pushOntoSorte
6e20: 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a  r() routine..  *
6e30: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
6e40: 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 2f  Limit==0 );..  /
6e50: 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  * The bottom of 
6e60: 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  the loop.  */.  
6e70: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
6e80: 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29  veLabel(v, cont)
6e90: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
6ea0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
6eb0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20  , iTab, addr);. 
6ec0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
6ed0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29  lveLabel(v, brk)
6ee0: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
6ef0: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65  RT_Callback || e
6f00: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
6f10: 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ine ){.    sqlit
6f20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6f30: 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f  OP_Close, pseudo
6f40: 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 7d 0a  Tab, 0);.  }..}.
6f50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
6f60: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
6f70: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
6f80: 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20  he 'declaration 
6f90: 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20  type' of the.** 
6fa0: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
6fb0: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79  . The string may
6fc0: 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73   be treated as s
6fd0: 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c  tatic by the cal
6fe0: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ler..**.** The d
6ff0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
7000: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
7010: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
7020: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
7030: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
7040: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
7050: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
7060: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
7070: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
7080: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
7090: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
70a0: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
70b0: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
70c0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
70d0: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
70e0: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
70f0: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
7100: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
7110: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
7120: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
7130: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
7140: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
7150: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
7160: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
7170: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
7180: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
7190: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
71a0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
71b0: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
71c0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
71d0: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
71e0: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
71f0: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
7200: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
7210: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
7220: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
7230: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
7240: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
7250: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
7260: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  LL..*/.static co
7270: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e  nst char *column
7280: 54 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  Type(.  NameCont
7290: 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70  ext *pNC, .  Exp
72a0: 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73  r *pExpr,.  cons
72b0: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69  t char **pzOrigi
72c0: 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  nDb,.  const cha
72d0: 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c  r **pzOriginTab,
72e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
72f0: 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20  pzOriginCol.){. 
7300: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
7310: 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  pe = 0;.  char c
7320: 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20  onst *zOriginDb 
7330: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
7340: 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20  t *zOriginTab = 
7350: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
7360: 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b  *zOriginCol = 0;
7370: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20  .  int j;.  if( 
7380: 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d  pExpr==0 || pNC-
7390: 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72  >pSrcList==0 ) r
73a0: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74  eturn 0;..  swit
73b0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
73c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
73d0: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
73e0: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
73f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
7400: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
7410: 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74  mn. Locate the t
7420: 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  able the column 
7430: 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a  is being.      *
7440: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
7450: 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e   in NameContext.
7460: 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74  pSrcList. This t
7470: 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c  able may be real
7480: 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
7490: 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75  se table or a su
74a0: 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f  bquery..      */
74b0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
74c0: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ab = 0;         
74d0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75     /* Table stru
74e0: 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20  cture column is 
74f0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
7500: 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
7510: 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pS = 0;         
7520: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68      /* Select th
7530: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
7540: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
7550: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
7560: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20  Expr->iColumn;  
7570: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
7580: 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20  mn in pTab */.  
7590: 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26      while( pNC &
75a0: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20  & !pTab ){.     
75b0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62     SrcList *pTab
75c0: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
75d0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  List;.        fo
75e0: 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74  r(j=0;j<pTabList
75f0: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
7600: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
7610: 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  !=pExpr->iTable;
7620: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  j++);.        if
7630: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
7640: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
7650: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
7660: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
7670: 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c        pS = pTabL
7680: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63  ist->a[j].pSelec
7690: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
76a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
76b0: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
76c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
76d0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
76e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
76f0: 20 46 49 58 20 4d 45 3a 0a 20 20 20 20 20 20 20   FIX ME:.       
7700: 20 2a 2a 20 54 68 69 73 20 63 61 6e 20 6f 63 63   ** This can occ
7710: 75 72 73 20 69 66 20 79 6f 75 20 68 61 76 65 20  urs if you have 
7720: 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 22  something like "
7730: 53 45 4c 45 43 54 20 6e 65 77 2e 78 3b 22 20 69  SELECT new.x;" i
7740: 6e 73 69 64 65 0a 20 20 20 20 20 20 20 20 2a 2a  nside.        **
7750: 20 61 20 74 72 69 67 67 65 72 2e 20 20 49 6e 20   a trigger.  In 
7760: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
7770: 79 6f 75 20 72 65 66 65 72 65 6e 63 65 20 74 68  you reference th
7780: 65 20 73 70 65 63 69 61 6c 20 22 6e 65 77 22 0a  e special "new".
7790: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
77a0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
77b0: 65 74 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20  et of a select. 
77c0: 20 57 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   We do not have 
77d0: 61 20 67 6f 6f 64 20 77 61 79 0a 20 20 20 20 20  a good way.     
77e0: 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68     ** to find th
77f0: 65 20 61 63 74 75 61 6c 20 74 61 62 6c 65 20 74  e actual table t
7800: 79 70 65 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20  ype, so call it 
7810: 22 54 45 58 54 22 2e 20 20 54 68 69 73 20 69 73  "TEXT".  This is
7820: 20 72 65 61 6c 6c 79 0a 20 20 20 20 20 20 20 20   really.        
7830: 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20  ** something of 
7840: 61 20 62 75 67 2c 20 62 75 74 20 49 20 64 6f 20  a bug, but I do 
7850: 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20  not know how to 
7860: 66 69 78 20 69 74 2e 0a 20 20 20 20 20 20 20 20  fix it..        
7870: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
7880: 69 73 20 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74  is code does not
7890: 20 70 72 6f 64 75 63 65 20 74 68 65 20 63 6f 72   produce the cor
78a0: 72 65 63 74 20 61 6e 73 77 65 72 20 2d 20 69 74  rect answer - it
78b0: 20 6a 75 73 74 20 70 72 65 76 65 6e 74 73 0a 20   just prevents. 
78c0: 20 20 20 20 20 20 20 2a 2a 20 61 20 73 65 67 66         ** a segf
78d0: 61 75 6c 74 2e 20 20 53 65 65 20 74 69 63 6b 65  ault.  See ticke
78e0: 74 20 23 31 32 32 39 2e 0a 20 20 20 20 20 20 20  t #1229..       
78f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 54 79 70   */.        zTyp
7900: 65 20 3d 20 22 54 45 58 54 22 3b 0a 20 20 20 20  e = "TEXT";.    
7910: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7920: 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
7930: 28 20 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ( pTab );.      
7940: 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20  if( pS ){.      
7950: 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22    /* The "table"
7960: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73   is actually a s
7970: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76  ub-select or a v
7980: 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  iew in the FROM 
7990: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
79a0: 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  * of the SELECT 
79b0: 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72  statement. Retur
79c0: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
79d0: 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69  n type and origi
79e0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  n.        ** dat
79f0: 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  a for the result
7a00: 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  -set column of t
7a10: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20  he sub-select.. 
7a20: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
7a30: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
7a40: 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74   iCol<pS->pEList
7a50: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
7a60: 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20       /* If iCol 
7a70: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
7a80: 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  o, then the expr
7a90: 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20  ession requests 
7aa0: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
7ab0: 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75   rowid of the su
7ac0: 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
7ad0: 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  . This expressio
7ae0: 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20  n is legal (see 
7af0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
7b00: 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e  st case misc2.2.
7b10: 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65  2) - it always e
7b20: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
7b30: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
7b40: 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e           NameCon
7b50: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
7b60: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
7b70: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
7b80: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
7b90: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
7ba0: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
7bb0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
7bc0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 0;.          s
7bd0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
7be0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
7bf0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
7c00: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
7c10: 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69  zOriginDb, &zOri
7c20: 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e  ginTab, &zOrigin
7c30: 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d  Col); .        }
7c40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
7c50: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29   pTab->pSchema )
7c60: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72  {.        /* A r
7c70: 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  eal table */.   
7c80: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
7c90: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
7ca0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
7cb0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
7cc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
7cd0: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
7ce0: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
7cf0: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20  nCol) );.       
7d00: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
7d10: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
7d20: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
7d30: 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c        zOriginCol
7d40: 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   = "rowid";.    
7d50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7d60: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61       zType = pTa
7d70: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
7d80: 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ype;.          z
7d90: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62  OriginCol = pTab
7da0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
7db0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  me;.        }.  
7dc0: 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 54 61 62        zOriginTab
7dd0: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
7de0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
7df0: 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20  >pParse ){.     
7e00: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
7e10: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
7e20: 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d  dex(pNC->pParse-
7e30: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
7e40: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ma);.          z
7e50: 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e  OriginDb = pNC->
7e60: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
7e70: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
7e80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7e90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7ea0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7eb0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
7ec0: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
7ed0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
7ee0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
7ef0: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74   sub-select. Ret
7f00: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
7f10: 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20  ion type and.   
7f20: 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66     ** origin inf
7f30: 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65  o for the single
7f40: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
7f50: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
7f60: 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a   SELECT.      **
7f70: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
7f80: 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43    */.      NameC
7f90: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
7fa0: 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70    Select *pS = p
7fb0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Expr->pSelect;. 
7fc0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
7fd0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
7fe0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 4e 43  pExpr;.      sNC
7ff0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
8000: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
8010: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
8020: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
8030: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
8040: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
8050: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
8060: 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69  zOriginDb, &zOri
8070: 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e  ginTab, &zOrigin
8080: 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65  Col); .      bre
8090: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
80a0: 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a  .  }.  .  if( pz
80b0: 4f 72 69 67 69 6e 44 62 20 29 7b 0a 20 20 20 20  OriginDb ){.    
80c0: 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 69 6e  assert( pzOrigin
80d0: 54 61 62 20 26 26 20 70 7a 4f 72 69 67 69 6e 43  Tab && pzOriginC
80e0: 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  ol );.    *pzOri
80f0: 67 69 6e 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44  ginDb = zOriginD
8100: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e  b;.    *pzOrigin
8110: 54 61 62 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62  Tab = zOriginTab
8120: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43  ;.    *pzOriginC
8130: 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b  ol = zOriginCol;
8140: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54  .  }.  return zT
8150: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
8160: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
8170: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
8180: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
8190: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
81a0: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
81b0: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
81c0: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
81d0: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
81e0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
81f0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
8200: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
8210: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
8220: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
8230: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
8240: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
8250: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
8260: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
8270: 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  t */.){.#ifndef 
8280: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
8290: 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d  TYPE.  Vdbe *v =
82a0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
82b0: 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
82c0: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e  ontext sNC;.  sN
82d0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
82e0: 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61  bList;.  sNC.pPa
82f0: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
8300: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
8310: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
8320: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
8330: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
8340: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
8350: 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20   *zType;.#ifdef 
8360: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
8370: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
8380: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
8390: 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63  rigDb = 0;.    c
83a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
83b0: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  Tab = 0;.    con
83c0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f  st char *zOrigCo
83d0: 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65  l = 0;.    zType
83e0: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
83f0: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c  NC, p, &zOrigDb,
8400: 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72   &zOrigTab, &zOr
8410: 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  igCol);..    /* 
8420: 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61  The vdbe must ma
8430: 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20  ke its own copy 
8440: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79  of the column-ty
8450: 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20  pe and other .  
8460: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63    ** column spec
8470: 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e  ific strings, in
8480: 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61   case the schema
8490: 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65   is reset before
84a0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72   this.    ** vir
84b0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20  tual machine is 
84c0: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
84d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
84e0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
84f0: 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45  COLNAME_DATABASE
8500: 2c 20 7a 4f 72 69 67 44 62 2c 20 50 34 5f 54 52  , zOrigDb, P4_TR
8510: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
8520: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8530: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8540: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
8550: 62 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29  b, P4_TRANSIENT)
8560: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8570: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8580: 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e  , COLNAME_COLUMN
8590: 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 50 34 5f 54  , zOrigCol, P4_T
85a0: 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65  RANSIENT);.#else
85b0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
85c0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
85d0: 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
85e0: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
85f0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8600: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
8610: 50 45 2c 20 7a 54 79 70 65 2c 20 50 34 5f 54 52  PE, zType, P4_TR
8620: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65  ANSIENT);.  }.#e
8630: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8640: 4d 49 54 5f 44 45 43 4c 54 59 50 45 20 2a 2f 0a  MIT_DECLTYPE */.
8650: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
8660: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
8670: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
8680: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
8690: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
86a0: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
86b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
86c0: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
86d0: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
86e0: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
86f0: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
8700: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
8710: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
8720: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
8730: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
8740: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
8750: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
8760: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
8770: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
8780: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
8790: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
87a0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
87b0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
87c0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
87d0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
87e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
87f0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
8800: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
8810: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
8820: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
8830: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
8840: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
8850: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
8860: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
8870: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
8880: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
8890: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
88a0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
88b0: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d  olNamesSet || v=
88c0: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
88d0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
88e0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
88f0: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
8900: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
8910: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
8920: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
8930: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
8940: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
8950: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
8960: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
8970: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
8980: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
8990: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
89a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
89b0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
89c0: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
89d0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
89e0: 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69  if( p==0 ) conti
89f0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  nue;.    if( pEL
8a00: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
8a10: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
8a20: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
8a30: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
8a40: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8a50: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8a60: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
8a70: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29  , strlen(zName))
8a80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8a90: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
8aa0: 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a   && pTabList ){.
8ab0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
8ac0: 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  b;.      char *z
8ad0: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
8ae0: 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
8af0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
8b00: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
8b10: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
8b20: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e  [j].iCursor!=p->
8b30: 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20  iTable; j++){}. 
8b40: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
8b50: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
8b60: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54  .      pTab = pT
8b70: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
8b80: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  b;.      if( iCo
8b90: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
8ba0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
8bb0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
8bc0: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
8bd0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
8be0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
8bf0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
8c00: 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  zCol = "rowid";.
8c10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8c20: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62       zCol = pTab
8c30: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
8c40: 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  me;.      }.    
8c50: 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65    if( !shortName
8c60: 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20  s && !fullNames 
8c70: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8c80: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8c90: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
8ca0: 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73  AME, (char*)p->s
8cb0: 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e  pan.z, p->span.n
8cc0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
8cd0: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20  f( fullNames || 
8ce0: 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20  (!shortNames && 
8cf0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
8d00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
8d10: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
8d20: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
8d30: 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62  ;. .        zTab
8d40: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
8d50: 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ].zAlias;.      
8d60: 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20    if( fullNames 
8d70: 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61  || zTab==0 ) zTa
8d80: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
8d90: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
8da0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8db0: 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61  db, "%s.%s", zTa
8dc0: 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  b, zCol);.      
8dd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8de0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8df0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
8e00: 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  e, P4_DYNAMIC);.
8e10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8e20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8e30: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8e40: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
8e50: 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c  Col, strlen(zCol
8e60: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
8e70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
8e80: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8e90: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8ea0: 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d  _NAME, (char*)p-
8eb0: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
8ec0: 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  .n);.    }.  }. 
8ed0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
8ee0: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
8ef0: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
8f00: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8f10: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
8f20: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
8f30: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
8f40: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
8f50: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
8f60: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
8f70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
8f80: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
8f90: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
8fa0: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
8fb0: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
8fc0: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
8fd0: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
8fe0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
8ff0: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
9000: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
9010: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
9020: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
9030: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
9040: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
9050: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
9060: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
9070: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
9080: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9090: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
90a0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
90b0: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
90c0: 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
90d0: 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74  c int prepSelect
90e0: 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c  Stmt(Parse*, Sel
90f0: 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69  ect*);../*.** Gi
9100: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
9110: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
9120: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
9130: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
9140: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
9150: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
9160: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
9170: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
9180: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
9190: 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62  arse, char *zTab
91a0: 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  Name, Select *pS
91b0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
91c0: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
91d0: 6a 2c 20 72 63 3b 0a 20 20 45 78 70 72 4c 69 73  j, rc;.  ExprLis
91e0: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c  t *pEList;.  Col
91f0: 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c  umn *aCol, *pCol
9200: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
9210: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9220: 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  int savedFlags;.
9230: 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20  .  savedFlags = 
9240: 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d  db->flags;.  db-
9250: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
9260: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
9270: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
9280: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
9290: 6d 65 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  mes;.  rc = sqli
92a0: 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65  te3SelectResolve
92b0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
92c0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
92d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
92e0: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
92f0: 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
9300: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
9310: 69 6f 72 3b 0a 20 20 20 20 72 63 20 3d 20 70 72  ior;.    rc = pr
9320: 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61  epSelectStmt(pPa
9330: 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  rse, pSelect);. 
9340: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9350: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
9360: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
9370: 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
9380: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
9390: 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61   }.  }.  db->fla
93a0: 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
93b0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
93c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
93d0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
93e0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
93f0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
9400: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
9410: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
9420: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 64 62 20 3d    }.  pTab->db =
9430: 20 64 62 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65   db;.  pTab->nRe
9440: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a  f = 1;.  pTab->z
9450: 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20  Name = zTabName 
9460: 3f 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  ? sqlite3DbStrDu
9470: 70 28 64 62 2c 20 7a 54 61 62 4e 61 6d 65 29 20  p(db, zTabName) 
9480: 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  : 0;.  pEList = 
9490: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
94a0: 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  .  pTab->nCol = 
94b0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
94c0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
94d0: 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d  Col>0 );.  pTab-
94e0: 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73  >aCol = aCol = s
94f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
9500: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 54  ro(db, sizeof(pT
9510: 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61  ab->aCol[0])*pTa
9520: 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73 74  b->nCol);.  test
9530: 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b  case( aCol==0 );
9540: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
9550: 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e  =aCol; i<pTab->n
9560: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
9570: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
9580: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
9590: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
95a0: 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  ;.    int nName;
95b0: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
95c0: 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74  oll;.    int cnt
95d0: 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  ;.    NameContex
95e0: 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20 20 20  t sNC;.    .    
95f0: 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70  /* Get an approp
9600: 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74  riate name for t
9610: 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f  he column.    */
9620: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
9630: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
9640: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
9650: 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  ht==0 || p->pRig
9660: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c  ht->token.z==0 |
9670: 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b  | p->pRight->tok
9680: 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  en.z[0]!=0 );.  
9690: 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70    if( (zName = p
96a0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
96b0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  e)!=0 ){.      /
96c0: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
96d0: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20  contains an "AS 
96e0: 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20  <name>" phrase, 
96f0: 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68  use <name> as th
9700: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
9710: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
9720: 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d  bStrDup(db, zNam
9730: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
9740: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
9750: 4d 4e 20 26 26 20 70 2d 3e 70 54 61 62 20 29 7b  MN && p->pTab ){
9760: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f  .      /* For co
9770: 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
9780: 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
9790: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  /.      int iCol
97a0: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
97b0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
97c0: 29 20 69 43 6f 6c 20 3d 20 70 2d 3e 70 54 61 62  ) iCol = p->pTab
97d0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 7a  ->iPKey;.      z
97e0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
97f0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
9800: 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  p->pTab->aCol[iC
9810: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol].zName);.    
9820: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
9830: 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  Use the original
9840: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c   text of the col
9850: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  umn expression a
9860: 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  s its name */.  
9870: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
9880: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
9890: 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29 3b 0a  %T", &p->span);.
98a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
98b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
98c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
98d0: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
98e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
98f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9900: 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
9910: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
9920: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
9930: 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66  e is unique.  If
9940: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74   the name is not
9950: 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20   unique,.    ** 
9960: 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72  append a integer
9970: 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20   to the name so 
9980: 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20  that it becomes 
9990: 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20  unique..    */. 
99a0: 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65     nName = strle
99b0: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  n(zName);.    fo
99c0: 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20  r(j=cnt=0; j<i; 
99d0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
99e0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61  sqlite3StrICmp(a
99f0: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  Col[j].zName, zN
9a00: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
9a10: 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d     char *zNewNam
9a20: 65 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  e;.        zName
9a30: 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20  [nName] = 0;.   
9a40: 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20       zNewName = 
9a50: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
9a60: 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d  b, "%s:%d", zNam
9a70: 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  e, ++cnt);.     
9a80: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9a90: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
9aa0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65       zName = zNe
9ab0: 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a  wName;.        j
9ac0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69   = -1;.        i
9ad0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72  f( zName==0 ) br
9ae0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9af0: 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61   }.    pCol->zNa
9b00: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20  me = zName;..   
9b10: 20 2f 2a 20 47 65 74 20 74 68 65 20 74 79 70 65   /* Get the type
9b20: 6e 61 6d 65 2c 20 74 79 70 65 20 61 66 66 69 6e  name, type affin
9b30: 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ity, and collati
9b40: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
9b50: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  the.    ** colum
9b60: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  n..    */.    me
9b70: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
9b80: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
9b90: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
9ba0: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
9bb0: 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65    zType = sqlite
9bc0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f  3DbStrDup(db, co
9bd0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
9be0: 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20  , 0, 0, 0));.   
9bf0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a   pCol->zType = z
9c00: 54 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Type;.    pCol->
9c10: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
9c20: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
9c30: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  );.    pColl = s
9c40: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
9c50: 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
9c60: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
9c70: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c       pCol->zColl
9c80: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
9c90: 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  up(db, pColl->zN
9ca0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
9cb0: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
9cc0: 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
9cd0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
9ce0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
9cf0: 61 62 6c 65 28 70 54 61 62 29 3b 0a 20 20 20 20  able(pTab);.    
9d00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
9d10: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
9d20: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
9d30: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
9d40: 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
9d50: 62 79 20 64 6f 69 6e 67 20 74 68 65 20 66 6f 6c  by doing the fol
9d60: 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 69 6e 67 73  lowing.** things
9d70: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
9d80: 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63  Make sure VDBE c
9d90: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
9da0: 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
9db0: 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20   to every.**    
9dc0: 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20       element of 
9dd0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
9de0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46  .**.**    (2)  F
9df0: 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c  ill in the pTabL
9e00: 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69  ist->a[].pTab fi
9e10: 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c  elds in the SrcL
9e20: 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20  ist that .**    
9e30: 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f       defines FRO
9e40: 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20  M clause.  When 
9e50: 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20  views appear in 
9e60: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
9e70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
9e80: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
9e90: 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
9ea0: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
9eb0: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
9ec0: 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
9ed0: 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
9ee0: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
9ef0: 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
9f00: 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
9f10: 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
9f20: 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
9f30: 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
9f40: 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
9f50: 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
9f60: 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
9f70: 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
9f80: 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72   presistent repr
9f90: 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
9fa0: 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
9fb0: 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20  w..**.**    (3) 
9fc0: 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
9fd0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
9fe0: 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65  o accomodate the
9ff0: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
a000: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
a010: 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
a020: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
a030: 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
a040: 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68      (4)  Scan th
a050: 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
a060: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
a070: 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
a080: 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
a090: 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
a0a0: 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
a0b0: 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
a0c0: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
a0d0: 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
a0e0: 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
a0f0: 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
a100: 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
a110: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
a120: 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
a130: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
a140: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ABLE..**.** Retu
a150: 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e  rn 0 on success.
a160: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70    If there are p
a170: 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61  roblems, leave a
a180: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
a190: 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  ** in pParse and
a1a0: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
a1b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a1c0: 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50  prepSelectStmt(P
a1d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
a1e0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
a1f0: 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53  i, j, k, rc;.  S
a200: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
a210: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
a220: 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
a230: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
a240: 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  om;.  sqlite3 *d
a250: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a260: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
a270: 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 64 62 2d  ->pSrc==0 || db-
a280: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
a290: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
a2a0: 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20   }.  pTabList = 
a2b0: 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
a2c0: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
a2d0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63    /* Make sure c
a2e0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
a2f0: 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
a300: 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   to all entries 
a310: 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  in.  ** the FROM
a320: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53   clause of the S
a330: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
a340: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
a350: 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
a360: 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ors(pParse, p->p
a370: 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  Src);..  /* Look
a380: 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
a390: 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
a3a0: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
a3b0: 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a  select.  If.  **
a3c0: 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
a3d0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
a3e0: 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65  a subquery inste
a3f0: 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ad of a table or
a400: 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e   view,.  ** then
a410: 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69   create a transi
a420: 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
a430: 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20  ure to describe 
a440: 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
a450: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  */.  for(i=0, pF
a460: 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
a470: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
a480: 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
a490: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
a4a0: 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  b;.    if( pFrom
a4b0: 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20  ->pTab!=0 ){.   
a4c0: 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65     /* This state
a4d0: 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79  ment has already
a4e0: 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20   been prepared. 
a4f0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
a500: 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f  d.      ** to go
a510: 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20   further. */.   
a520: 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20     assert( i==0 
a530: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
a540: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
a550: 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
a560: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
a570: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
a580: 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
a590: 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
a5a0: 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
a5b0: 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73  LECT */.      as
a5c0: 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
a5d0: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  lect!=0 );.     
a5e0: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69   if( pFrom->zAli
a5f0: 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  as==0 ){.       
a600: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d   pFrom->zAlias =
a610: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a620: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
a630: 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25  qlite_subquery_%
a640: 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 46 72 6f  p_", (void*)pFro
a650: 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
a660: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
a670: 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
a680: 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
a690: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
a6a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a6b0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
a6c0: 74 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 2d  t(pParse, pFrom-
a6d0: 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d 3e  >zAlias, pFrom->
a6e0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
a6f0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
a700: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
a710: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
a720: 2a 20 54 68 65 20 69 73 45 70 68 65 6d 20 66 6c  * The isEphem fl
a730: 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
a740: 74 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  t the Table stru
a750: 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20  cture has been. 
a760: 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61       ** dynamica
a770: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  lly allocated an
a780: 64 20 6d 61 79 20 62 65 20 66 72 65 65 64 20 61  d may be freed a
a790: 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20  t any time.  In 
a7a0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20  other words,.   
a7b0: 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f     ** pTab is no
a7c0: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  t pointing to a 
a7d0: 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65  persistent table
a7e0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
a7f0: 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  defines.      **
a800: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 63 68   part of the sch
a810: 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54  ema. */.      pT
a820: 61 62 2d 3e 69 73 45 70 68 65 6d 20 3d 20 31 3b  ab->isEphem = 1;
a830: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
a840: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
a850: 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
a860: 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
a870: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
a880: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a890: 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
a8a0: 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
a8b0: 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
a8c0: 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
a8d0: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 30  teTable(pParse,0
a8e0: 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46  ,pFrom->zName,pF
a8f0: 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  rom->zDatabase);
a900: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
a910: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
a920: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
a930: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
a940: 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ++;.#if !defined
a950: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
a960: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28  W) || !defined (
a970: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
a980: 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20  UALTABLE).      
a990: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
a9a0: 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70  t || IsVirtual(p
a9b0: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
a9c0: 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65  /* We reach here
a9d0: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
a9e0: 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20  ble is a really 
a9f0: 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  a view */.      
aa00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
aa10: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
aa20: 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
aa30: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
aa40: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
aa50: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72         /* If pFr
aa60: 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69  om->pSelect!=0 i
aa70: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
aa80: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20  ealing with a.  
aa90: 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69        ** view wi
aaa0: 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68  thin a view.  Th
aab0: 65 20 53 45 4c 45 43 54 20 73 74 72 75 63 74 75  e SELECT structu
aac0: 72 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  re has already b
aad0: 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  een.        ** c
aae0: 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f 75 74  opied by the out
aaf0: 65 72 20 76 69 65 77 20 73 6f 20 77 65 20 63 61  er view so we ca
ab00: 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20  n skip the copy 
ab10: 73 74 65 70 20 68 65 72 65 0a 20 20 20 20 20 20  step here.      
ab20: 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65    ** in the inne
ab30: 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20  r view..        
ab40: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
ab50: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
ab60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
ab70: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
ab80: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
ab90: 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  db, pTab->pSelec
aba0: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
abb0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
abc0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
abd0: 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79  cess NATURAL key
abe0: 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e  words, and ON an
abf0: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
ac00: 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20  of joins..  */. 
ac10: 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65   if( sqliteProce
ac20: 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
ac30: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20  ) ) return 1;.. 
ac40: 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a   /* For every "*
ac50: 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  " that occurs in
ac60: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
ac70: 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  , insert the nam
ac80: 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63  es of.  ** all c
ac90: 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
aca0: 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65  bles.  And for e
acb0: 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73  very TABLE.* ins
acc0: 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20  ert the names.  
acd0: 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ** of all column
ace0: 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65  s in TABLE.  The
acf0: 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64   parser inserted
ad00: 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
ad10: 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ssion.  ** with 
ad20: 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61  the TK_ALL opera
ad30: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
ad40: 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
ad50: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
ad60: 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  t..  ** The foll
ad70: 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20  owing code just 
ad80: 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  has to locate th
ad90: 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73  e TK_ALL express
ada0: 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a  ions and expand.
adb0: 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f    ** each one to
adc0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
add0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
ade0: 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
adf0: 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  * The first loop
ae00: 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20   just checks to 
ae10: 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
ae20: 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f   any "*" operato
ae30: 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65  rs.  ** that nee
ae40: 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a  d expanding..  *
ae50: 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70  /.  for(k=0; k<p
ae60: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
ae70: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
ae80: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
ae90: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
aea0: 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20  E->op==TK_ALL ) 
aeb0: 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
aec0: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
aed0: 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70   pE->pRight && p
aee0: 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
aef0: 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26  K_ALL.         &
af00: 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70  & pE->pLeft && p
af10: 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
af20: 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  _ID ) break;.  }
af30: 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28  .  rc = 0;.  if(
af40: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
af50: 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
af60: 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
af70: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
af80: 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
af90: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
afa0: 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
afb0: 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
afc0: 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
afd0: 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
afe0: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
aff0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
b000: 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
b010: 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
b020: 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
b030: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
b040: 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
b050: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
b060: 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ew = 0;.    int 
b070: 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e  flags = pParse->
b080: 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69  db->flags;.    i
b090: 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28  nt longNames = (
b0a0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
b0b0: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a  ullColNames)!=0.
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0d0: 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20        && (flags 
b0e0: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
b0f0: 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20  lNames)==0;..   
b100: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
b110: 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
b120: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
b130: 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
b140: 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
b150: 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20  TK_ALL &&.      
b160: 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b       (pE->op!=TK
b170: 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
b180: 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69  ht==0 || pE->pRi
b190: 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ght->op!=TK_ALL)
b1a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
b1b0: 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
b1c0: 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
b1d0: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
b1e0: 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
b1f0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
b200: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
b210: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
b220: 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
b230: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
b240: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
b250: 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
b260: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
b270: 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
b280: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
b290: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
b2a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b2b0: 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30    a[k].pExpr = 0
b2c0: 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a  ;.        a[k].z
b2d0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
b2e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
b2f0: 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
b300: 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
b310: 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
b320: 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
b330: 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
b340: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
b350: 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
b360: 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
b370: 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
b380: 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
b390: 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20   *zTName;       
b3a0: 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20       /* text of 
b3b0: 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f  name of TABLE */
b3c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d  .        if( pE-
b3d0: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
b3e0: 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  E->pLeft ){.    
b3f0: 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73        zTName = s
b400: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
b410: 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e 70 4c 65  ken(db, &pE->pLe
b420: 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ft->token);.    
b430: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b440: 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b       zTName = 0;
b450: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b460: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
b470: 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
b480: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
b490: 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
b4a0: 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
b4b0: 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
b4c0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63  Tab;.          c
b4d0: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
b4e0: 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
b4f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
b500: 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62  bName==0 || zTab
b510: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20  Name[0]==0 ){ . 
b520: 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e             zTabN
b530: 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
b540: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
b550: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
b560: 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 20   zTabName );.   
b570: 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
b580: 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
b590: 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62  Cmp(zTName, zTab
b5a0: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
b5b0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
b5c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
b5d0: 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
b5e0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
b5f0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
b600: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
b610: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
b620: 70 45 78 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a  pExpr, *pRight;.
b630: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
b640: 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
b650: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a  aCol[j].zName;..
b660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
b670: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61  f a column is ma
b680: 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27  rked as 'hidden'
b690: 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79   (currently only
b6a0: 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20   possible.      
b6b0: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72        ** for vir
b6c0: 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f  tual tables), do
b6d0: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20   not include it 
b6e0: 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a  in the expanded.
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
b700: 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a  esult-set list..
b710: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
b720: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49             if( I
b730: 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70  sHiddenColumn(&p
b740: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b  Tab->aCol[j]) ){
b750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
b760: 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c 28  ssert(IsVirtual(
b770: 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20  pTab));.        
b780: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
b790: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
b7a0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
b7b0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
b7c0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
b7d0: 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d  st_item *pLeft =
b7e0: 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d   &pTabList->a[i-
b7f0: 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1];.            
b800: 20 20 69 66 28 20 28 70 4c 65 66 74 5b 31 5d 2e    if( (pLeft[1].
b810: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
b820: 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20  TURAL)!=0 &&.   
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b840: 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78       columnIndex
b850: 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e  (pLeft->pTab, zN
b860: 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
b870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
b880: 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
b890: 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
b8a0: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
b8b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b8c0: 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65   ** table on the
b8d0: 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20   right */.      
b8e0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
b8f0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
b900: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b910: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
b920: 69 73 74 49 6e 64 65 78 28 70 4c 65 66 74 5b 31  istIndex(pLeft[1
b930: 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ].pUsing, zName)
b940: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
b950: 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
b960: 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47  oin with a USING
b970: 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f   clause, omit co
b980: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  lumns in the.   
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
b9a0: 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
b9b0: 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
b9c0: 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
b9e0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
b9f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
ba00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
ba10: 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
ba20: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
ba30: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
ba50: 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61  pRight==0 ) brea
ba60: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  k;.            s
ba70: 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50  etQuotedToken(pP
ba80: 61 72 73 65 2c 20 26 70 52 69 67 68 74 2d 3e 74  arse, &pRight->t
ba90: 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  oken, zName);.  
baa0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
bab0: 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c  ngNames || pTabL
bac0: 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20  ist->nSrc>1 ){. 
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
bae0: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
baf0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
bb00: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
bb10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
bb20: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
bb30: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
bb40: 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
bb50: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
bb60: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d       if( pExpr==
bb70: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
bb80: 20 20 20 20 20 20 20 20 20 73 65 74 51 75 6f 74           setQuot
bb90: 65 64 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20  edToken(pParse, 
bba0: 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a  &pLeft->token, z
bbb0: 54 61 62 4e 61 6d 65 29 3b 0a 23 69 66 20 31 0a  TabName);.#if 1.
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
bbd0: 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73  tToken(&pExpr->s
bbe0: 70 61 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  pan, .          
bbf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
bc00: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
bc10: 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
bc20: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
bc30: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
bc40: 2e 64 79 6e 20 3d 20 31 3b 0a 23 65 6c 73 65 0a  .dyn = 1;.#else.
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
bc60: 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 52 69 67  xpr->span = pRig
bc70: 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ht->token;.     
bc80: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
bc90: 73 70 61 6e 2e 64 79 6e 20 3d 20 30 3b 0a 23 65  span.dyn = 0;.#e
bca0: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
bcb0: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
bcc0: 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  z = 0;.         
bcd0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
bce0: 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.n = 0;.       
bcf0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
bd00: 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  ken.dyn = 0;.   
bd10: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
bd30: 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
bd50: 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d  r->span = pExpr-
bd60: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
bd70: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
bd80: 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20  n.dyn = 0;.     
bd90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bda0: 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
bdb0: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
bdc0: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
bdd0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
bde0: 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
bdf0: 45 78 70 72 2c 20 26 70 45 78 70 72 2d 3e 73 70  Expr, &pExpr->sp
be00: 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  an);.           
be10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
be20: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
be30: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
be40: 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
be50: 20 70 45 78 70 72 2c 20 26 70 52 69 67 68 74 2d   pExpr, &pRight-
be60: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20  >token);.       
be70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
be80: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
be90: 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
bea0: 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
beb0: 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
bec0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
bed0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
bee0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
bef0: 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
bf00: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
bf10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
bf20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
bf30: 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
bf40: 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
bf50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bf60: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
bf70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
bf80: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
bf90: 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  zTName);.      }
bfa0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
bfb0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
bfc0: 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  (db, pEList);.  
bfd0: 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
bfe0: 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  ew;.  }.#if SQLI
bff0: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
c000: 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  if( p->pEList &&
c010: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
c020: 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
c030: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
c040: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
c050: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
c060: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
c070: 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
c080: 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ");.    rc = SQL
c090: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
c0a0: 65 6e 64 69 66 0a 20 20 69 66 28 20 64 62 2d 3e  endif.  if( db->
c0b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
c0c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c0d0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74  NOMEM;.  }.  ret
c0e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c0f0: 20 70 45 20 69 73 20 61 20 70 6f 69 6e 74 65 72   pE is a pointer
c100: 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f   to an expressio
c110: 6e 20 77 68 69 63 68 20 69 73 20 61 20 73 69 6e  n which is a sin
c120: 67 6c 65 20 74 65 72 6d 20 69 6e 0a 2a 2a 20 4f  gle term in.** O
c130: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
c140: 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
c150: 2a 20 41 74 20 74 68 65 20 70 6f 69 6e 74 20 74  * At the point t
c160: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
c170: 61 6c 6c 65 64 2c 20 77 65 20 61 6c 72 65 61 64  alled, we alread
c180: 79 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 0a  y know that the.
c190: 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ** ORDER BY term
c1a0: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
c1b0: 65 72 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68  er index into th
c1c0: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54  e result set.  T
c1d0: 68 61 74 0a 2a 2a 20 63 61 73 65 65 20 69 73 20  hat.** casee is 
c1e0: 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 63  handled by the c
c1f0: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a  alling routine..
c200: 2a 2a 0a 2a 2a 20 49 66 20 70 45 20 69 73 20 61  **.** If pE is a
c210: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 65 78 70   well-formed exp
c220: 72 65 73 73 69 6f 6e 20 61 6e 64 20 74 68 65 20  ression and the 
c230: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c240: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6f  .** is not compo
c250: 75 6e 64 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  und, then return
c260: 20 30 2e 20 20 54 68 69 73 20 69 6e 64 69 63 61   0.  This indica
c270: 74 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61  tes to the.** ca
c280: 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73 68 6f  ller that it sho
c290: 75 6c 64 20 73 6f 72 74 20 62 79 20 74 68 65 20  uld sort by the 
c2a0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4f 52 44  value of the ORD
c2b0: 45 52 20 42 59 0a 2a 2a 20 65 78 70 72 65 73 73  ER BY.** express
c2c0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
c2d0: 65 20 53 45 4c 45 43 54 20 69 73 20 63 6f 6d 70  e SELECT is comp
c2e0: 6f 75 6e 64 2c 20 74 68 65 6e 20 61 74 74 65 6d  ound, then attem
c2f0: 70 74 20 74 6f 20 6d 61 74 63 68 20 70 45 20 61  pt to match pE a
c300: 67 61 69 6e 73 74 0a 2a 2a 20 72 65 73 75 6c 74  gainst.** result
c310: 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   set columns in 
c320: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45  the left-most SE
c330: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
c340: 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 69   Return.** the i
c350: 6e 64 65 78 20 69 20 6f 66 20 74 68 65 20 6d 61  ndex i of the ma
c360: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 61  tching column, a
c370: 73 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20  s an indication 
c380: 74 6f 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  to the .** calle
c390: 72 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  r that it should
c3a0: 20 73 6f 72 74 20 62 79 20 74 68 65 20 69 2d 74   sort by the i-t
c3b0: 68 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68  h column.  If th
c3c0: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 6d 61 74  ere is.** no mat
c3d0: 63 68 2c 20 72 65 74 75 72 6e 20 2d 31 20 61 6e  ch, return -1 an
c3e0: 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  d leave an error
c3f0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
c400: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
c410: 74 20 6d 61 74 63 68 4f 72 64 65 72 42 79 54 65  t matchOrderByTe
c420: 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 0a 20 20  rmToExprList(.  
c430: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c440: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
c450: 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20  ntext for error 
c460: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65  messages */.  Se
c470: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
c480: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
c490: 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 74 68  tatement with th
c4a0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
c4b0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 2c  e */.  Expr *pE,
c4c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c4d0: 20 73 70 65 63 69 66 69 63 20 4f 52 44 45 52 20   specific ORDER 
c4e0: 42 59 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  BY term */.  int
c4f0: 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20   idx,           
c500: 2f 2a 20 57 68 65 6e 20 4f 52 44 45 52 20 42 59  /* When ORDER BY
c510: 20 74 65 72 6d 20 69 73 20 74 68 69 73 20 2a 2f   term is this */
c520: 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6f 75 6e  .  int isCompoun
c530: 64 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  d,    /* True if
c540: 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 70 6f   this is a compo
c550: 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  und SELECT */.  
c560: 75 38 20 2a 70 48 61 73 41 67 67 20 20 20 20 20  u8 *pHasAgg     
c570: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 78     /* True if ex
c580: 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
c590: 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
c5a0: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tions */.){.  in
c5b0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
c5c0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
c5d0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
c5e0: 70 45 4c 69 73 74 3b 20 20 2f 2a 20 54 68 65 20  pEList;  /* The 
c5f0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 72  columns of the r
c600: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 4e  esult set */.  N
c610: 61 6d 65 43 6f 6e 74 65 78 74 20 6e 63 3b 20 20  ameContext nc;  
c620: 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
c630: 74 20 66 6f 72 20 72 65 73 6f 6c 76 69 6e 67 20  t for resolving 
c640: 70 45 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  pE */..  assert(
c650: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
c660: 74 65 67 65 72 28 70 45 2c 20 26 69 29 3d 3d 30  teger(pE, &i)==0
c670: 20 29 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   );.  pEList = p
c680: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
c690: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 65 72  .  /* If the ter
c6a0: 6d 20 69 73 20 61 20 73 69 6d 70 6c 65 20 69 64  m is a simple id
c6b0: 65 6e 74 69 66 69 65 72 20 74 68 61 74 20 74 72  entifier that tr
c6c0: 79 20 74 6f 20 6d 61 74 63 68 20 74 68 61 74 20  y to match that 
c6d0: 69 64 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20  identifier.  ** 
c6e0: 61 67 61 69 6e 73 74 20 61 20 63 6f 6c 75 6d 6e  against a column
c6f0: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 72 65 73   name in the res
c700: 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  ult set..  */.  
c710: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49  if( pE->op==TK_I
c720: 44 20 7c 7c 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b  D || (pE->op==TK
c730: 5f 53 54 52 49 4e 47 20 26 26 20 70 45 2d 3e 74  _STRING && pE->t
c740: 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 27 5c 27 27 29  oken.z[0]!='\'')
c750: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
c760: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c770: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  ;.    char *zCol
c780: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
c790: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d  omToken(db, &pE-
c7a0: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28  >token);.    if(
c7b0: 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zCol==0 ){.    
c7c0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
c7d0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
c7e0: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
c7f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
c800: 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d  r *zAs = pEList-
c810: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
c820: 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26     if( zAs!=0 &&
c830: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
c840: 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  zAs, zCol)==0 ){
c850: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c860: 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 29  DbFree(db, zCol)
c870: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
c880: 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i+1;.      }.  
c890: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
c8a0: 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 29 3b  bFree(db, zCol);
c8b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c  .  }..  /* Resol
c8c0: 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20  ve all names in 
c8d0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72  the ORDER BY ter
c8e0: 6d 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  m expression.  *
c8f0: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6e 63 2c 20  /.  memset(&nc, 
c900: 30 2c 20 73 69 7a 65 6f 66 28 6e 63 29 29 3b 0a  0, sizeof(nc));.
c910: 20 20 6e 63 2e 70 50 61 72 73 65 20 3d 20 70 50    nc.pParse = pP
c920: 61 72 73 65 3b 0a 20 20 6e 63 2e 70 53 72 63 4c  arse;.  nc.pSrcL
c930: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
c940: 53 72 63 3b 0a 20 20 6e 63 2e 70 45 4c 69 73 74  Src;.  nc.pEList
c950: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e   = pEList;.  nc.
c960: 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20  allowAgg = 1;.  
c970: 6e 63 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69  nc.nErr = 0;.  i
c980: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
c990: 73 6f 6c 76 65 4e 61 6d 65 73 28 26 6e 63 2c 20  solveNames(&nc, 
c9a0: 70 45 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69  pE) ){.    if( i
c9b0: 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20  sCompound ){.   
c9c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43     sqlite3ErrorC
c9d0: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
c9e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c9f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
ca00: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
ca10: 20 20 7d 0a 20 20 69 66 28 20 6e 63 2e 68 61 73    }.  if( nc.has
ca20: 41 67 67 20 26 26 20 70 48 61 73 41 67 67 20 29  Agg && pHasAgg )
ca30: 7b 0a 20 20 20 20 2a 70 48 61 73 41 67 67 20 3d  {.    *pHasAgg =
ca40: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f   1;.  }..  /* Fo
ca50: 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  r a compound SEL
ca60: 45 43 54 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ECT, we need to 
ca70: 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  try to match the
ca80: 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 65   ORDER BY.  ** e
ca90: 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73  xpression agains
caa0: 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  t an expression 
cab0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
cac0: 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43  t.  */.  if( isC
cad0: 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 66  ompound ){.    f
cae0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
caf0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
cb00: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
cb10: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 4c 69  ExprCompare(pELi
cb20: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
cb30: 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pE) ){.        r
cb40: 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20  eturn i+1;.     
cb50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
cb60: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
cb70: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f  ** Analyze and O
cb80: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
cb90: 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20   BY clause in a 
cba0: 73 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 73 74  simple SELECT st
cbb0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 52 65 74 75  atement..** Retu
cbc0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
cbd0: 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a   errors seen..**
cbe0: 0a 2a 2a 20 45 76 65 72 79 20 74 65 72 6d 20 6f  .** Every term o
cbf0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f  f the ORDER BY o
cc00: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
cc10: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e  e needs to be an
cc20: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .** expression. 
cc30: 20 49 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   If any expressi
cc40: 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  on is an integer
cc50: 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 0a   constant, then.
cc60: 2a 2a 20 74 68 61 74 20 65 78 70 72 65 73 73 69  ** that expressi
cc70: 6f 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  on is replaced b
cc80: 79 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  y the correspond
cc90: 69 6e 67 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  ing .** expressi
cca0: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75  on from the resu
ccb0: 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  lt set..*/.stati
ccc0: 63 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64  c int processOrd
ccd0: 65 72 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72  erGroupBy(.  Par
cce0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ccf0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
cd00: 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72  ntext.  Leave er
cd10: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72  ror messages her
cd20: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
cd30: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20  Select,      /* 
cd40: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
cd50: 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ment containing 
cd60: 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  the clause */.  
cd70: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
cd80: 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By,   /* The ORD
cd90: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
cda0: 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70  Y clause to be p
cdb0: 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e  rocessed */.  in
cdc0: 74 20 69 73 4f 72 64 65 72 2c 20 20 20 20 20 20  t isOrder,      
cdd0: 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 4f 52 44      /* 1 for ORD
cde0: 45 52 20 42 59 2e 20 20 30 20 66 6f 72 20 47 52  ER BY.  0 for GR
cdf0: 4f 55 50 20 42 59 20 2a 2f 0a 20 20 75 38 20 2a  OUP BY */.  u8 *
ce00: 70 48 61 73 41 67 67 20 20 20 20 20 20 20 20 20  pHasAgg         
ce10: 20 20 2f 2a 20 53 65 74 20 74 6f 20 54 52 55 45    /* Set to TRUE
ce20: 20 69 66 20 61 6e 79 20 74 65 72 6d 20 63 6f 6e   if any term con
ce30: 74 61 69 6e 73 20 61 6e 20 61 67 67 72 65 67 61  tains an aggrega
ce40: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  te */.){.  int i
ce50: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
ce60: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
ce70: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
ce80: 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  ;..  if( pOrderB
ce90: 79 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  y==0 || pParse->
cea0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ceb0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66   ) return 0;.#if
cec0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
ced0: 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  MN.  if( pOrderB
cee0: 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69  y->nExpr>db->aLi
cef0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
cf00: 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
cf10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
cf20: 65 20 3d 20 69 73 4f 72 64 65 72 20 3f 20 22 4f  e = isOrder ? "O
cf30: 52 44 45 52 22 20 3a 20 22 47 52 4f 55 50 22 3b  RDER" : "GROUP";
cf40: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
cf50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
cf60: 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20  o many terms in 
cf70: 25 73 20 42 59 20 63 6c 61 75 73 65 22 2c 20 7a  %s BY clause", z
cf80: 54 79 70 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Type);.    retur
cf90: 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 1;.  }.#endif.
cfa0: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
cfb0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66  ct->pEList;.  if
cfc0: 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  ( pEList==0 ){. 
cfd0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
cfe0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
cff0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
d000: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  ++){.    int iCo
d010: 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  l;.    Expr *pE 
d020: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
d030: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
d040: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
d050: 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20  eger(pE, &iCol) 
d060: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  ){.      if( iCo
d070: 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c  l<=0 || iCol>pEL
d080: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
d090: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
d0a0: 20 2a 7a 54 79 70 65 20 3d 20 69 73 4f 72 64 65   *zType = isOrde
d0b0: 72 20 3f 20 22 4f 52 44 45 52 22 20 3a 20 22 47  r ? "ORDER" : "G
d0c0: 52 4f 55 50 22 3b 0a 20 20 20 20 20 20 20 20 73  ROUP";.        s
d0d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d0e0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
d0f0: 20 20 20 22 25 72 20 25 73 20 42 59 20 74 65 72     "%r %s BY ter
d100: 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d  m out of range -
d110: 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
d120: 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e          "between
d130: 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2b 31 2c   1 and %d", i+1,
d140: 20 7a 54 79 70 65 2c 20 70 45 4c 69 73 74 2d 3e   zType, pEList->
d150: 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
d160: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
d170: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
d180: 20 20 20 69 43 6f 6c 20 3d 20 6d 61 74 63 68 4f     iCol = matchO
d190: 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72  rderByTermToExpr
d1a0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
d1b0: 6c 65 63 74 2c 20 70 45 2c 20 69 2b 31 2c 20 30  lect, pE, i+1, 0
d1c0: 2c 20 70 48 61 73 41 67 67 29 3b 0a 20 20 20 20  , pHasAgg);.    
d1d0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
d1e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
d1f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d200: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29      if( iCol>0 )
d210: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
d220: 2a 70 43 6f 6c 6c 20 3d 20 70 45 2d 3e 70 43 6f  *pColl = pE->pCo
d230: 6c 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c  ll;.      int fl
d240: 61 67 73 20 3d 20 70 45 2d 3e 66 6c 61 67 73 20  ags = pE->flags 
d250: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  & EP_ExpCollate;
d260: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
d270: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 29  prDelete(db, pE)
d280: 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 73 71 6c  ;.      pE = sql
d290: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
d2a0: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31  pEList->a[iCol-1
d2b0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
d2c0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
d2d0: 45 78 70 72 20 3d 20 70 45 3b 0a 20 20 20 20 20  Expr = pE;.     
d2e0: 20 69 66 28 20 70 45 20 26 26 20 70 43 6f 6c 6c   if( pE && pColl
d2f0: 20 26 26 20 66 6c 61 67 73 20 29 7b 0a 20 20 20   && flags ){.   
d300: 20 20 20 20 20 70 45 2d 3e 70 43 6f 6c 6c 20 3d       pE->pColl =
d310: 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20   pColl;.        
d320: 70 45 2d 3e 66 6c 61 67 73 20 7c 3d 20 66 6c 61  pE->flags |= fla
d330: 67 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  gs;.      }.    
d340: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
d350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
d360: 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  ze and ORDER BY 
d370: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
d380: 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73  se in a SELECT s
d390: 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72  tatement.  Retur
d3a0: 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  n.** the number 
d3b0: 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a  of errors seen..
d3c0: 2a 2a 0a 2a 2a 20 49 66 20 69 54 61 62 6c 65 3e  **.** If iTable>
d3d0: 30 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20  0 then make the 
d3e0: 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65  N-th term of the
d3f0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
d400: 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 74 68 65   refer to.** the
d410: 20 4e 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   N-th column of 
d420: 74 61 62 6c 65 20 69 54 61 62 6c 65 2e 0a 2a 2a  table iTable..**
d430: 0a 2a 2a 20 49 66 20 69 54 61 62 6c 65 3d 3d 30  .** If iTable==0
d440: 20 74 68 65 6e 20 74 72 61 6e 73 66 6f 72 6d 20   then transform 
d450: 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65  each term of the
d460: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
d470: 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20   to refer.** to 
d480: 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  a column of the 
d490: 72 65 73 75 6c 74 20 73 65 74 20 62 79 20 6e 75  result set by nu
d4a0: 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
d4b0: 69 6e 74 20 70 72 6f 63 65 73 73 43 6f 6d 70 6f  int processCompo
d4c0: 75 6e 64 4f 72 64 65 72 42 79 28 0a 20 20 50 61  undOrderBy(.  Pa
d4d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
d4e0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
d4f0: 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65  ontext.  Leave e
d500: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65  rror messages he
d510: 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
d520: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a  pSelect       /*
d530: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
d540: 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67  ement containing
d550: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 2a 2f   the ORDER BY */
d560: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  .){.  int i;.  E
d570: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
d580: 79 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  y;.  ExprList *p
d590: 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  EList;.  sqlite3
d5a0: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 6d 6f 72 65   *db;.  int more
d5b0: 54 6f 44 6f 20 3d 20 31 3b 0a 0a 20 20 70 4f 72  ToDo = 1;..  pOr
d5c0: 64 65 72 42 79 20 3d 20 70 53 65 6c 65 63 74 2d  derBy = pSelect-
d5d0: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28  >pOrderBy;.  if(
d5e0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
d5f0: 65 74 75 72 6e 20 30 3b 0a 20 20 64 62 20 3d 20  eturn 0;.  db = 
d600: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 20  pParse->db;.#if 
d610: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
d620: 4e 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  N.  if( pOrderBy
d630: 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d  ->nExpr>db->aLim
d640: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
d650: 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73  COLUMN] ){.    s
d660: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d670: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
d680: 20 74 65 72 6d 73 20 69 6e 20 4f 52 44 45 52 20   terms in ORDER 
d690: 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20  BY clause");.   
d6a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23   return 1;.  }.#
d6b0: 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b  endif.  for(i=0;
d6c0: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
d6d0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4f  pr; i++){.    pO
d6e0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
d6f0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69  e = 0;.  }.  whi
d700: 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
d710: 69 6f 72 20 29 7b 0a 20 20 20 20 70 53 65 6c 65  ior ){.    pSele
d720: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
d730: 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  rior;.  }.  whil
d740: 65 28 20 70 53 65 6c 65 63 74 20 26 26 20 6d 6f  e( pSelect && mo
d750: 72 65 54 6f 44 6f 20 29 7b 0a 20 20 20 20 6d 6f  reToDo ){.    mo
d760: 72 65 54 6f 44 6f 20 3d 20 30 3b 0a 20 20 20 20  reToDo = 0;.    
d770: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
d780: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66  ->pEList;.    if
d790: 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  ( pEList==0 ){. 
d7a0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
d7b0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
d7c0: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
d7d0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
d7e0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a   int iCol = -1;.
d7f0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20        Expr *pE, 
d800: 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28  *pDup;.      if(
d810: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
d820: 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  done ) continue;
d830: 0a 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64  .      pE = pOrd
d840: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
d850: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
d860: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
d870: 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20  (pE, &iCol) ){. 
d880: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
d890: 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74  0 || iCol>pEList
d8a0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
d8b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
d8c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
d8d0: 20 20 20 20 20 20 20 20 20 20 20 22 25 72 20 4f             "%r O
d8e0: 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 75 74  RDER BY term out
d8f0: 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75   of range - shou
d900: 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20  ld be ".        
d910: 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20       "between 1 
d920: 61 6e 64 20 25 64 22 2c 20 69 2b 31 2c 20 70 45  and %d", i+1, pE
d930: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
d940: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
d950: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d970: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
d980: 78 70 72 44 75 70 28 64 62 2c 20 70 45 29 3b 0a  xprDup(db, pE);.
d990: 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d          if( !db-
d9a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
d9b0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
d9c0: 74 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  t(pDup);.       
d9d0: 20 20 20 69 43 6f 6c 20 3d 20 6d 61 74 63 68 4f     iCol = matchO
d9e0: 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72  rderByTermToExpr
d9f0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
da00: 6c 65 63 74 2c 20 70 44 75 70 2c 20 69 2b 31 2c  lect, pDup, i+1,
da10: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
da20: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
da30: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
da40: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 69  pDup);.        i
da50: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
da60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
da70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
da80: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f   }.      if( iCo
da90: 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  l>0 ){.        p
daa0: 45 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47  E->op = TK_INTEG
dab0: 45 52 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e  ER;.        pE->
dac0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
dad0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45  alue;.        pE
dae0: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 43 6f 6c 3b  ->iTable = iCol;
daf0: 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
db00: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31  y->a[i].done = 1
db10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
db20: 20 20 20 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20         moreToDo 
db30: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
db40: 20 7d 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d   }.    pSelect =
db50: 20 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 3b   pSelect->pNext;
db60: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
db70: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
db80: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
db90: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
dba0: 64 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  done==0 ){.     
dbb0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
dbc0: 28 70 50 61 72 73 65 2c 20 22 25 72 20 4f 52 44  (pParse, "%r ORD
dbd0: 45 52 20 42 59 20 74 65 72 6d 20 64 6f 65 73 20  ER BY term does 
dbe0: 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 22 0a  not match any ".
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c              "col
dc00: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
dc10: 74 20 73 65 74 22 2c 20 69 2b 31 29 3b 0a 20 20  t set", i+1);.  
dc20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
dc30: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
dc40: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74   0;.}../*.** Get
dc50: 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20   a VDBE for the 
dc60: 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e  given parser con
dc70: 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20  text.  Create a 
dc80: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
dc90: 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  sary..** If an e
dca0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
dcb0: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
dcc0: 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  ve a message in 
dcd0: 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20  pParse..*/.Vdbe 
dce0: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
dcf0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
dd00: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
dd10: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
dd20: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
dd30: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
dd40: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
dd50: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  te(pParse->db);.
dd60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
dd70: 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66  MIT_TRACE.    if
dd80: 28 20 76 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ( v ){.      sql
dd90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
dda0: 2c 20 4f 50 5f 54 72 61 63 65 29 3b 0a 20 20 20  , OP_Trace);.   
ddb0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
ddc0: 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a  return v;.}.../*
ddd0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
dde0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
ddf0: 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
de00: 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
de10: 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61   the.** pLimit a
de20: 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65  nd pOffset expre
de30: 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20  ssions.  pLimit 
de40: 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64  and pOffset hold
de50: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
de60: 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20  .** that appear 
de70: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
de80: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66  SQL statement af
de90: 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ter the LIMIT an
dea0: 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77  d OFFSET.** keyw
deb0: 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69  ords.  Or NULL i
dec0: 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73  f those keywords
ded0: 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c   are omitted. iL
dee0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
def0: 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74   .** are the int
df00: 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69  eger memory regi
df10: 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72  ster numbers for
df20: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74   counters used t
df30: 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68  o compute .** th
df40: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
df50: 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  et.  If there is
df60: 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72   no limit and/or
df70: 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a   offset, then .*
df80: 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  * iLimit and iOf
df90: 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76  fset are negativ
dfa0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
dfb0: 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68  utine changes th
dfc0: 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d  e values of iLim
dfd0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f  it and iOffset o
dfe0: 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69  nly if.** a limi
dff0: 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64  t or offset is d
e000: 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74  efined by pLimit
e010: 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69   and pOffset.  i
e020: 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66  Limit and.** iOf
e030: 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65  fset should have
e040: 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20   been preset to 
e050: 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
e060: 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75  ult values.** (u
e070: 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61  sually but not a
e080: 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20  lways -1) prior 
e090: 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
e0a0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79  routine..** Only
e0b0: 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72   if pLimit!=0 or
e0c0: 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74   pOffset!=0 do t
e0d0: 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
e0e0: 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69  rs get.** redefi
e0f0: 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20  ned.  The UNION 
e100: 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65  ALL operator use
e110: 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20  s this property 
e120: 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20  to force.** the 
e130: 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d  reuse of the sam
e140: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
e150: 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72  et registers acr
e160: 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  oss multiple.** 
e170: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e180: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
e190: 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65  d computeLimitRe
e1a0: 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70  gisters(Parse *p
e1b0: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
e1c0: 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20  , int iBreak){. 
e1d0: 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20   Vdbe *v = 0;.  
e1e0: 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  int iLimit = 0;.
e1f0: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
e200: 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 69 66   int addr1;.  if
e210: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65  ( p->iLimit ) re
e220: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  turn;..  /* .  *
e230: 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77  * "LIMIT -1" alw
e240: 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f  ays shows all ro
e250: 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f  ws.  There is so
e260: 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65  me.  ** contrave
e270: 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74  rsy about what t
e280: 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
e290: 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20  ior should be.. 
e2a0: 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   ** The current 
e2b0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
e2c0: 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54  nterprets "LIMIT
e2d0: 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a   0" to mean.  **
e2e0: 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20   no rows..  */. 
e2f0: 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
e300: 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  {.    p->iLimit 
e310: 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61  = iLimit = ++pPa
e320: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76  rse->nMem;.    v
e330: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
e340: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
e350: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
e360: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
e370: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
e380: 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29  >pLimit, iLimit)
e390: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e3a0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
e3b0: 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29  stBeInt, iLimit)
e3c0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
e3d0: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
e3e0: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 73 71 6c  nter"));.    sql
e3f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e400: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69  , OP_IfZero, iLi
e410: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
e420: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73  }.  if( p->pOffs
e430: 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f 66  et ){.    p->iOf
e440: 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
e450: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
e460: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  .    if( p->pLim
e470: 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  it ){.      pPar
e480: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a  se->nMem++;   /*
e490: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74   Allocate an ext
e4a0: 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ra register for 
e4b0: 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a  limit+offset */.
e4c0: 20 20 20 20 7d 0a 20 20 20 20 76 20 3d 20 73 71      }.    v = sq
e4d0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
e4e0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
e4f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
e500: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e510: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
e520: 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  set, iOffset);. 
e530: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e540: 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
e550: 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a  eInt, iOffset);.
e560: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e570: 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e  (v, "OFFSET coun
e580: 74 65 72 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ter"));.    addr
e590: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
e5a0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
e5b0: 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  s, iOffset);.   
e5c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e5d0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
e5e0: 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  , 0, iOffset);. 
e5f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
e600: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
e610: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69  ;.    if( p->pLi
e620: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  mit ){.      sql
e630: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
e640: 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74  , OP_Add, iLimit
e650: 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  , iOffset, iOffs
e660: 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62  et+1);.      Vdb
e670: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
e680: 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20  MIT+OFFSET"));. 
e690: 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
e6a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
e6b0: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d  , OP_IfPos, iLim
e6c0: 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  it);.      sqlit
e6d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e6e0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20  OP_Integer, -1, 
e6f0: 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
e700: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
e710: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
e720: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
e730: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e740: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
e750: 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
e760: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
e770: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
e780: 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
e790: 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
e7a0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
e7b0: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
e7c0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
e7d0: 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
e7e0: 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
e7f0: 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
e800: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
e810: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
e820: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
e830: 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
e840: 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
e850: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
e860: 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
e870: 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
e880: 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
e890: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
e8a0: 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
e8b0: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
e8c0: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
e8d0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
e8e0: 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
e8f0: 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
e900: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
e910: 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
e920: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
e930: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
e940: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
e950: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
e960: 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20  if( pRet==0 ){. 
e970: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
e980: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
e990: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
e9a0: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
e9b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
e9c0: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
e9d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
e9e0: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
e9f0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
ea00: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
ea10: 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
ea20: 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
ea30: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
ea40: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
ea50: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ea70: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
ea80: 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
ea90: 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
eaa0: 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
eab0: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
eac0: 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
ead0: 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66   */.);...#ifndef
eae0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
eaf0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
eb00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
eb10: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
eb20: 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  cess a compound 
eb30: 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a  query form from.
eb40: 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  ** two or more s
eb50: 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20  eparate queries 
eb60: 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49  using UNION, UNI
eb70: 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20  ON ALL, EXCEPT, 
eb80: 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a  or.** INTERSECT.
eb90: 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
eba0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
ebb0: 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
ebc0: 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
ebd0: 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
ebe0: 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
ebf0: 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
ec00: 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
ec10: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
ec20: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
ec30: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
ec40: 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
ec50: 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
ec60: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
ec70: 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
ec80: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
ec90: 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
eca0: 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
ecb0: 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
ecc0: 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
ecd0: 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
ece0: 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
ecf0: 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
ed00: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
ed10: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
ed20: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
ed30: 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
ed40: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
ed50: 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
ed60: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
ed70: 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
ed80: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
ed90: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
eda0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
edb0: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
edc0: 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
edd0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
edf0: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
ee00: 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
ee10: 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
ee20: 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
ee30: 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
ee40: 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
ee50: 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
ee60: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
ee70: 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
ee80: 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
ee90: 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
eea0: 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
eeb0: 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
eec0: 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
eed0: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
eee0: 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
eef0: 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
ef00: 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
ef10: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
ef20: 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
ef30: 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
ef40: 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
ef50: 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
ef60: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
ef70: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
ef80: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
ef90: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
efa0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
efb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
efc0: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
efd0: 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
efe0: 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
eff0: 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
f000: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
f010: 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
f020: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
f030: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
f040: 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
f050: 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
f060: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
f070: 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
f080: 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
f090: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
f0a0: 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
f0b0: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
f0c0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
f0d0: 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
f0e0: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
f0f0: 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c  dest;      /* Al
f100: 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64  ternative data d
f110: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
f120: 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20  Select *pDelete 
f130: 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f  = 0;  /* Chain o
f140: 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73  f simple selects
f150: 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
f160: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
f170: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
f180: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
f190: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
f1a0: 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
f1b0: 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c  R BY or LIMIT cl
f1c0: 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45  ause on prior SE
f1d0: 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a  LECTs.  Only.  *
f1e0: 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68  * the last (righ
f1f0: 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69  t-most) SELECT i
f200: 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79  n the series may
f210: 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
f220: 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f  Y or LIMIT..  */
f230: 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20  .  assert( p && 
f240: 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a  p->pPrior );  /*
f250: 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   Calling functio
f260: 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69  n guarantees thi
f270: 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20 3d  s much */.  db =
f280: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
f290: 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
f2a0: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
f2b0: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21  ior->pRightmost!
f2c0: 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73  =pPrior );.  ass
f2d0: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
f2e0: 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67  ghtmost==p->pRig
f2f0: 68 74 6d 6f 73 74 20 29 3b 0a 20 20 69 66 28 20  htmost );.  if( 
f300: 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
f310: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
f320: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
f330: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
f340: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
f350: 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
f360: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
f370: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
f380: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
f390: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f3a0: 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
f3b0: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b  Prior->pLimit ){
f3c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
f3d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d  rMsg(pParse,"LIM
f3e0: 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  IT clause should
f3f0: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
f400: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
f410: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
f420: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
f430: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
f440: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
f450: 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   }..  v = sqlite
f460: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
f470: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
f480: 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45   );  /* The VDBE
f490: 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64   already created
f4a0: 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63   by calling func
f4b0: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72  tion */..  /* Cr
f4c0: 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  eate the destina
f4d0: 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  tion temporary t
f4e0: 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  able if necessar
f4f0: 79 0a 20 20 2a 2f 0a 20 20 64 65 73 74 20 3d 20  y.  */.  dest = 
f500: 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 64 65  *pDest;.  if( de
f510: 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  st.eDest==SRT_Ep
f520: 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73  hemTab ){.    as
f530: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
f540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
f550: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
f560: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65  penEphemeral, de
f570: 73 74 2e 69 50 61 72 6d 2c 20 70 2d 3e 70 45 4c  st.iParm, p->pEL
f580: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
f590: 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
f5a0: 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
f5b0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
f5c0: 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
f5d0: 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
f5e0: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
f5f0: 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
f600: 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
f610: 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
f620: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
f630: 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
f640: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
f650: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
f660: 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
f670: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
f680: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f690: 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
f6a0: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
f6b0: 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
f6c0: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
f6d0: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
f6e0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
f6f0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
f700: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
f710: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
f720: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
f730: 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53  .  /* Compound S
f740: 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65  ELECTs that have
f750: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
f760: 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  use are handled 
f770: 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f  separately..  */
f780: 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
f790: 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  By ){.    return
f7a0: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
f7b0: 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  rBy(pParse, p, p
f7c0: 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Dest);.  }..  /*
f7d0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
f7e0: 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
f7f0: 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
f800: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
f810: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
f820: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
f830: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
f840: 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  dr = 0;.      as
f850: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
f860: 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70  Limit );.      p
f870: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
f880: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
f890: 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74   pPrior->pOffset
f8a0: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
f8b0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f8c0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
f8d0: 70 50 72 69 6f 72 2c 20 26 64 65 73 74 2c 20 30  pPrior, &dest, 0
f8e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 0, 0);.      p
f8f0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
f900: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
f910: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
f920: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
f930: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
f940: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
f950: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
f960: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
f970: 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74  = pPrior->iLimit
f980: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
f990: 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
f9a0: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
f9b0: 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
f9c0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
f9d0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
f9e0: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
f9f0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20  Limit);.        
fa00: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
fa10: 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c  "Jump ahead if L
fa20: 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
fa30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
fa40: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
fa50: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
fa60: 73 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  st, 0, 0, 0);.  
fa70: 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
fa80: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
fa90: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
faa0: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  r;.      if( rc 
fab0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
fac0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
fad0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fae0: 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
faf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
fb00: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
fb10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fb20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
fb30: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
fb40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49  .    case TK_UNI
fb50: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
fb60: 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
fb70: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
fb80: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
fb90: 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
fba0: 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ult */.      int
fbb0: 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a   op = 0;      /*
fbc0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f   One of the SRT_
fbd0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61   operations to a
fbe0: 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a  pply to self */.
fbf0: 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
fc00: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
fc10: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
fc20: 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
fc30: 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  elects */.      
fc40: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
fc50: 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64  Offset; /* Saved
fc60: 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c   values of p->nL
fc70: 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66  imit and p->nOff
fc80: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  set */.      int
fc90: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
fca0: 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73  ectDest uniondes
fcb0: 74 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f  t;..      priorO
fcc0: 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
fcd0: 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
fce0: 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20  est==priorOp && 
fcf0: 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21 70  !p->pLimit && !p
fd00: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
fd10: 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
fd20: 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
fd30: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
fd40: 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
fd50: 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
fd60: 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
fd70: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
fd80: 62 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a  b = dest.iParm;.
fd90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fda0: 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20       /* We will 
fdb0: 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f  need to create o
fdc0: 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79  ur own temporary
fdd0: 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74   table to hold t
fde0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
fdf0: 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
fe00: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ts..        */. 
fe10: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
fe20: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
fe30: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
fe40: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
fe50: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72   );.        addr
fe60: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
fe70: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
fe80: 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54  phemeral, unionT
fe90: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
fea0: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
feb0: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
fec0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
fed0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
fee0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70   addr;.        p
fef0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73  ->pRightmost->us
ff00: 65 73 45 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20  esEphm = 1;.    
ff10: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
ff20: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d  EList );.      }
ff30: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
ff40: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
ff50: 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
ff60: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
ff70: 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
ff80: 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ->pOrderBy );.  
ff90: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
ffa0: 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e  tDestInit(&union
ffb0: 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75  dest, priorOp, u
ffc0: 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20  nionTab);.      
ffd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
ffe0: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
fff0: 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 2c 20 30  r, &uniondest, 0
10000 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
10010 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
10020 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
10030 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
10040 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
10050 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
10060 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
10070 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
10080 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
10090 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  ){.        op = 
100a0 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20  SRT_Except;.    
100b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
100c0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
100d0 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
100e0 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69      op = SRT_Uni
100f0 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  on;.      }.    
10100 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
10110 0a 20 20 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c  .      p->disall
10120 6f 77 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  owOrderBy = 0;. 
10130 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
10140 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
10150 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
10160 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
10170 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
10180 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
10190 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e        uniondest.
101a0 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20  eDest = op;.    
101b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
101c0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
101d0 26 75 6e 69 6f 6e 64 65 73 74 2c 20 30 2c 20 30  &uniondest, 0, 0
101e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51  , 0);.      /* Q
101f0 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
10200 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
10210 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20  () might refill 
10220 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20  p->pOrderBy..   
10230 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f     ** Be sure to
10240 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65   delete p->pOrde
10250 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20  rBy, therefore, 
10260 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72  to avoid a memor
10270 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20  y leak. */.     
10280 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
10290 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
102a0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70  rderBy);.      p
102b0 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
102c0 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
102d0 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
102e0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
102f0 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
10300 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
10310 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
10320 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
10330 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
10340 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
10350 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  t;.      p->iLim
10360 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  it = 0;.      p-
10370 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >iOffset = 0;.  
10380 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
10390 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
103a0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
103b0 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20     }...      /* 
103c0 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61  Convert the data
103d0 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
103e0 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61  y table into wha
103f0 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20  tever form.     
10400 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77   ** it is that w
10410 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64  e currently need
10420 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20  ..      */      
10430 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
10440 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c  eDest!=priorOp |
10450 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 64 65 73 74  | unionTab!=dest
10460 2e 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20  .iParm ){.      
10470 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
10480 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
10490 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
104a0 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
104b0 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
104c0 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
104d0 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
104e0 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
104f0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
10500 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
10510 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
10520 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
10530 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
10540 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
10550 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
10560 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
10570 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
10580 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
10590 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
105a0 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
105b0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
105c0 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
105d0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
105e0 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
105f0 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
10600 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10610 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
10620 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20  nTab, iBreak);. 
10630 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
10640 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10650 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
10660 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
10670 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
10680 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61  >pEList, unionTa
10690 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  b, p->pEList->nE
106a0 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
106b0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
106c0 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74  -1, &dest, iCont
106d0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
106e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
106f0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
10700 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
10710 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10720 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
10730 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20  nTab, iStart);. 
10740 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10750 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
10760 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
10770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10780 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
10790 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
107a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
107b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
107c0 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
107d0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  : {.      int ta
107e0 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
107f0 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
10800 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
10810 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
10820 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
10830 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
10840 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73  electDest inters
10850 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69  ectdest;.      i
10860 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a  nt r1;..      /*
10870 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
10880 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
10890 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
108a0 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
108b0 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
108c0 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
108d0 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
108e0 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
108f0 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
10900 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
10910 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
10920 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
10930 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
10940 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
10950 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
10960 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
10970 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a  pOrderBy==0 );..
10980 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
10990 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
109a0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
109b0 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
109c0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
109d0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
109e0 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
109f0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
10a00 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
10a10 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73  ->pRightmost->us
10a20 65 73 45 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20  esEphm = 1;.    
10a30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
10a40 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
10a50 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
10a60 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
10a70 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
10a80 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
10a90 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
10aa0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
10ab0 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
10ac0 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
10ad0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
10ae0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
10af0 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65  e, pPrior, &inte
10b00 72 73 65 63 74 64 65 73 74 2c 20 30 2c 20 30 2c  rsectdest, 0, 0,
10b10 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
10b20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
10b30 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
10b40 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
10b50 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
10b60 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
10b70 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
10b80 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
10b90 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
10ba0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10bb0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
10bc0 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b  meral, tab2, 0);
10bd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10be0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
10bf0 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
10c00 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
10c10 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [1] = addr;.    
10c20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
10c30 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
10c40 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
10c50 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
10c60 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
10c70 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
10c80 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
10c90 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63  ;.      intersec
10ca0 74 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 74 61  tdest.iParm = ta
10cb0 62 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  b2;.      rc = s
10cc0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
10cd0 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65  rse, p, &interse
10ce0 63 74 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 29  ctdest, 0, 0, 0)
10cf0 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
10d00 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
10d10 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
10d20 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  Prior;.      sql
10d30 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
10d40 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
10d50 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
10d60 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
10d70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
10d80 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72  set;.      if( r
10d90 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
10da0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
10db0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
10dc0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
10dd0 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ode to take the 
10de0 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
10df0 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72  the two temporar
10e00 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  y.      ** table
10e10 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
10e20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
10e30 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ist );.      if(
10e40 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
10e50 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
10e60 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
10e70 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
10e80 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
10e90 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
10ea0 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
10eb0 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  ;.        genera
10ec0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
10ed0 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
10ee0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
10ef0 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
10f00 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
10f10 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
10f20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
10f30 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
10f40 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69  .      computeLi
10f50 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
10f60 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
10f70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10f80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
10f90 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
10fa0 65 61 6b 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  eak);.      r1 =
10fb0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
10fc0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
10fd0 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
10fe0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10ff0 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c  OP_RowKey, tab1,
11000 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
11010 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11020 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
11030 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 29 3b 0a  b2, iCont, r1);.
11040 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
11050 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
11060 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  se, r1);.      s
11070 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
11080 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
11090 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45  ist, tab1, p->pE
110a0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c     0, -1, &dest,
110d0 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
110e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
110f0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
11100 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
11110 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11120 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  2(v, OP_Next, ta
11130 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
11140 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
11150 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
11160 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
11170 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11180 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
11190 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
111a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
111b0 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
111c0 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
111d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
111e0 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
111f0 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
11200 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70  ed by .  ** temp
11210 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65  orary tables nee
11220 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ded to implement
11230 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
11240 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63  lect..  ** Attac
11250 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  h the KeyInfo st
11260 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74  ructure to all t
11270 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
11280 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
11290 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
112a0 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
112b0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
112c0 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
112d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
112e0 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
112f0 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
11300 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
11310 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
11320 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
11330 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
11340 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
11350 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
11360 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
11370 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
11380 20 20 69 66 28 20 70 2d 3e 75 73 65 73 45 70 68    if( p->usesEph
11390 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  m ){.    int i; 
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113b0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
113c0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65  ounter */.    Ke
113d0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
113e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
113f0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
11400 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  e for the result
11410 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65   set */.    Sele
11420 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  ct *pLoop;      
11430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
11440 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
11450 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11460 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65  ts */.    CollSe
11470 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20  q **apColl;     
11480 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
11490 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70  ooping through p
114a0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d  KeyInfo->aColl[]
114b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
114c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
114d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
114e0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  of columns in re
114f0 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20  sult set */..   
11500 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
11510 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
11520 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73   nCol = p->pELis
11530 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b  t->nExpr;.    pK
11540 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
11550 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
11560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11570 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
11580 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 28  pKeyInfo)+nCol*(
11590 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
115a0 20 2b 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20   + 1));.    if( 
115b0 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
115c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
115d0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
115e0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
115f0 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b  d;.    }..    pK
11600 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e  eyInfo->enc = EN
11610 43 28 64 62 29 3b 0a 20 20 20 20 70 4b 65 79 49  C(db);.    pKeyI
11620 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43  nfo->nField = nC
11630 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ol;..    for(i=0
11640 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66  , apColl=pKeyInf
11650 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c  o->aColl; i<nCol
11660 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29  ; i++, apColl++)
11670 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20  {.      *apColl 
11680 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
11690 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
116a0 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  i);.      if( 0=
116b0 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  =*apColl ){.    
116c0 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62      *apColl = db
116d0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
116e0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
116f0 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
11700 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
11710 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
11720 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
11730 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
11740 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64  addr = pLoop->ad
11750 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20  drOpenEphm[i];. 
11760 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c         if( addr<
11770 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
11780 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73  * If [0] is unus
11790 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61  ed then [1] is a
117a0 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20  lso unused.  So 
117b0 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20  we can.         
117c0 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c   ** always safel
117d0 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20  y abort as soon 
117e0 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75  as the first unu
117f0 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e  sed slot is foun
11800 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  d */.          a
11810 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64  ssert( pLoop->ad
11820 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20  drOpenEphm[1]<0 
11830 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
11840 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
11850 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11860 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
11870 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  r, nCol);.      
11880 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
11890 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
118a0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
118b0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
118c0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72       pLoop->addr
118d0 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31  OpenEphm[i] = -1
118e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
118f0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11900 65 28 64 62 2c 20 70 4b 65 79 49 6e 66 6f 29 3b  e(db, pKeyInfo);
11910 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65  .  }..multi_sele
11920 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d  ct_end:.  pDest-
11930 3e 69 4d 65 6d 20 3d 20 64 65 73 74 2e 69 4d 65  >iMem = dest.iMe
11940 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  m;.  pDest->nMem
11950 20 3d 20 64 65 73 74 2e 6e 4d 65 6d 3b 0a 20 20   = dest.nMem;.  
11960 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
11970 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29  ete(db, pDelete)
11980 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11990 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
119a0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
119b0 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
119c0 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20   Code an output 
119d0 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  subroutine for a
119e0 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65   coroutine imple
119f0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a  mentation of a.*
11a00 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e  * SELECT statmen
11a10 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74  t..**.** The dat
11a20 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69  a to be output i
11a30 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70  s contained in p
11a40 49 6e 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 72 65  In->iMem.  There
11a50 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 4d 65   are.** pIn->nMe
11a60 6d 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  m columns to be 
11a70 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69  output.  pDest i
11a80 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70  s where the outp
11a90 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  ut should.** be 
11aa0 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52  sent..**.** regR
11ab0 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d  eturn is the num
11ac0 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73  ber of the regis
11ad0 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ter holding the 
11ae0 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  subroutine.** re
11af0 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a  turn address..**
11b00 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30  .** If regPrev>0
11b10 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 74 68   then it is a th
11b20 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
11b30 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61   in a vector tha
11b40 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65  t.** records the
11b50 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
11b60 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20  .  mem[regPrev] 
11b70 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  is a flag that i
11b80 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68  s false.** if th
11b90 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20  ere has been no 
11ba0 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
11bb0 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74    If regPrev>0 t
11bc0 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67  hen code is.** g
11bd0 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70  enerated to supp
11be0 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e  ress duplicates.
11bf0 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73    pKeyInfo is us
11c00 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  ed for comparing
11c10 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  .** keys..**.** 
11c20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75  If the LIMIT fou
11c30 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20  nd in p->iLimit 
11c40 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70  is reached, jump
11c50 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a   immediately to.
11c60 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74  ** iBreak..*/.st
11c70 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74  atic int generat
11c80 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
11c90 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
11ca0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
11cb0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
11cc0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
11cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ce0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
11cf0 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ment */.  Select
11d00 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20  Dest *pIn,      
11d10 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73    /* Coroutine s
11d20 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f  upplying data */
11d30 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
11d40 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68  Dest,      /* Wh
11d50 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20  ere to send the 
11d60 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65  data */.  int re
11d70 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20  gReturn,        
11d80 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
11d90 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
11da0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
11db0 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v,            /*
11dc0 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74   Previous result
11dd0 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75   register.  No u
11de0 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a  niqueness if 0 *
11df0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
11e00 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46  yInfo,      /* F
11e10 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74  or comparing wit
11e20 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  h previous entry
11e30 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65   */.  int p4type
11e40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
11e50 20 54 68 65 20 70 34 20 74 79 70 65 20 66 6f 72   The p4 type for
11e60 20 70 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69   pKeyInfo */.  i
11e70 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
11e80 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
11e90 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68  ere if we hit th
11ea0 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20  e LIMIT */.){.  
11eb0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
11ec0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
11ed0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20  Continue;.  int 
11ee0 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20  addr;..  addr = 
11ef0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
11f00 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f  ntAddr(v);.  iCo
11f10 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
11f20 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11f30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
11f40 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20   duplicates for 
11f50 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
11f60 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20  nd INTERSECT .  
11f70 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76  */.  if( regPrev
11f80 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20   ){.    int j1, 
11f90 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c  j2;.    j1 = sql
11fa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11fb0 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50  , OP_IfNot, regP
11fc0 72 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73  rev);.    j2 = s
11fd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11fe0 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
11ff0 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72  pIn->iMem, regPr
12000 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c  ev+1, pIn->nMem,
12010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
12030 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
12040 70 34 74 79 70 65 29 3b 0a 20 20 20 20 73 71 6c  p4type);.    sql
12050 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12060 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c  , OP_Jump, j2+2,
12070 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32   iContinue, j2+2
12080 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12090 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
120a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
120b0 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73  prCodeCopy(pPars
120c0 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65  e, pIn->iMem, re
120d0 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d  gPrev+1, pIn->nM
120e0 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  em);.    sqlite3
120f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12100 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
12110 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Prev);.  }.  if(
12120 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
12130 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
12140 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  rn 0;..  /* Supp
12150 72 65 73 73 20 74 68 65 20 74 68 65 20 66 69 72  ress the the fir
12160 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65  st OFFSET entrie
12170 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  s if there is an
12180 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20   OFFSET clause. 
12190 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74   */.  codeOffset
121a0 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
121b0 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44  );..  switch( pD
121c0 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20  est->eDest ){.  
121d0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
121e0 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
121f0 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
12200 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
12210 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
12220 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
12230 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
12240 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
12250 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
12260 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
12270 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
12280 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
12290 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
122a0 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
122b0 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70  rd, pIn->iMem, p
122c0 49 6e 2d 3e 6e 4d 65 6d 2c 20 72 31 29 3b 0a 20  In->nMem, r1);. 
122d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
122e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
122f0 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 50  Rowid, pDest->iP
12300 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
12310 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12320 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
12330 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 31  pDest->iParm, r1
12340 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
12350 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
12360 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
12370 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D);.      sqlite
12380 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
12390 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
123a0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
123b0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
123c0 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
123d0 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
123e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
123f0 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
12400 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
12410 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
12420 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
12430 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
12440 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
12450 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
12460 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
12470 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
12480 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
12490 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
124a0 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
124b0 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
124c0 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
124d0 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
124e0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
124f0 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nMem==1 );.     
12500 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 0a   p->affinity = .
12510 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12520 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
12530 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
12540 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66  pExpr, pDest->af
12550 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 72  finity);.      r
12560 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
12570 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
12580 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12590 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
125a0 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d  eRecord, pIn->iM
125b0 65 6d 2c 20 31 2c 20 72 31 2c 20 26 70 2d 3e 61  em, 1, r1, &p->a
125c0 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
125d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
125e0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
125f0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
12600 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  Mem, 1);.      s
12610 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12620 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
12630 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
12640 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
12650 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
12660 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
12670 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12680 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65 76 65  ..#if 0  /* Neve
12690 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f  r occurs on an O
126a0 52 44 45 52 20 42 59 20 71 75 65 72 79 20 2a 2f  RDER BY query */
126b0 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
126c0 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ow exist in the 
126d0 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f  result set, reco
126e0 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64  rd that fact and
126f0 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20   abort..    */. 
12700 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
12710 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts: {.      sqli
12720 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12730 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
12740 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20  pDest->iParm);. 
12750 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
12760 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
12770 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
12780 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
12790 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
127a0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
127b0 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
127c0 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
127d0 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
127e0 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
127f0 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
12800 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
12810 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
12820 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
12830 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
12840 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
12850 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  /.    case SRT_M
12860 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
12870 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31  rt( pIn->nMem==1
12880 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
12890 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
128a0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  arse, pIn->iMem,
128b0 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 31   pDest->iParm, 1
128c0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
128d0 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
128e0 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
128f0 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
12900 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12910 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
12920 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12930 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
12940 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64     /* Send the d
12950 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  ata to the callb
12960 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  ack function or 
12970 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e  to a subroutine.
12980 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20    In the.    ** 
12990 63 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75  case of a subrou
129a0 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75  tine, the subrou
129b0 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72  tine itself is r
129c0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20  esponsible for. 
129d0 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68     ** popping th
129e0 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
129f0 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20  stack..    */.  
12a00 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
12a10 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
12a20 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30  ( pDest->iMem==0
12a30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
12a40 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c 69 74 65  t->iMem = sqlite
12a50 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
12a60 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29  arse, pIn->nMem)
12a70 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
12a80 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e 6e 4d 65  >nMem = pIn->nMe
12a90 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
12aa0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12ab0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
12ac0 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69  ->iMem, pDest->i
12ad0 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  Mem, pDest->nMem
12ae0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12af0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12b00 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
12b10 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  Parm);.      bre
12b20 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
12b30 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b  ase SRT_Callback
12b40 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
12b50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12b60 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e  P_ResultRow, pIn
12b70 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65  ->iMem, pIn->nMe
12b80 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
12b90 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
12ba0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
12bb0 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d   pIn->iMem, pIn-
12bc0 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62 72  >nMem);.      br
12bd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
12be0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12bf0 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
12c00 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
12c10 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
12c20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
12c30 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
12c40 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
12c50 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
12c60 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
12c70 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
12c80 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
12c90 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
12ca0 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
12cb0 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
12cc0 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
12cd0 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
12ce0 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
12cf0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
12d00 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
12d10 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61  lt: {.      brea
12d20 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
12d30 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
12d40 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
12d50 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d   loop if the LIM
12d60 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20  IT is reached.. 
12d70 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   */.  if( p->iLi
12d80 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
12d90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12da0 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c  OP_AddImm, p->iL
12db0 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73  imit, -1);.    s
12dc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12dd0 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70  (v, OP_IfZero, p
12de0 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
12df0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
12e00 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75  erate the subrou
12e10 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f  tine return.  */
12e20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
12e30 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
12e40 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69  ontinue);.  sqli
12e50 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12e60 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
12e70 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72  eturn);..  retur
12e80 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
12e90 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d   Alternative com
12ea0 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64  pound select cod
12eb0 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20  e generator for 
12ec0 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65  cases when there
12ed0 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20  .** is an ORDER 
12ee0 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  BY clause..**.**
12ef0 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65   We assume a que
12f00 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ry of the follow
12f10 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  ing form:.**.** 
12f20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20       <selectA>  
12f30 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c  <operator>  <sel
12f40 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20  ectB>  ORDER BY 
12f50 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a  <orderbylist>.**
12f60 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
12f70 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41  s one of UNION A
12f80 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  LL, UNION, EXCEP
12f90 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e  T, or INTERSECT.
12fa0 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73    The idea.** is
12fb0 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73   to code both <s
12fc0 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c  electA> and <sel
12fd0 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f  ectB> with the O
12fe0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
12ff0 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73  s.** co-routines
13000 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20  .  Then run the 
13010 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70  co-routines in p
13020 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67  arallel and merg
13030 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
13040 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
13050 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  .  In addition t
13060 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  o the two corout
13070 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c  ines (called sel
13080 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65  ectA and.** sele
13090 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37  ctB) there are 7
130a0 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a   subroutines:.**
130b0 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20  .**    outA:    
130c0 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
130d0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63  of the selectA c
130e0 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
130f0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
13100 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
13110 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
13120 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20  *.**    outB:   
13130 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
13140 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20   of the selectB 
13150 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
13160 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
13170 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
13180 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
13190 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64   (Only generated
131a0 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a   for UNION and.*
131b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
131c0 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54  ION ALL.  EXCEPT
131d0 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20   and INSERTSECT 
131e0 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72  never output a r
131f0 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ow that.**      
13200 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f         appears o
13210 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a  nly in B.).**.**
13220 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c      AltB:    Cal
13230 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
13240 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
13250 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
13260 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65  A<B..**.**    Ae
13270 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  qB:    Called wh
13280 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
13290 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
132a0 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a  tines and A==B..
132b0 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20  **.**    AgtB:  
132c0 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
132d0 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
132e0 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
132f0 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20   and A>B..**.** 
13300 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c     EofA:    Call
13310 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
13320 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
13330 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20  electA..**.**   
13340 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64   EofB:    Called
13350 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
13360 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
13370 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ectB..**.** The 
13380 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
13390 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76  f the latter fiv
133a0 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65  e subroutines de
133b0 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a  pend on which .*
133c0 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
133d0 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20  used:.**.**.**  
133e0 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
133f0 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49   ALL         UNI
13400 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58  ON            EX
13410 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e  CEPT          IN
13420 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20  TERSECT.**      
13430 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
13440 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
13450 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
13460 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
13470 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74  -------.**   Alt
13480 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
13490 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
134a0 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
134b0 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
134c0 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20  A.**.**   AeqB: 
134d0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
134e0 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
134f0 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
13500 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
13510 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20  A.**.**   AgtB: 
13520 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
13530 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
13540 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20          nextB   
13550 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a           nextB.*
13560 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f  *.**   EofA:   o
13570 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
13580 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
13590 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20       halt       
135a0 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
135b0 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c     EofB:   outA,
135c0 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
135d0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
135e0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
135f0 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20    halt.**.** In 
13600 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  the AltB, AeqB, 
13610 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74  and AgtB subrout
13620 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20  ines, an EOF on 
13630 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  A following next
13640 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69  A.** causes an i
13650 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
13660 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46   EofA and an EOF
13670 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20   on B following 
13680 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20  nextB causes.** 
13690 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
136a0 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68  p to EofB.  With
136b0 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  in EofA and EofB
136c0 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74  , and EOF on ent
136d0 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  ry or.** followi
136e0 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20  ng nextX causes 
136f0 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  a jump to the en
13700 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  d of the select 
13710 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
13720 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  * Duplicate remo
13730 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e  val in the UNION
13740 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
13750 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73  TERSECT cases is
13760 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68   handled.** with
13770 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  in the output su
13780 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72  broutine.  The r
13790 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20  egPrev register 
137a0 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72  set holds the pr
137b0 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70  eviously.** outp
137c0 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d  ut value.  A com
137d0 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20  parison is made 
137e0 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c  against this val
137f0 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ue and the outpu
13800 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20  t.** is skipped 
13810 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75  if the next resu
13820 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65  lts would be the
13830 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65   same as the pre
13840 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  vious..**.** The
13850 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13860 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65  plan is to imple
13870 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72  ment the two cor
13880 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65  outines and seve
13890 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73  n.** subroutines
138a0 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74   first, then put
138b0 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67   the control log
138c0 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  ic at the bottom
138d0 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
138e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74  .**          got
138f0 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f  o Init.**     co
13900 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  A: coroutine for
13910 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a   left query (A).
13920 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f  **     coB: coro
13930 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
13940 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20  query (B).**    
13950 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outA: output one
13960 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20   row of A.**    
13970 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outB: output one
13980 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e   row of B (UNION
13990 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   and UNION ALL o
139a0 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  nly).**    EofA:
139b0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a   ....**    EofB:
139c0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a   ....**    AltB:
139d0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a   ....**    AeqB:
139e0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a   ....**    AgtB:
139f0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a   ....**    Init:
13a00 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f   initialize coro
13a10 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a  utine registers.
13a20 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
13a30 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20  d coA.**        
13a40 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f    if eof(A) goto
13a50 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20   EofA.**        
13a60 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20    yield coB.**  
13a70 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42          if eof(B
13a80 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20  ) goto EofB.**  
13a90 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20    Cmpr: Compare 
13aa0 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20  A, B.**         
13ab0 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42   Jump AltB, AeqB
13ac0 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e  , AgtB.**     En
13ad0 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  d: ....**.** We 
13ae0 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c  call AltB, AeqB,
13af0 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64   AgtB, EofA, and
13b00 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e   EofB "subroutin
13b10 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65  es" but they are
13b20 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79   not.** actually
13b30 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f   called using Go
13b40 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20  sub and they do 
13b50 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66  not Return.  Eof
13b60 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a  A and EofB loop.
13b70 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74  ** until all dat
13b80 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74  a is exhausted t
13b90 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  hen jump to the 
13ba0 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74  "end" labe.  Alt
13bb0 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20  B, AeqB,.** and 
13bc0 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74  AgtB jump to eit
13bd0 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65  her L2 or to one
13be0 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42   of EofA or EofB
13bf0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
13c00 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
13c10 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20  D_SELECT.static 
13c20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
13c30 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
13c40 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
13c50 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
13c60 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
13c70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
13c80 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
13c90 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
13ca0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
13cb0 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
13cc0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
13cd0 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
13ce0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
13cf0 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
13d00 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
13d10 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
13d20 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
13d30 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
13d40 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
13d50 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
13d60 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
13d70 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
13d80 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
13d90 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
13da0 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65  destA;     /* De
13db0 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
13dc0 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53  routine A */.  S
13dd0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b  electDest destB;
13de0 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
13df0 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
13e00 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  e B */.  int reg
13e10 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f  AddrA;         /
13e20 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
13e30 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
13e40 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
13e50 6e 74 20 72 65 67 45 6f 66 41 3b 20 20 20 20 20  nt regEofA;     
13e60 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20       /* Flag to 
13e70 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73 65  indicate when se
13e80 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c 65  lect-A is comple
13e90 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41  te */.  int regA
13ea0 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrB;         /*
13eb0 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
13ec0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63  r for select-B c
13ed0 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
13ee0 74 20 72 65 67 45 6f 66 42 3b 20 20 20 20 20 20  t regEofB;      
13ef0 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69      /* Flag to i
13f00 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c  ndicate when sel
13f10 65 63 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65 74  ect-B is complet
13f20 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
13f30 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20  electA;      /* 
13f40 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
13f50 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
13f60 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
13f70 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20  electB;      /* 
13f80 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
13f90 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
13fa0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
13fb0 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tA;          /* 
13fc0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
13fd0 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
13fe0 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  A subroutine */.
13ff0 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20    int regOutB;  
14000 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
14010 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
14020 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
14030 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
14040 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20   addrOutA;      
14050 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
14060 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
14070 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
14080 74 20 61 64 64 72 4f 75 74 42 3b 20 20 20 20 20  t addrOutB;     
14090 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
140a0 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  f the output-B s
140b0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
140c0 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20  nt addrEofA;    
140d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
140e0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d  of the select-A-
140f0 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
14100 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
14110 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  drEofB;         
14120 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
14130 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75  e select-B-exhau
14140 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
14150 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74  */.  int addrAlt
14160 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
14170 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42  dress of the A<B
14180 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
14190 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20   int addrAeqB;  
141a0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
141b0 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75  s of the A==B su
141c0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
141d0 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20  t addrAgtB;     
141e0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
141f0 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75  f the A>B subrou
14200 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
14210 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20  gLimitA;        
14220 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
14230 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
14240 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
14250 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  B;        /* Lim
14260 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
14270 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
14280 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
14290 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f      /* A range o
142a0 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  f registers to h
142b0 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74  old previous out
142c0 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  put */.  int sav
142d0 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  edLimit;       /
142e0 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
142f0 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20   p->iLimit */.  
14300 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b  int savedOffset;
14310 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
14320 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73  alue of p->iOffs
14330 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  et */.  int labe
14340 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  lCmpr;        /*
14350 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73   Label for the s
14360 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67  tart of the merg
14370 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  e algorithm */. 
14380 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20   int labelEnd;  
14390 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
143a0 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  for the end of t
143b0 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43  he overall SELEC
143c0 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20  T stmt */.  int 
143d0 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  j1;             
143e0 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75    /* Jump instru
143f0 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20  ctions that get 
14400 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20  retargetted */. 
14410 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
14420 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
14430 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f   TK_ALL, TK_UNIO
14440 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b  N, TK_EXCEPT, TK
14450 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20  _INTERSECT */.  
14460 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70  KeyInfo *pKeyDup
14470 3b 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69  ;     /* Compari
14480 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
14490 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65  for duplicate re
144a0 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e  moval */.  KeyIn
144b0 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20  fo *pKeyMerge;  
144c0 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
144d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d  nformation for m
144e0 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erging rows */. 
144f0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
14500 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
14510 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
14520 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
14530 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
14540 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
14550 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
14560 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
14570 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
14580 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
14590 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ause */.  int *a
145a0 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20  Permute;        
145b0 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
145c0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
145d0 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  o result set col
145e0 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 4e 6f 74  umns */.  u8 Not
145f0 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  Used;           
14600 2f 2a 20 44 75 6d 6d 79 20 76 61 72 69 61 62 6c  /* Dummy variabl
14610 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
14620 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20   p->pOrderBy!=0 
14630 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
14640 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72  ->db;.  v = pPar
14650 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
14660 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   v==0 ) return S
14670 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6c  QLITE_NOMEM;.  l
14680 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65  abelEnd = sqlite
14690 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
146a0 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d  );.  labelCmpr =
146b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
146c0 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a  Label(v);...  /*
146d0 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f 52   Patch up the OR
146e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
146f0 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b  */.  op = p->op;
14700 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d    .  pPrior = p-
14710 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72  >pPrior;.  asser
14720 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  t( pPrior->pOrde
14730 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64  rBy==0 );.  pOrd
14740 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
14750 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  By;.  assert( pO
14760 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20  rderBy );.  if( 
14770 70 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f  processCompoundO
14780 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70  rderBy(pParse, p
14790 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
147a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
147b0 7d 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  }.  nOrderBy = p
147c0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
147d0 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
147e0 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
147f0 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
14800 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
14810 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
14820 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
14830 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
14840 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
14850 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
14860 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
14870 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
14880 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
14890 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
148a0 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
148b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
148c0 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
148d0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
148e0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
148f0 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 29 7b 0a 20  OrderBy; j++){. 
14900 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65         Expr *pTe
14910 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  rm = pOrderBy->a
14920 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [j].pExpr;.     
14930 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
14940 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
14950 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
14960 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67  rt( (pTerm->flag
14970 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  s & EP_IntValue)
14980 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
14990 66 28 20 70 54 65 72 6d 2d 3e 69 54 61 62 6c 65  f( pTerm->iTable
149a0 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==i ) break;.   
149b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
149c0 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ==nOrderBy ){.  
149d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
149e0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
149f0 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47  pParse, TK_INTEG
14a00 45 52 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ER, 0, 0, 0);.  
14a10 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d        if( pNew==
14a20 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
14a30 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
14a40 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
14a50 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20  EP_IntValue;.   
14a60 20 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 6c       pNew->iTabl
14a70 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  e = i;.        p
14a80 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
14a90 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
14aa0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
14ab0 2c 20 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20  , pNew, 0);.    
14ac0 20 20 20 20 6e 4f 72 64 65 72 42 79 2b 2b 3b 0a      nOrderBy++;.
14ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14ae0 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
14af0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70  the comparison p
14b00 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b  ermutation and k
14b10 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75  eyinfo that is u
14b20 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68  sed with.  ** th
14b30 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 69 6e  e permutation in
14b40 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 61 72   order to compar
14b50 69 73 6f 6e 73 20 74 6f 20 64 65 74 65 72 6d 69  isons to determi
14b60 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20  ne if the next. 
14b70 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c   ** row of resul
14b80 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65  ts comes from se
14b90 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42  lectA or selectB
14ba0 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c  .  Also add expl
14bb0 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  icit.  ** collat
14bc0 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45  ions to the ORDE
14bd0 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
14be0 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  s so that when t
14bf0 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  he subqueries.  
14c00 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  ** to the right 
14c10 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65  and the left are
14c20 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79   evaluated, they
14c30 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74   use the correct
14c40 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e  .  ** collation.
14c50 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65  .  */.  aPermute
14c60 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
14c70 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
14c80 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b  (int)*nOrderBy);
14c90 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20  .  if( aPermute 
14ca0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
14cb0 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
14cc0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54  {.      Expr *pT
14cd0 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  erm = pOrderBy->
14ce0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
14cf0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
14d00 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
14d10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14d20 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26   (pTerm->flags &
14d30 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30   EP_IntValue)!=0
14d40 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75   );.      aPermu
14d50 74 65 5b 69 5d 20 3d 20 70 54 65 72 6d 2d 3e 69  te[i] = pTerm->i
14d60 54 61 62 6c 65 2d 31 3b 0a 20 20 20 20 20 20 61  Table-1;.      a
14d70 73 73 65 72 74 28 20 61 50 65 72 6d 75 74 65 5b  ssert( aPermute[
14d80 69 5d 3e 3d 30 20 26 26 20 61 50 65 72 6d 75 74  i]>=0 && aPermut
14d90 65 5b 69 5d 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e  e[i]<p->pEList->
14da0 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 7d 0a 20  nExpr );.    }. 
14db0 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 0a 20     pKeyMerge =. 
14dc0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 4d 61       sqlite3DbMa
14dd0 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
14de0 6f 66 28 2a 70 4b 65 79 4d 65 72 67 65 29 2b 6e  of(*pKeyMerge)+n
14df0 4f 72 64 65 72 42 79 2a 28 73 69 7a 65 6f 66 28  OrderBy*(sizeof(
14e00 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20  CollSeq*)+1));. 
14e10 20 20 20 69 66 28 20 70 4b 65 79 4d 65 72 67 65     if( pKeyMerge
14e20 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65   ){.      pKeyMe
14e30 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  rge->aSortOrder 
14e40 3d 20 28 75 38 2a 29 26 70 4b 65 79 4d 65 72 67  = (u8*)&pKeyMerg
14e50 65 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42  e->aColl[nOrderB
14e60 79 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65  y];.      pKeyMe
14e70 72 67 65 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f  rge->nField = nO
14e80 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 4b  rderBy;.      pK
14e90 65 79 4d 65 72 67 65 2d 3e 65 6e 63 20 3d 20 45  eyMerge->enc = E
14ea0 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f  NC(db);.      fo
14eb0 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
14ec0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
14ed0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
14ee0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
14ef0 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d  Term = pOrderBy-
14f00 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
14f10 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
14f20 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
14f30 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
14f40 20 20 20 70 43 6f 6c 6c 20 3d 20 70 54 65 72 6d     pColl = pTerm
14f50 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ->pColl;.       
14f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14f70 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53    pColl = multiS
14f80 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
14f90 72 73 65 2c 20 70 2c 20 61 50 65 72 6d 75 74 65  rse, p, aPermute
14fa0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
14fb0 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20  pTerm->flags |= 
14fc0 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
14fd0 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
14fe0 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20  pColl = pColl;. 
14ff0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15000 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c   pKeyMerge->aCol
15010 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[i] = pColl;.  
15020 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
15030 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
15040 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
15050 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  sortOrder;.     
15060 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
15070 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  {.    pKeyMerge 
15080 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
15090 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45  eattach the ORDE
150a0 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74  R BY clause to t
150b0 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
150c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
150d0 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f  OrderBy;.  pPrio
150e0 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  r->pOrderBy = sq
150f0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
15100 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
15110 64 65 72 42 79 29 3b 0a 0a 20 20 2f 2a 20 41 6c  derBy);..  /* Al
15120 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f  locate a range o
15130 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  f temporary regi
15140 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65  sters and the Ke
15150 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a  yInfo needed.  *
15160 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20  * for the logic 
15170 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70  that removes dup
15180 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f  licate result ro
15190 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ws when the.  **
151a0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
151b0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
151c0 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f  NTERSECT (but no
151d0 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20  t UNION ALL)..  
151e0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
151f0 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72  ALL ){.    regPr
15200 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ev = 0;.  }else{
15210 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
15220 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
15230 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  r;.    assert( n
15240 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 29  OrderBy>=nExpr )
15250 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
15260 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
15270 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70  nge(pParse, nExp
15280 72 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r+1);.    sqlite
15290 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
152a0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
152b0 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79  gPrev);.    pKey
152c0 44 75 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Dup = sqlite3DbM
152d0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20  allocZero(db,.  
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152f0 73 69 7a 65 6f 66 28 2a 70 4b 65 79 44 75 70 29  sizeof(*pKeyDup)
15300 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66   + nExpr*(sizeof
15310 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b  (CollSeq*)+1) );
15320 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70  .    if( pKeyDup
15330 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 44 75   ){.      pKeyDu
15340 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  p->aSortOrder = 
15350 28 75 38 2a 29 26 70 4b 65 79 44 75 70 2d 3e 61  (u8*)&pKeyDup->a
15360 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20  Coll[nExpr];.   
15370 20 20 20 70 4b 65 79 44 75 70 2d 3e 6e 46 69 65     pKeyDup->nFie
15380 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20  ld = nExpr;.    
15390 20 20 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d    pKeyDup->enc =
153a0 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20   ENC(db);.      
153b0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
153c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
153d0 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69  pKeyDup->aColl[i
153e0 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
153f0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
15400 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  , i);.        pK
15410 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
15420 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
15430 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20  }.    }.  }. .  
15440 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20  /* Separate the 
15450 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67  left and the rig
15460 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e  ht query from on
15470 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20  e another.  */. 
15480 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
15490 20 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74    pPrior->pRight
154a0 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 72 6f 63  most = 0;.  proc
154b0 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28  essOrderGroupBy(
154c0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f  pParse, p, p->pO
154d0 72 64 65 72 42 79 2c 20 31 2c 20 26 4e 6f 74 55  rderBy, 1, &NotU
154e0 73 65 64 29 3b 0a 20 20 69 66 28 20 70 50 72 69  sed);.  if( pPri
154f0 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b  or->pPrior==0 ){
15500 0a 20 20 20 20 70 72 6f 63 65 73 73 4f 72 64 65  .    processOrde
15510 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
15520 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d   pPrior, pPrior-
15530 3e 70 4f 72 64 65 72 42 79 2c 20 31 2c 20 26 4e  >pOrderBy, 1, &N
15540 6f 74 55 73 65 64 29 3b 0a 20 20 7d 0a 0a 20 20  otUsed);.  }..  
15550 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c  /* Compute the l
15560 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 2a  imit registers *
15570 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
15580 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
15590 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  , p, labelEnd);.
155a0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
155b0 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  && op==TK_ALL ){
155c0 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
155d0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
155e0 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d  .    regLimitB =
155f0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
15600 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15610 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
15620 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20  y, p->iOffset ? 
15630 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70  p->iOffset+1 : p
15640 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20  ->iLimit,.      
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15660 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4c              regL
15670 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  imitA);.    sqli
15680 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15690 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d   OP_Copy, regLim
156a0 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b  itA, regLimitB);
156b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
156c0 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d  gLimitA = regLim
156d0 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  itB = 0;.  }.  s
156e0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
156f0 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
15700 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  .  p->pLimit = 0
15710 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
15720 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
15730 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66  fset);.  p->pOff
15740 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41  set = 0;..  regA
15750 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrA = ++pParse-
15760 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 41  >nMem;.  regEofA
15770 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
15780 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20  m;.  regAddrB = 
15790 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
157a0 20 20 72 65 67 45 6f 66 42 20 3d 20 2b 2b 70 50    regEofB = ++pP
157b0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
157c0 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  gOutA = ++pParse
157d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
157e0 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
157f0 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  em;.  sqlite3Sel
15800 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
15810 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tA, SRT_Coroutin
15820 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  e, regAddrA);.  
15830 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
15840 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52  tInit(&destB, SR
15850 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
15860 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75  AddrB);..  /* Ju
15870 6d 70 20 70 61 73 74 20 74 68 65 20 76 61 72 69  mp past the vari
15880 6f 75 73 20 73 75 62 72 6f 75 74 69 6e 65 73 20  ous subroutines 
15890 61 6e 64 20 63 6f 72 6f 75 74 69 6e 65 73 20 74  and coroutines t
158a0 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20  o the main.  ** 
158b0 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  merge loop.  */.
158c0 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
158d0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
158e0 6f 74 6f 29 3b 0a 20 20 61 64 64 72 53 65 6c 65  oto);.  addrSele
158f0 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctA = sqlite3Vdb
15900 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15910 0a 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ...  /* Generate
15920 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
15930 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
15940 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
15950 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f   the.  ** left o
15960 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f  f the compound o
15970 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41  perator - the "A
15980 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  " select..  */. 
15990 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
159a0 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f  ((v, "Begin coro
159b0 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53  utine for left S
159c0 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69  ELECT"));.  pPri
159d0 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67  or->iLimit = reg
159e0 4c 69 6d 69 74 41 3b 0a 20 20 73 71 6c 69 74 65  LimitA;.  sqlite
159f0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
15a00 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 2c 20  pPrior, &destA, 
15a10 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  0, 0, 0);.  sqli
15a20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15a30 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
15a40 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  regEofA);.  sqli
15a50 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
15a60 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
15a70 64 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  drA);.  VdbeNoop
15a80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
15a90 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
15aa0 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a  eft SELECT"));..
15ab0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
15ac0 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
15ad0 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
15ae0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
15af0 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
15b00 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
15b10 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
15b20 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
15b30 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
15b40 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
15b50 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f  ((v, "Begin coro
15b60 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
15b70 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76  SELECT"));.  sav
15b80 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  edLimit = p->iLi
15b90 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73  mit;.  savedOffs
15ba0 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
15bb0 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  .  p->iLimit = r
15bc0 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69  egLimitB;.  p->i
15bd0 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20  Offset = 0;  .  
15be0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
15bf0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 2c  arse, p, &destB,
15c00 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 70 2d 3e   0, 0, 0);.  p->
15c10 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69  iLimit = savedLi
15c20 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  mit;.  p->iOffse
15c30 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b  t = savedOffset;
15c40 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15c50 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
15c60 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42 29 3b  er, 1, regEofB);
15c70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15c80 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
15c90 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 56  , regAddrB);.  V
15ca0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
15cb0 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e  v, "End coroutin
15cc0 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45  e for right SELE
15cd0 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  CT"));..  /* Gen
15ce0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
15cf0 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
15d00 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
15d10 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65  of the A.  ** se
15d20 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
15d30 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
15d40 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
15d50 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ct..  */.  VdbeN
15d60 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
15d70 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
15d80 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f  or A"));.  addrO
15d90 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utA = generateOu
15da0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
15db0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
15dc0 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
15dd0 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  A, pDest, regOut
15de0 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  A,.             
15df0 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
15e00 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  yDup, P4_KEYINFO
15e10 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62 65 6c 45  _HANDOFF, labelE
15e20 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e  nd);.  .  /* Gen
15e30 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
15e40 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
15e50 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
15e60 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65  of the B.  ** se
15e70 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
15e80 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
15e90 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
15ea0 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ct..  */.  if( o
15eb0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
15ec0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
15ed0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
15ee0 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
15ef0 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20  tine for B"));. 
15f00 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65     addrOutB = ge
15f10 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
15f20 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f40 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74  p, &destB, pDest
15f50 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20  , regOutB,.     
15f60 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
15f70 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50 34  rev, pKeyDup, P4
15f80 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 2c  _KEYINFO_STATIC,
15f90 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a   labelEnd);.  }.
15fa0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
15fb0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
15fc0 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
15fd0 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
15fe0 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
15ff0 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
16000 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
16010 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56  emains..  */.  V
16020 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
16030 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
16040 74 69 6e 65 22 29 29 3b 0a 20 20 69 66 28 20 6f  tine"));.  if( o
16050 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
16060 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
16070 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41   ){.    addrEofA
16080 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16090 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
160a0 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20   0, labelEnd);. 
160b0 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 61 64   }else{  .    ad
160c0 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
160d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
160e0 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 6c 61  _If, regEofB, la
160f0 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c  belEnd);.    sql
16100 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16110 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
16120 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
16130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16140 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
16150 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
16160 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16170 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
16180 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  0, addrEofA);.  
16190 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
161a0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
161b0 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
161c0 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
161d0 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t B.  ** are exh
161e0 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
161f0 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41  data in select A
16200 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
16210 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45   if( op==TK_INTE
16220 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
16230 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41  rEofB = addrEofA
16240 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
16250 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
16260 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72  ((v, "eof-B subr
16270 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
16280 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65  ddrEofB = sqlite
16290 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
162a0 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 6c  P_If, regEofA, l
162b0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71  abelEnd);.    sq
162c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
162d0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
162e0 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
162f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16300 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
16310 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
16320 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16330 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
16340 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20   0, addrEofB);. 
16350 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
16360 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
16370 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42   the case of A<B
16380 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
16390 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c  Comment((v, "A-l
163a0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
163b0 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20  );.  addrAltB = 
163c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
163d0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
163e0 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
163f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16400 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
16410 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
16420 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16430 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
16440 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  EofA, addrEofA);
16450 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16460 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
16470 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
16480 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
16490 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
164a0 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20  e case of A==B. 
164b0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
164c0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72  _ALL ){.    addr
164d0 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
164e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
164f0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
16500 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
16510 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64  addrAltB;.    ad
16520 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73  drAltB++;.  }els
16530 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  e{.    VdbeNoopC
16540 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71  omment((v, "A-eq
16550 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
16560 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  ;.    addrAeqB =
16570 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16580 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
16590 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
165a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
165b0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
165c0 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41  egEofA, addrEofA
165d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
165e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
165f0 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
16600 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  r);.  }..  /* Ge
16610 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
16620 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
16630 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A>B.  */.  Vdb
16640 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
16650 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74   "A-gt-B subrout
16660 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67  ine"));.  addrAg
16670 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
16680 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
16690 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
166a0 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
166b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
166c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
166d0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
166e0 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20  addrOutB);.  }. 
166f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16700 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
16710 72 65 67 41 64 64 72 42 29 3b 0a 20 20 73 71 6c  regAddrB);.  sql
16720 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16730 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42  , OP_If, regEofB
16740 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 73  , addrEofB);.  s
16750 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16760 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
16770 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
16780 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73  * This code runs
16790 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c   once to initial
167a0 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a  ize everything..
167b0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
167c0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
167d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
167e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
167f0 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 41  eger, 0, regEofA
16800 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16810 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
16820 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 42  eger, 0, regEofB
16830 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16840 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
16850 75 62 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ub, regAddrA, ad
16860 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 73 71  drSelectA);.  sq
16870 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16880 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
16890 41 64 64 72 42 2c 20 61 64 64 72 53 65 6c 65 63  AddrB, addrSelec
168a0 74 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tB);.  sqlite3Vd
168b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
168c0 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72  f, regEofA, addr
168d0 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofA);.  sqlite3
168e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
168f0 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64  _If, regEofB, ad
16900 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20 49  drEofB);..  /* I
16910 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69  mplement the mai
16920 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  n merge loop.  *
16930 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
16940 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
16950 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c  abelCmpr);.  sql
16960 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
16970 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  , OP_Permutation
16980 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
16990 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49  *)aPermute, P4_I
169a0 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69  NTARRAY);.  sqli
169b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
169c0 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73   OP_Compare, des
169d0 74 41 2e 69 4d 65 6d 2c 20 64 65 73 74 42 2e 69  tA.iMem, destB.i
169e0 4d 65 6d 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20  Mem, nOrderBy,. 
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a00 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
16a10 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59  KeyMerge, P4_KEY
16a20 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
16a30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16a40 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
16a50 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71  ddrAltB, addrAeq
16a60 42 2c 20 61 64 64 72 41 67 74 42 29 3b 0a 0a 20  B, addrAgtB);.. 
16a70 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 65 6d 70   /* Release temp
16a80 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 0a  orary registers.
16a90 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72    */.  if( regPr
16aa0 65 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ev ){.    sqlite
16ab0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
16ac0 65 28 70 50 61 72 73 65 2c 20 72 65 67 50 72 65  e(pParse, regPre
16ad0 76 2c 20 6e 4f 72 64 65 72 42 79 2b 31 29 3b 0a  v, nOrderBy+1);.
16ae0 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
16af0 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74  o the this point
16b00 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72   in order to ter
16b10 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79  minate the query
16b20 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
16b30 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
16b40 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a  (v, labelEnd);..
16b50 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d    /* Set the num
16b60 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f  ber of output co
16b70 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
16b80 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
16b90 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
16ba0 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
16bb0 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  t = pPrior;.    
16bc0 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
16bd0 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
16be0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
16bf0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
16c00 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
16c10 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
16c20 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  st);.  }..  /* R
16c30 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f  eassembly the co
16c40 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20  mpound query so 
16c50 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
16c60 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  freed correctly.
16c70 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c    ** by the call
16c80 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
16c90 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
16ca0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
16cb0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
16cc0 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20  ->pPrior);.  }. 
16cd0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
16ce0 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44  ior;..  /*** TBD
16cf0 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75  :  Insert subrou
16d00 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c  tine calls to cl
16d10 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69  ose cursors on i
16d20 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a  ncomplete.  ****
16d30 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a   subqueries ****
16d40 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  /.  return SQLIT
16d50 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
16d60 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
16d70 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16d80 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
16d90 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
16da0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c  ./* Forward Decl
16db0 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  arations */.stat
16dc0 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
16dd0 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20  rList(sqlite3*, 
16de0 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20  ExprList*, int, 
16df0 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
16e00 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
16e10 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65  ect(sqlite3*, Se
16e20 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70  lect *, int, Exp
16e30 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  rList *);../*.**
16e40 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   Scan through th
16e50 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
16e60 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65  pr.  Replace eve
16e70 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  ry reference to.
16e80 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
16e90 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62  able number iTab
16ea0 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  le with a copy o
16eb0 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  f the iColumn-th
16ec0 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c  .** entry in pEL
16ed0 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65  ist.  (But leave
16ee0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
16ef0 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
16f00 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a  .** unchanged.).
16f10 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
16f20 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ne is part of th
16f30 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f  e flattening pro
16f40 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75  cedure.  A subqu
16f50 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73  ery.** whose res
16f60 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e  ult set is defin
16f70 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70  ed by pEList app
16f80 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e  ears as entry in
16f90 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
16fa0 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
16fb0 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44  such that the VD
16fc0 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e  BE cursor assign
16fd0 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f  ed to that.** FO
16fe0 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  RM clause entry 
16ff0 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73  is iTable.  This
17000 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68   routine make th
17010 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
17020 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
17030 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
17040 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
17050 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
17060 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
17070 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
17080 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
17090 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
170a0 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
170b0 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
170c0 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  b,        /* Rep
170d0 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
170e0 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63  s to this connec
170f0 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
17100 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
17110 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
17120 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
17130 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  rs */.  int iTab
17140 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
17150 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
17160 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
17170 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
17180 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78  /* Substitute ex
17190 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  pressions */.){.
171a0 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
171b0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
171c0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
171d0 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
171e0 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
171f0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
17200 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
17210 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
17220 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
17230 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
17240 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ew;.      assert
17250 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
17260 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
17270 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
17280 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
17290 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
172a0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
172b0 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   && pExpr->pList
172c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
172d0 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45  w = pEList->a[pE
172e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
172f0 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
17300 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20  t( pNew!=0 );.  
17310 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
17320 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20  pNew->op;.      
17330 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
17340 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Left==0 );.     
17350 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
17360 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
17370 62 2c 20 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b  b, pNew->pLeft);
17380 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17390 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
173a0 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
173b0 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
173c0 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65 77  ExprDup(db, pNew
173d0 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
173e0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
173f0 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
17400 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d    pExpr->pList =
17410 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
17420 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c  Dup(db, pNew->pL
17430 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ist);.      pExp
17440 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77  r->iTable = pNew
17450 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
17460 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 4e  pExpr->pTab = pN
17470 65 77 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  ew->pTab;.      
17480 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
17490 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a   pNew->iColumn;.
174a0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
174b0 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a  g = pNew->iAgg;.
174c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
174d0 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45 78 70  enCopy(db, &pExp
174e0 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d  r->token, &pNew-
174f0 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  >token);.      s
17500 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
17510 64 62 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e  db, &pExpr->span
17520 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a  , &pNew->span);.
17530 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 53 65        pExpr->pSe
17540 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
17550 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4e 65 77  lectDup(db, pNew
17560 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
17570 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d    pExpr->flags =
17580 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20   pNew->flags;.  
17590 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
175a0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
175b0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61  Expr->pLeft, iTa
175c0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
175d0 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
175e0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
175f0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
17600 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
17610 64 62 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  db, pExpr->pSele
17620 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ct, iTable, pELi
17630 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
17640 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72  prList(db, pExpr
17650 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  ->pList, iTable,
17660 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
17670 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
17680 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c  tExprList(.  sql
17690 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
176a0 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
176b0 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
176c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
176d0 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist,     /* List
176e0 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
176f0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
17700 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69  bstitutes */.  i
17710 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
17720 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
17730 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
17740 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
17750 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
17760 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
17770 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
17780 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
17790 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
177a0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
177b0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74   i++){.    subst
177c0 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Expr(db, pList->
177d0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
177e0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
177f0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
17800 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71  ubstSelect(.  sq
17810 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
17820 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
17830 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20  loc errors here 
17840 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
17850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
17860 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
17870 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
17880 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a  ubstitutions */.
17890 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
178a0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
178b0 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a  to be replaced *
178c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
178d0 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
178e0 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
178f0 0a 29 7b 0a 20 20 69 66 28 20 21 70 20 29 20 72  .){.  if( !p ) r
17900 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78  eturn;.  substEx
17910 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45  prList(db, p->pE
17920 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
17930 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
17940 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47  prList(db, p->pG
17950 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20  roupBy, iTable, 
17960 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
17970 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
17980 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65  pOrderBy, iTable
17990 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
179a0 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48  stExpr(db, p->pH
179b0 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70  aving, iTable, p
179c0 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
179d0 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  xpr(db, p->pWher
179e0 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  e, iTable, pELis
179f0 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63  t);.  substSelec
17a00 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  t(db, p->pPrior,
17a10 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
17a20 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
17a30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
17a40 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
17a50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
17a60 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23  OMIT_VIEW) */..#
17a70 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
17a80 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
17a90 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
17aa0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
17ab0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
17ac0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
17ad0 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
17ae0 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70  s in order to sp
17af0 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  eed.** execution
17b00 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20  .  It returns 1 
17b10 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
17b20 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
17b30 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63  flattening.** oc
17b40 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
17b50 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
17b60 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
17b70 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
17b80 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
17b90 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
17ba0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
17bb0 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
17bc0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
17bd0 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
17be0 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
17bf0 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
17c00 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
17c10 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
17c20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
17c30 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
17c40 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
17c50 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
17c60 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
17c70 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
17c80 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
17c90 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
17ca0 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
17cb0 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
17cc0 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
17cd0 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
17ce0 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
17cf0 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
17d00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
17d10 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17d20 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
17d30 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
17d40 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
17d50 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
17d60 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
17d70 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
17d80 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
17d90 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
17da0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
17db0 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
17dc0 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
17dd0 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
17de0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
17df0 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69  d for this simpi
17e00 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
17e10 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
17e20 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
17e30 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
17e40 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
17e50 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
17e60 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
17e70 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
17e80 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
17e90 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
17ea0 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
17eb0 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
17ec0 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
17ed0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
17ee0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
17ef0 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
17f00 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
17f10 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17f20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
17f30 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
17f40 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
17f50 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
17f60 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
17f70 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
17f80 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
17f90 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62  *   (3)  The sub
17fa0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
17fb0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
17fc0 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a  f a left outer j
17fd0 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20  oin, or.**      
17fe0 20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69    the subquery i
17ff0 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a  s not itself a j
18000 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33  oin.  (Ticket #3
18010 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  06).**.**   (4) 
18020 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
18030 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
18040 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
18050 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
18060 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65  **.**   (5)  The
18070 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
18080 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
18090 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
180a0 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
180b0 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
180c0 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65  **.**   (6)  The
180d0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
180e0 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
180f0 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
18100 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
18110 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a        DISTINCT..
18120 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65  **.**   (7)  The
18130 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20   subquery has a 
18140 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
18150 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75  **   (8)  The su
18160 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
18170 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
18180 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
18190 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
181a0 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62  *   (9)  The sub
181b0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
181c0 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
181d0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
181e0 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
181f0 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
18200 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20  *.**  (10)  The 
18210 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
18220 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
18230 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
18240 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
18250 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54         use LIMIT
18260 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ..**.**  (11)  T
18270 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
18280 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
18290 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  do not both have
182a0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
182b0 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20  s..**.**  (12)  
182c0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
182d0 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65  not the right te
182e0 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  rm of a LEFT OUT
182f0 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a  ER JOIN or the.*
18300 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72  *        subquer
18310 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
18320 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62  lause.  (added b
18330 79 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a  y ticket #350).*
18340 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
18350 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
18360 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
18370 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a  both use LIMIT.*
18380 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20  *.**  (14)  The 
18390 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
183a0 74 20 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a  t use OFFSET.**.
183b0 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75  **  (15)  The ou
183c0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
183d0 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
183e0 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68  und select or th
183f0 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71  e.**        subq
18400 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61  uery does not ha
18410 76 65 20 62 6f 74 68 20 61 6e 20 4f 52 44 45 52  ve both an ORDER
18420 20 42 59 20 61 6e 64 20 61 20 4c 49 4d 49 54 20   BY and a LIMIT 
18430 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20  clause..**      
18440 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32    (See ticket #2
18450 33 33 39 29 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29  339).**.**  (16)
18460 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
18470 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
18480 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62  egate or the sub
18490 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20  query does.**   
184a0 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e       not contain
184b0 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63   ORDER BY.  (Tic
184c0 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73  ket #2942)  This
184d0 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74   used to not mat
184e0 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e  ter.**        un
184f0 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65  til we introduce
18500 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63  d the group_conc
18510 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  at() function.  
18520 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68  .**.**  (17)  Th
18530 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
18540 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  ot a compound se
18550 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61  lect, or it is a
18560 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20   UNION ALL .**  
18570 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63        compound c
18580 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e  lause made up en
18590 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67  tirely of non-ag
185a0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c  gregate queries,
185b0 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20   and .**        
185c0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
185d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
185e0 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66   * is not itself
185f0 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
18600 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20  und select,.**  
18610 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
18620 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
18630 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c   DISTINCT query,
18640 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
18650 20 2a 20 68 61 73 20 6e 6f 20 6f 74 68 65 72 20   * has no other 
18660 74 61 62 6c 65 73 20 6f 72 20 73 75 62 2d 73 65  tables or sub-se
18670 6c 65 63 74 73 20 69 6e 20 74 68 65 20 46 52 4f  lects in the FRO
18680 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
18690 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e         The paren
186a0 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20  t and sub-query 
186b0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  may contain WHER
186c0 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65  E clauses. Subje
186d0 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ct to.**        
186e0 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29  rules (11), (13)
186f0 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20   and (14), they 
18700 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
18710 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20   ORDER BY,.**   
18720 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f       LIMIT and O
18730 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 0a 2a  FFSET clauses..*
18740 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74  *.**  (18)  If t
18750 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
18760 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
18770 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d  t, then all term
18780 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20  s of the.**     
18790 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75     ORDER by clau
187a0 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  se of the parent
187b0 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20   must be simple 
187c0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a  references to .*
187d0 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73  *        columns
187e0 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
187f0 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  y..**.** In this
18800 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70   routine, the "p
18810 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
18820 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
18830 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20  outer query..** 
18840 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
18850 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  p->pSrc->a[iFrom
18860 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75  ].  isAgg is tru
18870 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  e if the outer q
18880 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67  uery.** uses agg
18890 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71  regates and subq
188a0 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75  ueryIsAgg is tru
188b0 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
188c0 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
188d0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74  s..**.** If flat
188e0 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74  tening is not at
188f0 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f  tempted, this ro
18900 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
18910 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a   and returns 0..
18920 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
18930 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68   is attempted th
18940 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
18950 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ns 1..**.** All 
18960 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
18970 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20  n analysis must 
18980 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68  occur on both th
18990 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
189a0 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72  d.** the subquer
189b0 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  y before this ro
189c0 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73  utine runs..*/.s
189d0 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65  tatic int flatte
189e0 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72  nSubquery(.  Par
189f0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
18a00 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
18a10 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
18a20 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
18a30 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20  * The parent or 
18a40 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61  outer SELECT sta
18a50 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
18a60 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
18a70 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
18a80 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  pSrc->a[] of the
18a90 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20   inner subquery 
18aa0 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20  */.  int isAgg, 
18ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
18ac0 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43  e if outer SELEC
18ad0 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  T uses aggregate
18ae0 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
18af0 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67  int subqueryIsAg
18b00 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  g    /* True if 
18b10 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
18b20 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
18b30 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  tions */.){.  co
18b40 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
18b50 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
18b60 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
18b70 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50  xt;.  Select *pP
18b80 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20  arent;.  Select 
18b90 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20  *pSub;       /* 
18ba0 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
18bb0 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f  or "subquery" */
18bc0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31  .  Select *pSub1
18bd0 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ;      /* Pointe
18be0 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f  r to the rightmo
18bf0 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62  st select in sub
18c00 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c  -query */.  SrcL
18c10 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
18c20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
18c30 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
18c40 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
18c50 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
18c60 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
18c70 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
18c80 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  y */.  ExprList 
18c90 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  *pList;    /* Th
18ca0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
18cb0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
18cc0 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
18cd0 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45  ;        /* VDBE
18ce0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
18cf0 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c  f the pSub resul
18d00 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65  t set temp table
18d10 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
18d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
18d30 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
18d40 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
18d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d60 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
18d70 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
18d80 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
18d90 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65  ubitem;   /* The
18da0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73   subquery */.  s
18db0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
18dc0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43  rse->db;..  /* C
18dd0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
18de0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
18df0 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
18e00 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
18e10 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
18e20 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
18e30 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
18e40 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
18e50 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
18e60 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
18e70 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  item = &pSrc->a[
18e80 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e  iFrom];.  iParen
18e90 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43  t = pSubitem->iC
18ea0 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20  ursor;.  pSub = 
18eb0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
18ec0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
18ed0 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  b!=0 );.  if( is
18ee0 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49  Agg && subqueryI
18ef0 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
18f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f10 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
18f20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75  (1)  */.  if( su
18f30 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70  bqueryIsAgg && p
18f40 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
18f50 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
18f60 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
18f70 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72  (2)  */.  pSubSr
18f80 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
18f90 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
18fa0 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20  c );.  /* Prior 
18fb0 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32  to version 3.1.2
18fc0 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  , when LIMIT and
18fd0 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62   OFFSET had to b
18fe0 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e  e simple constan
18ff0 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62  ts,.  ** not arb
19000 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73 69  itrary expresssi
19010 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20  ons, we allowed 
19020 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f  some combining o
19030 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  f LIMIT and OFFS
19040 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  ET.  ** because 
19050 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f  they could be co
19060 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c  mputed at compil
19070 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65  e-time.  But whe
19080 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
19090 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61  ET.  ** became a
190a0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
190b0 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f  ions, we were fo
190c0 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74  rced to add rest
190d0 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20  rictions (13).  
190e0 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a  ** and (14). */.
190f0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
19100 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20  it && p->pLimit 
19110 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
19120 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
19130 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a  riction (13) */.
19140 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66    if( pSub->pOff
19150 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  set ) return 0; 
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19170 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
19180 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a  riction (14) */.
19190 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d    if( p->pRightm
191a0 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  ost && pSub->pLi
191b0 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  mit && pSub->pOr
191c0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74  derBy ){.    ret
191d0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19200 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
19210 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
19220 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
19230 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19250 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
19260 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
19270 66 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73 74  f( (pSub->isDist
19280 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 70 4c  inct || pSub->pL
19290 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 20  imit) .         
192a0 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
192b0 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 20 20 20   || isAgg) ){   
192c0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
192d0 63 74 69 6f 6e 73 20 28 34 29 28 35 29 28 38 29  ctions (4)(5)(8)
192e0 28 39 29 20 2a 2f 0a 20 20 20 20 20 72 65 74 75  (9) */.     retu
192f0 72 6e 20 30 3b 20 20 20 20 20 20 20 0a 20 20 7d  rn 0;       .  }
19300 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74  .  if( p->isDist
19310 69 6e 63 74 20 26 26 20 73 75 62 71 75 65 72 79  inct && subquery
19320 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
19330 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
19340 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f  triction (6)  */
19350 0a 20 20 69 66 28 20 28 70 2d 3e 64 69 73 61 6c  .  if( (p->disal
19360 6c 6f 77 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d  lowOrderBy || p-
19370 3e 70 4f 72 64 65 72 42 79 29 20 26 26 20 70 53  >pOrderBy) && pS
19380 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
19390 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
193d0 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a  riction (11) */.
193e0 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20    }.  if( isAgg 
193f0 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
19400 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  y ) return 0;   
19410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19420 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29  Restriction (16)
19430 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69   */..  /* Restri
19440 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65  ction 3:  If the
19450 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
19460 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
19470 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a  he subquery is .
19480 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73    ** not used as
19490 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
194a0 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a  nd of an outer j
194b0 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f  oin.  Examples o
194c0 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20  f why this.  ** 
194d0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
194e0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
194f0 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
19500 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
19510 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
19520 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
19530 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
19540 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
19550 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
19560 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
19570 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
19580 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
19590 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
195a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
195b0 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20  bSrc->nSrc>1 && 
195c0 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
195d0 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
195e0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
195f0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
19600 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49  striction 12:  I
19610 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
19620 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
19630 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
19640 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d  ter.  ** join, m
19650 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
19660 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
19670 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20  RE clause..  ** 
19680 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77  An examples of w
19690 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
196a0 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
196b0 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
196c0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45  T OUTER JOIN (SE
196d0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
196e0 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a  HERE t2.x>0).  *
196f0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
19700 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
19710 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
19720 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
19730 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
19740 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e  IN t2) WHERE t2.
19750 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75  x>0.  **.  ** Bu
19760 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73  t the t2.x>0 tes
19770 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  t will always fa
19780 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  il on a NULL row
19790 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20   of t2, which.  
197a0 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  ** effectively c
197b0 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45  onverts the OUTE
197c0 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49  R JOIN into an I
197d0 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a  NNER JOIN..  */.
197e0 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d    if( (pSubitem-
197f0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  >jointype & JT_O
19800 55 54 45 52 29 21 3d 30 20 26 26 20 70 53 75 62  UTER)!=0 && pSub
19810 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20  ->pWhere!=0 ){. 
19820 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
19830 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
19840 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73 75  on 17: If the su
19850 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
19860 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68  pound SELECT, th
19870 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20  en it must.  ** 
19880 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49  use only the UNI
19890 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e  ON ALL operator.
198a0 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65   And none of the
198b0 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71   simple select q
198c0 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74  ueries.  ** that
198d0 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d   make up the com
198e0 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65  pound SELECT are
198f0 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61   allowed to be a
19900 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73 74  ggregate or dist
19910 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65  inct.  ** querie
19920 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
19930 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ub->pPrior ){.  
19940 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
19950 7c 7c 20 69 73 41 67 67 20 7c 7c 20 70 2d 3e 69  || isAgg || p->i
19960 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 72  sDistinct || pSr
19970 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
19980 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
19990 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62    }.    for(pSub
199a0 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70  1=pSub; pSub1; p
199b0 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69  Sub1=pSub1->pPri
199c0 6f 72 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  or){.      if( p
199d0 53 75 62 31 2d 3e 69 73 41 67 67 20 7c 7c 20 70  Sub1->isAgg || p
199e0 53 75 62 31 2d 3e 69 73 44 69 73 74 69 6e 63 74  Sub1->isDistinct
199f0 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75   .       || (pSu
19a00 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
19a10 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
19a20 20 0a 20 20 20 20 20 20 20 7c 7c 20 21 70 53 75   .       || !pSu
19a30 62 31 2d 3e 70 53 72 63 20 7c 7c 20 70 53 75 62  b1->pSrc || pSub
19a40 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  1->pSrc->nSrc!=1
19a50 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
19a60 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
19a70 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
19a80 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38  * Restriction 18
19a90 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
19aa0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
19ab0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
19ac0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
19ad0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
19ae0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
19af0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 2d  Expr *pExpr = p-
19b00 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d  >pOrderBy->a[ii]
19b10 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
19b20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
19b30 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
19b40 72 2d 3e 69 54 61 62 6c 65 21 3d 69 50 61 72 65  r->iTable!=iPare
19b50 6e 74 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  nt ){ .         
19b60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
19b70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
19b80 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 72 73 65   }.  }..  pParse
19b90 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
19ba0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
19bb0 3b 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68 43  ;.  sqlite3AuthC
19bc0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
19bd0 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
19be0 2c 20 30 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  , 0);.  pParse->
19bf0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
19c00 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
19c10 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
19c20 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
19c30 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
19c40 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 69 74  atement, then it
19c50 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 61 20   must be.  ** a 
19c60 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68  UNION ALL and th
19c70 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d  e parent query m
19c80 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f  ust be of the fo
19c90 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
19ca0 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c    SELECT <expr-l
19cb0 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d  ist> FROM (<sub-
19cc0 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63  query>) <where-c
19cd0 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a  lause> .  **.  *
19ce0 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  * followed by an
19cf0 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
19d00 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20  T and/or OFFSET 
19d10 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c  clauses. This bl
19d20 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73  ock.  ** creates
19d30 20 4e 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65   N copies of the
19d40 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69   parent query wi
19d50 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20  thout any ORDER 
19d60 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20  BY, LIMIT or .  
19d70 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  ** OFFSET clause
19d80 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d  s and joins them
19d90 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   to the left-han
19da0 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72  d-side of the or
19db0 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e  iginal.  ** usin
19dc0 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  g UNION ALL oper
19dd0 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ators. In this c
19de0 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ase N is the num
19df0 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20  ber of simple.  
19e00 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  ** select statem
19e10 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70  ents in the comp
19e20 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ound sub-query..
19e30 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d    */.  for(pSub=
19e40 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53  pSub->pPrior; pS
19e50 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  ub; pSub=pSub->p
19e60 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
19e70 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78  ct *pNew;.    Ex
19e80 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
19e90 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
19ea0 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
19eb0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
19ec0 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
19ed0 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
19ee0 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
19ef0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
19f00 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
19f10 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  0;.    p->pSrc =
19f20 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f   0;.    p->pPrio
19f30 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c  r = 0;.    p->pL
19f40 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
19f50 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ew = sqlite3Sele
19f60 63 74 44 75 70 28 64 62 2c 20 70 29 3b 0a 20 20  ctDup(db, p);.  
19f70 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
19f80 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e   pPrior;.    p->
19f90 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
19fa0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
19fb0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70   pOrderBy;.    p
19fc0 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20  ->op = TK_ALL;. 
19fd0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
19fe0 63 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  c;.    p->pLimit
19ff0 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70   = pLimit;.    p
1a000 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
1a010 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67  set;.    p->pRig
1a020 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20  htmost = 0;.    
1a030 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74  pNew->pRightmost
1a040 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1a050 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
1a060 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
1a070 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
1a080 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65  ermitted for the
1a090 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65  .  ** iFrom-th e
1a0a0 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
1a0b0 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f   clause in the o
1a0c0 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
1a0d0 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20  .  pSub = pSub1 
1a0e0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
1a0f0 65 63 74 3b 0a 20 20 66 6f 72 28 70 50 61 72 65  ect;.  for(pPare
1a100 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70  nt=p; pParent; p
1a110 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e  Parent=pParent->
1a120 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75  pPrior, pSub=pSu
1a130 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
1a140 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53  int nSubSrc = pS
1a150 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20  ubSrc->nSrc;.   
1a160 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
1a170 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d  0;.    pSubSrc =
1a180 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 20   pSub->pSrc;.   
1a190 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
1a1a0 3e 70 53 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 4d  >pSrc;..    /* M
1a1b0 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46  ove all of the F
1a1c0 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ROM elements of 
1a1d0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
1a1e0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65  o the.    ** the
1a1f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1a200 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1a210 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
1a220 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
1a230 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
1a240 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f  number for the o
1a250 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75  riginal outer qu
1a260 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  ery FROM element
1a270 20 69 6e 0a 20 20 20 20 2a 2a 20 69 50 61 72 65   in.    ** iPare
1a280 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
1a290 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
1a2a0 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
1a2b0 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 20  sequent code.   
1a2c0 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78   ** will scan ex
1a2d0 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e  pressions lookin
1a2e0 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65  g for iParent re
1a2f0 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70  ferences and rep
1a300 6c 61 63 65 0a 20 20 20 20 2a 2a 20 74 68 6f 73  lace.    ** thos
1a310 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
1a320 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
1a330 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
1a340 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
1a350 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20      ** elements 
1a360 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
1a370 6e 67 20 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ng in..    */.  
1a380 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20    if( pSrc ){.  
1a390 20 20 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26      pSubitem = &
1a3a0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
1a3b0 20 20 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20        nSubSrc = 
1a3c0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20  pSubSrc->nSrc;. 
1a3d0 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20       jointype = 
1a3e0 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
1a3f0 70 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pe;.      sqlite
1a400 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 75  3DeleteTable(pSu
1a410 62 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  bitem->pTab);.  
1a420 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1a430 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
1a440 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
1a450 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1a460 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  db, pSubitem->zN
1a470 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
1a480 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1a490 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
1a4a0 0a 20 20 20 20 20 20 70 53 75 62 69 74 65 6d 2d  .      pSubitem-
1a4b0 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  >pTab = 0;.     
1a4c0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1a4d0 62 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  base = 0;.      
1a4e0 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pSubitem->zName 
1a4f0 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 75 62 69  = 0;.      pSubi
1a500 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b  tem->zAlias = 0;
1a510 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
1a520 53 75 62 53 72 63 21 3d 31 20 7c 7c 20 21 70 53  SubSrc!=1 || !pS
1a530 72 63 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rc ){.      int 
1a540 65 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20  extra = nSubSrc 
1a550 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  - 1;.      for(i
1a560 3d 28 70 53 72 63 3f 31 3a 30 29 3b 20 69 3c 6e  =(pSrc?1:0); i<n
1a570 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
1a580 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c        pSrc = sql
1a590 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1a5a0 64 28 64 62 2c 20 70 53 72 63 2c 20 30 2c 20 30  d(db, pSrc, 0, 0
1a5b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1a5c0 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
1a5d0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
1a5e0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
1a5f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1a600 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1a610 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63     pParent->pSrc
1a620 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66   = pSrc;.      f
1a630 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
1a640 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f  1; i-extra>=iFro
1a650 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20  m; i--){.       
1a660 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53   pSrc->a[i] = pS
1a670 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a  rc->a[i-extra];.
1a680 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a690 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
1a6a0 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
1a6b0 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
1a6c0 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
1a6d0 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  i];.      memset
1a6e0 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c  (&pSubSrc->a[i],
1a6f0 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53   0, sizeof(pSubS
1a700 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20  rc->a[i]));.    
1a710 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46  }.    pSrc->a[iF
1a720 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  rom].jointype = 
1a730 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20  jointype;.  .   
1a740 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75   /* Now begin su
1a750 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75  bstituting subqu
1a760 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65  ery result set e
1a770 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a  xpressions for .
1a780 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
1a790 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74  s to the iParent
1a7a0 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
1a7b0 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  ery..    ** .   
1a7c0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
1a7d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c   **.    **   SEL
1a7e0 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52  ECT a+5, b*10 FR
1a7f0 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41  OM (SELECT x*3 A
1a800 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46  S a, y+10 AS b F
1a810 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e  ROM t1) WHERE a>
1a820 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20  b;.    **   \   
1a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a840 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
1a850 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f   subquery ______
1a860 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f  ____/          /
1a870 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f  .    **    \____
1a880 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1a890 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
1a8a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1a8b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20  ____________/.  
1a8c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c    **.    ** We l
1a8d0 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70  ook at every exp
1a8e0 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f  ression in the o
1a8f0 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65  uter query and e
1a900 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
1a910 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20  e.    ** "a" we 
1a920 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22  substitute "x*3"
1a930 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
1a940 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73   we see "b" we s
1a950 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22  ubstitute "y+10"
1a960 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69  ..    */.    pLi
1a970 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45  st = pParent->pE
1a980 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  List;.    for(i=
1a990 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1a9a0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; i++){.      E
1a9b0 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20  xpr *pExpr;.    
1a9c0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
1a9d0 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70  ].zName==0 && (p
1a9e0 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
1a9f0 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e  i].pExpr)->span.
1aa00 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z!=0 ){.        
1aa10 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1aa20 65 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20  e = .           
1aa30 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72      sqlite3DbStr
1aa40 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
1aa50 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70  pExpr->span.z, p
1aa60 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  Expr->span.n);. 
1aa70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1aa80 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1aa90 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69  b, pParent->pELi
1aaa0 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  st, iParent, pSu
1aab0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
1aac0 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
1aad0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1aae0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47  (db, pParent->pG
1aaf0 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c  roupBy, iParent,
1ab00 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1ab10 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 28        substExpr(
1ab20 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  db, pParent->pHa
1ab30 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
1ab40 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1ab50 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62    }.    if( pSub
1ab60 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1ab70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1ab80 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ent->pOrderBy==0
1ab90 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
1aba0 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t->pOrderBy = pS
1abb0 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
1abc0 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72      pSub->pOrder
1abd0 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  By = 0;.    }els
1abe0 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70  e if( pParent->p
1abf0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1ac00 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1ac10 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  b, pParent->pOrd
1ac20 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  erBy, iParent, p
1ac30 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1ac40 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62    }.    if( pSub
1ac50 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
1ac60 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74    pWhere = sqlit
1ac70 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
1ac80 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  ub->pWhere);.   
1ac90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57   }else{.      pW
1aca0 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  here = 0;.    }.
1acb0 20 20 20 20 69 66 28 20 73 75 62 71 75 65 72 79      if( subquery
1acc0 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61  IsAgg ){.      a
1acd0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1ace0 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20  pHaving==0 );.  
1acf0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
1ad00 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e  ving = pParent->
1ad10 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50  pWhere;.      pP
1ad20 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
1ad30 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 73 75  pWhere;.      su
1ad40 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
1ad50 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  ent->pHaving, iP
1ad60 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1ad70 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1ad80 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
1ad90 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
1ada0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
1adb0 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ng, .           
1adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1add0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ade0 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  prDup(db, pSub->
1adf0 70 48 61 76 69 6e 67 29 29 3b 0a 20 20 20 20 20  pHaving));.     
1ae00 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1ae10 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
1ae20 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1ae30 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
1ae40 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
1ae50 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79  , pSub->pGroupBy
1ae60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1ae70 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62      substExpr(db
1ae80 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
1ae90 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
1aea0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
1aeb0 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1aec0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
1aed0 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  d(db, pParent->p
1aee0 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a  Where, pWhere);.
1aef0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
1af00 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75  The flattened qu
1af10 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20  ery is distinct 
1af20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e  if either the in
1af30 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ner or the.    *
1af40 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  * outer query is
1af50 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20   distinct. .    
1af60 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  */.    pParent->
1af70 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  isDistinct = pPa
1af80 72 65 6e 74 2d 3e 69 73 44 69 73 74 69 6e 63 74  rent->isDistinct
1af90 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74   || pSub->isDist
1afa0 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a  inct;.  .    /*.
1afb0 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e      ** SELECT ..
1afc0 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  . FROM (SELECT .
1afd0 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45  .. LIMIT a OFFSE
1afe0 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46  T b) LIMIT x OFF
1aff0 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20  SET y;.    **.  
1b000 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
1b010 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
1b020 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
1b030 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
1b040 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a    But this.    *
1b050 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  * does not work 
1b060 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20  if either limit 
1b070 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20  is negative..   
1b080 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
1b090 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
1b0a0 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69    pParent->pLimi
1b0b0 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  t = pSub->pLimit
1b0c0 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c  ;.      pSub->pL
1b0d0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  imit = 0;.    }.
1b0e0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c    }..  /* Finial
1b0f0 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20  ly, delete what 
1b100 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73  is left of the s
1b110 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75  ubquery and retu
1b120 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e  rn.  ** success.
1b130 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
1b140 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1b150 70 53 75 62 31 29 3b 0a 0a 20 20 72 65 74 75 72  pSub1);..  retur
1b160 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
1b170 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1b180 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1b190 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1b1a0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
1b1b0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
1b1c0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1b1d0 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61  ment passed as a
1b1e0 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65  n argument to se
1b1f0 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20  e if it.** is a 
1b200 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
1b210 75 65 72 79 2e 20 52 65 74 75 72 6e 20 57 48 45  uery. Return WHE
1b220 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f  RE_ORDERBY_MIN o
1b230 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  r WHERE_ORDERBY_
1b240 4d 41 58 20 69 66 20 0a 2a 2a 20 69 74 20 69 73  MAX if .** it is
1b250 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65  , or 0 otherwise
1b260 2e 20 41 74 20 70 72 65 73 65 6e 74 2c 20 61 20  . At present, a 
1b270 71 75 65 72 79 20 69 73 20 63 6f 6e 73 69 64 65  query is conside
1b280 72 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d  red to be.** a m
1b290 69 6e 28 29 2f 6d 61 78 28 29 20 71 75 65 72 79  in()/max() query
1b2a0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20   if:.**.**   1. 
1b2b0 54 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c  There is a singl
1b2c0 65 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  e object in the 
1b2d0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
1b2e0 2a 2a 20 20 20 32 2e 20 54 68 65 72 65 20 69 73  **   2. There is
1b2f0 20 61 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73   a single expres
1b300 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75  sion in the resu
1b310 6c 74 20 73 65 74 2c 20 61 6e 64 20 69 74 20 69  lt set, and it i
1b320 73 0a 2a 2a 20 20 20 20 20 20 65 69 74 68 65 72  s.**      either
1b330 20 6d 69 6e 28 78 29 20 6f 72 20 6d 61 78 28 78   min(x) or max(x
1b340 29 2c 20 77 68 65 72 65 20 78 20 69 73 20 61 20  ), where x is a 
1b350 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65  column reference
1b360 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b370 6d 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73  minMaxQuery(Pars
1b380 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
1b390 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70  t *p){.  Expr *p
1b3a0 45 78 70 72 3b 0a 20 20 45 78 70 72 4c 69 73 74  Expr;.  ExprList
1b3b0 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45   *pEList = p->pE
1b3c0 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c  List;..  if( pEL
1b3d0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
1b3e0 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  return WHERE_ORD
1b3f0 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70  ERBY_NORMAL;.  p
1b400 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Expr = pEList->a
1b410 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 70 45 4c  [0].pExpr;.  pEL
1b420 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
1b430 73 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  st;.  if( pExpr-
1b440 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
1b450 54 49 4f 4e 20 7c 7c 20 70 45 4c 69 73 74 3d 3d  TION || pEList==
1b460 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  0 || pEList->nEx
1b470 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
1b480 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ;.  if( pEList->
1b490 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d  a[0].pExpr->op!=
1b4a0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20  TK_AGG_COLUMN ) 
1b4b0 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  return WHERE_ORD
1b4c0 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69  ERBY_NORMAL;.  i
1b4d0 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
1b4e0 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20 57 48  n!=3 ) return WH
1b4f0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
1b500 41 4c 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  AL;.  if( sqlite
1b510 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
1b520 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
1b530 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "min",3)==0 ){. 
1b540 20 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f     return WHERE_
1b550 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d  ORDERBY_MIN;.  }
1b560 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
1b570 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
1b580 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
1b590 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  max",3)==0 ){.  
1b5a0 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f    return WHERE_O
1b5b0 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a  RDERBY_MAX;.  }.
1b5c0 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f    return WHERE_O
1b5d0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d  RDERBY_NORMAL;.}
1b5e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1b5f0 74 69 6e 65 20 72 65 73 6f 6c 76 65 73 20 61 6e  tine resolves an
1b600 79 20 6e 61 6d 65 73 20 75 73 65 64 20 69 6e 20  y names used in 
1b610 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
1b620 66 20 74 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65  f the.** supplie
1b630 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
1b640 6e 74 2e 20 49 66 20 74 68 65 20 53 45 4c 45 43  nt. If the SELEC
1b650 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
1b660 67 20 72 65 73 6f 6c 76 65 64 0a 2a 2a 20 69 73  g resolved.** is
1b670 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 74   a sub-select, t
1b680 68 65 6e 20 70 4f 75 74 65 72 4e 43 20 69 73 20  hen pOuterNC is 
1b690 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1b6a0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 0a 2a 2a   NameContext .**
1b6b0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 53   of the parent S
1b6c0 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ELECT..*/.int sq
1b6d0 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c  lite3SelectResol
1b6e0 76 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ve(.  Parse *pPa
1b6f0 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
1b700 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
1b710 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
1b720 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1b730 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
1b740 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
1b750 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ed. */.  NameCon
1b760 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20  text *pOuterNC  
1b770 2f 2a 20 54 68 65 20 6f 75 74 65 72 20 6e 61 6d  /* The outer nam
1b780 65 20 63 6f 6e 74 65 78 74 2e 20 4d 61 79 20 62  e context. May b
1b790 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20  e NULL. */.){.  
1b7a0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1b7b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1b7c0 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 69  sult set. */.  i
1b7d0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1b7e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1b7f0 2d 6c 6f 6f 70 20 76 61 72 69 61 62 6c 65 20 75  -loop variable u
1b800 73 65 64 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20  sed in multiple 
1b810 70 6c 61 63 65 73 20 2a 2f 0a 20 20 4e 61 6d 65  places */.  Name
1b820 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
1b830 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20         /* Local 
1b840 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a  name-context */.
1b850 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
1b860 75 70 42 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  upBy;        /* 
1b870 54 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61  The group by cla
1b880 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  use */..  /* If 
1b890 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  this routine has
1b8a0 20 72 75 6e 20 62 65 66 6f 72 65 2c 20 72 65 74   run before, ret
1b8b0 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  urn immediately.
1b8c0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73 52   */.  if( p->isR
1b8d0 65 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20 61  esolved ){.    a
1b8e0 73 73 65 72 74 28 20 21 70 4f 75 74 65 72 4e 43  ssert( !pOuterNC
1b8f0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
1b900 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1b910 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d 20  p->isResolved = 
1b920 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  1;..  /* If ther
1b930 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  e have already b
1b940 65 65 6e 20 65 72 72 6f 72 73 2c 20 64 6f 20 6e  een errors, do n
1b950 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28  othing. */.  if(
1b960 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
1b970 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1b980 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1b990 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68  .  /* Prepare th
1b9a0 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
1b9b0 6e 74 2e 20 54 68 69 73 20 63 61 6c 6c 20 77 69  nt. This call wi
1b9c0 6c 6c 20 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20  ll allocate all 
1b9d0 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 72 65 71  cursors.  ** req
1b9e0 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  uired to handle 
1b9f0 74 68 65 20 74 61 62 6c 65 73 20 61 6e 64 20 73  the tables and s
1ba00 75 62 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  ubqueries in the
1ba10 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
1ba20 2a 2f 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c  */.  if( prepSel
1ba30 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20  ectStmt(pParse, 
1ba40 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
1ba50 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1ba60 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65   }..  /* Resolve
1ba70 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
1ba80 20 69 6e 20 74 68 65 20 4c 49 4d 49 54 20 61 6e   in the LIMIT an
1ba90 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
1baa0 2e 20 54 68 65 73 65 0a 20 20 2a 2a 20 61 72 65  . These.  ** are
1bab0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20   not allowed to 
1bac0 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d  refer to any nam
1bad0 65 73 2c 20 73 6f 20 70 61 73 73 20 61 6e 20 65  es, so pass an e
1bae0 6d 70 74 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74  mpty NameContext
1baf0 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
1bb00 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
1bb10 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61  sNC));.  sNC.pPa
1bb20 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
1bb30 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
1bb40 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
1bb50 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a  , p->pLimit) ||.
1bb60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bb70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
1bb80 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 20  NC, p->pOffset) 
1bb90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1bba0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1bbb0 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65  .  /* Set up the
1bbc0 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74   local name-cont
1bbd0 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20 45  ext to pass to E
1bbe0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
1bbf0 29 20 74 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c 76  ) to.  ** resolv
1bc00 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
1bc10 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e  -list..  */.  sN
1bc20 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a  C.allowAgg = 1;.
1bc30 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
1bc40 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e 43 2e   p->pSrc;.  sNC.
1bc50 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e 43  pNext = pOuterNC
1bc60 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  ;..  /* Resolve 
1bc70 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65 73  names in the res
1bc80 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 70 45  ult set. */.  pE
1bc90 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
1bca0 3b 0a 20 20 69 66 28 20 21 70 45 4c 69 73 74 20  ;.  if( !pEList 
1bcb0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1bcc0 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69 3d 30  ERROR;.  for(i=0
1bcd0 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
1bce0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
1bcf0 72 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e  r *pX = pEList->
1bd00 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
1bd10 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
1bd20 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
1bd30 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20 72  , pX) ){.      r
1bd40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1bd50 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OR;.    }.  }.. 
1bd60 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
1bd70 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
1bd80 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 72  nctions in the r
1bd90 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e  esult-set, and n
1bda0 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20 2a 2a  o GROUP BY .  **
1bdb0 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20   expression, do 
1bdc0 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65 67  not allow aggreg
1bdd0 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20 74  ates in any of t
1bde0 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
1bdf0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ions..  */.  ass
1be00 65 72 74 28 20 21 70 2d 3e 69 73 41 67 67 20 29  ert( !p->isAgg )
1be10 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
1be20 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69 66  ->pGroupBy;.  if
1be30 28 20 70 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e  ( pGroupBy || sN
1be40 43 2e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20  C.hasAgg ){.    
1be50 70 2d 3e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20  p->isAgg = 1;.  
1be60 7d 65 6c 73 65 7b 0a 20 20 20 20 73 4e 43 2e 61  }else{.    sNC.a
1be70 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 7d  llowAgg = 0;.  }
1be80 0a 0a 20 20 2f 2a 20 49 66 20 61 20 48 41 56 49  ..  /* If a HAVI
1be90 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 72 65  NG clause is pre
1bea0 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 72 65  sent, then there
1beb0 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f 55 50   must be a GROUP
1bec0 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f   BY clause..  */
1bed0 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e  .  if( p->pHavin
1bee0 67 20 26 26 20 21 70 47 72 6f 75 70 42 79 20 29  g && !pGroupBy )
1bef0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1bf00 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
1bf10 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
1bf20 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
1bf30 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20  ore HAVING");.  
1bf40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bf50 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
1bf60 20 41 64 64 20 74 68 65 20 65 78 70 72 65 73 73   Add the express
1bf70 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68 65 20  ion list to the 
1bf80 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65 66  name-context bef
1bf90 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68 65 0a  ore parsing the.
1bfa0 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70 72 65    ** other expre
1bfb0 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 53 45  ssions in the SE
1bfc0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
1bfd0 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a  This is so that.
1bfe0 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
1bff0 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
1c000 61 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e 20  ause (etc.) can 
1c010 72 65 66 65 72 20 74 6f 20 65 78 70 72 65 73 73  refer to express
1c020 69 6f 6e 73 20 62 79 0a 20 20 2a 2a 20 61 6c 69  ions by.  ** ali
1c030 61 73 65 73 20 69 6e 20 74 68 65 20 72 65 73 75  ases in the resu
1c040 6c 74 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  lt set..  **.  *
1c050 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49  * Minor point: I
1c060 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
1c070 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  se, then the exp
1c080 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  ression will be.
1c090 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74 65    ** re-evaluate
1c0a0 64 20 66 6f 72 20 65 61 63 68 20 72 65 66 65 72  d for each refer
1c0b0 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f  ence to it..  */
1c0c0 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20  .  sNC.pEList = 
1c0d0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
1c0e0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
1c0f0 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
1c100 2d 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20 20 20  ->pWhere) ||.   
1c110 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73    sqlite3ExprRes
1c120 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20  olveNames(&sNC, 
1c130 70 2d 3e 70 48 61 76 69 6e 67 29 20 29 7b 0a 20  p->pHaving) ){. 
1c140 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c150 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1c160 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
1c170 7b 0a 20 20 20 20 69 66 28 20 70 72 6f 63 65 73  {.    if( proces
1c180 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  sOrderGroupBy(pP
1c190 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
1c1a0 65 72 42 79 2c 20 31 2c 20 26 73 4e 43 2e 68 61  erBy, 1, &sNC.ha
1c1b0 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 72  sAgg) ){.      r
1c1c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1c1d0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
1c1e0 69 66 28 20 70 72 6f 63 65 73 73 4f 72 64 65 72  if( processOrder
1c1f0 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
1c200 70 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20  p, pGroupBy, 0, 
1c210 26 73 4e 43 2e 68 61 73 41 67 67 29 20 29 7b 0a  &sNC.hasAgg) ){.
1c220 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c230 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
1c240 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
1c250 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1c260 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c270 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
1c280 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1c290 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
1c2a0 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
1c2b0 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
1c2c0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
1c2d0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
1c2e0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1c2f0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1c300 20 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70   .    for(i=0, p
1c310 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61  Item=pGroupBy->a
1c320 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
1c330 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
1c340 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 45 78  +){.      if( Ex
1c350 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 49  prHasProperty(pI
1c360 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41  tem->pExpr, EP_A
1c370 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  gg) ){.        s
1c380 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1c390 50 61 72 73 65 2c 20 22 61 67 67 72 65 67 61 74  Parse, "aggregat
1c3a0 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  e functions are 
1c3b0 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22  not allowed in "
1c3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68  .            "th
1c3d0 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
1c3e0 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  e");.        ret
1c3f0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1c400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c410 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
1c420 73 20 69 73 20 6f 6e 65 20 53 45 4c 45 43 54 20  s is one SELECT 
1c430 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2c 20 62  of a compound, b
1c440 65 20 73 75 72 65 20 74 6f 20 72 65 73 6f 6c 76  e sure to resolv
1c450 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 69 6e 20  e names.  ** in 
1c460 74 68 65 20 6f 74 68 65 72 20 53 45 4c 45 43 54  the other SELECT
1c470 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
1c480 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72  >pPrior ){.    r
1c490 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 65 6c  eturn sqlite3Sel
1c4a0 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
1c4b0 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 70 4f  e, p->pPrior, pO
1c4c0 75 74 65 72 4e 43 29 3b 0a 20 20 7d 65 6c 73 65  uterNC);.  }else
1c4d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1c4e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
1c4f0 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
1c500 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
1c510 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
1c520 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
1c530 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
1c540 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
1c550 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
1c560 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
1c570 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
1c580 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
1c590 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
1c5a0 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20  e simply stores 
1c5b0 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
1c5c0 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c  those memory cel
1c5d0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
1c5e0 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
1c5f0 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
1c600 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
1c610 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
1c620 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1c630 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
1c640 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
1c650 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70   *pFunc;.  if( p
1c660 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70  AggInfo->nFunc+p
1c670 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
1c680 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1c690 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
1c6a0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
1c6b0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
1c6c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c6d0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1c6e0 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  , pAggInfo->aCol
1c6f0 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  [i].iMem);.  }. 
1c700 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
1c710 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
1c720 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
1c730 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
1c740 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1c750 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1c760 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69  ull, 0, pFunc->i
1c770 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 46  Mem);.    if( pF
1c780 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d  unc->iDistinct>=
1c790 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
1c7a0 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78  *pE = pFunc->pEx
1c7b0 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
1c7c0 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45  ->pList==0 || pE
1c7d0 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ->pList->nExpr!=
1c7e0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
1c7f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c800 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 69  rse, "DISTINCT i
1c810 6e 20 61 67 67 72 65 67 61 74 65 20 6d 75 73 74  n aggregate must
1c820 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20   be followed ". 
1c830 20 20 20 20 20 20 20 20 20 20 22 62 79 20 61 6e            "by an
1c840 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20   expression");. 
1c850 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44         pFunc->iD
1c860 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
1c870 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c880 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
1c890 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
1c8a0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
1c8b0 65 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20  e, pE->pList);. 
1c8c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1c8d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
1c8e0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46  penEphemeral, pF
1c8f0 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20  unc->iDistinct, 
1c900 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
1c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c920 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
1c930 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
1c940 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OFF);.      }.  
1c950 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1c960 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
1c970 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
1c980 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
1c990 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
1c9a0 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
1c9b0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1c9c0 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
1c9d0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
1c9e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
1c9f0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1ca00 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1ca10 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1ca20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1ca30 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
1ca40 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
1ca50 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
1ca60 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
1ca70 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
1ca80 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
1ca90 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
1caa0 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69  >pList;.    sqli
1cab0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1cac0 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46   OP_AggFinal, pF
1cad0 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20  ->iMem, pList ? 
1cae0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
1caf0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1cb00 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
1cb10 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
1cb20 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a  FUNCDEF);.  }.}.
1cb30 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
1cb40 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65  e accumulator me
1cb50 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  mory cells for a
1cb60 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65  n aggregate base
1cb70 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
1cb80 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
1cb90 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1cba0 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75  oid updateAccumu
1cbb0 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
1cbc0 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
1cbd0 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
1cbe0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1cbf0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
1cc00 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
1cc10 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
1cc20 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
1cc30 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
1cc40 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
1cc50 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
1cc60 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
1cc70 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1cc80 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
1cc90 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
1cca0 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
1ccb0 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
1ccc0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1ccd0 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
1cce0 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 66 28  ->pList;.    if(
1ccf0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
1cd00 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nArg = pList->nE
1cd10 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67  xpr;.      regAg
1cd20 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1cd30 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1cd40 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  nArg);.      sql
1cd50 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
1cd60 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
1cd70 73 74 2c 20 72 65 67 41 67 67 2c 20 30 29 3b 0a  st, regAgg, 0);.
1cd80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cd90 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20   nArg = 0;.     
1cda0 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20   regAgg = 0;.   
1cdb0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69   }.    if( pF->i
1cdc0 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
1cdd0 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20       addrNext = 
1cde0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1cdf0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
1ce00 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29  ssert( nArg==1 )
1ce10 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  ;.      codeDist
1ce20 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
1ce30 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
1ce40 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
1ce50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ce60 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43  pF->pFunc->needC
1ce70 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ollSeq ){.      
1ce80 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
1ce90 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
1cea0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1ceb0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
1cec0 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
1ced0 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
1cee0 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
1cef0 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c  ->pFunc->needCol
1cf00 6c 53 65 71 20 69 73 20 74 72 75 65 20 2a 2f 0a  lSeq is true */.
1cf10 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
1cf20 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
1cf30 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
1cf40 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
1cf50 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1cf60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1cf70 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
1cf80 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
1cf90 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
1cfa0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
1cfb0 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
1cfc0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
1cfd0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1cfe0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1cff0 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
1d000 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
1d010 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
1d020 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d030 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1d040 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72  OP_AggStep, 0, r
1d050 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c  egAgg, pF->iMem,
1d060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d070 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
1d080 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
1d090 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  DEF);.    sqlite
1d0a0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1d0b0 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
1d0c0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
1d0d0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
1d0e0 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73  gg, nArg);.    s
1d0f0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1d100 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
1d110 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
1d120 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  rg);.    if( add
1d130 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
1d140 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1d150 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
1d160 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  xt);.    }.  }. 
1d170 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67   for(i=0, pC=pAg
1d180 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70  gInfo->aCol; i<p
1d190 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
1d1a0 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b  lator; i++, pC++
1d1b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1d1c0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1d1d0 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d  C->pExpr, pC->iM
1d1e0 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49  em);.  }.  pAggI
1d1f0 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
1d200 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = 0;.}../*.** Ge
1d210 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1d220 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54  the given SELECT
1d230 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
1d240 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
1d250 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  e distributed in
1d260 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65   various ways de
1d270 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a  pending on the.*
1d280 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1d290 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72  e SelectDest str
1d2a0 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
1d2b0 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44  o by argument pD
1d2c0 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77  est.** as follow
1d2d0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65  s:.**.**     pDe
1d2e0 73 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73  st->eDest    Res
1d2f0 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d  ult.**     -----
1d300 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
1d310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d330 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52  ------.**     SR
1d340 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e  T_Callback    In
1d350 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63  voke the callbac
1d360 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  k for each row o
1d370 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  f the result..**
1d380 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20  .**     SRT_Mem 
1d390 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69          Store fi
1d3a0 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65  rst result in me
1d3b0 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d  mory cell pDest-
1d3c0 3e 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  >iParm.**.**    
1d3d0 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20   SRT_Set        
1d3e0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
1d3f0 73 20 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20  s keys of table 
1d400 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a  pDest->iParm. .*
1d410 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1d420 20 20 20 20 20 20 41 70 70 6c 79 20 74 68 65 20        Apply the 
1d430 61 66 66 69 6e 69 74 79 20 70 44 65 73 74 2d 3e  affinity pDest->
1d440 61 66 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20  affinity before 
1d450 73 74 6f 72 69 6e 67 20 74 68 65 6d 2e 0a 2a 2a  storing them..**
1d460 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f  .**     SRT_Unio
1d470 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  n       Store re
1d480 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69  sults as a key i
1d490 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
1d4a0 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
1d4b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1d4c0 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f  Except      Remo
1d4d0 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ve results from 
1d4e0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
1d4f0 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
1d500 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1d510 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
1d520 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
1d530 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
1d540 73 74 2d 3e 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  st->iParm.**.** 
1d550 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62      SRT_EphemTab
1d560 20 20 20 20 43 72 65 61 74 65 20 61 6e 20 74 65      Create an te
1d570 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
1d580 65 73 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20 73  est->iParm and s
1d590 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  tore.**         
1d5a0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
1d5b0 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68  result there. Th
1d5c0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
1d5d0 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20   open after.**  
1d5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5f0 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a     returning..**
1d600 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f  .**     SRT_Coro
1d610 75 74 69 6e 65 20 20 20 49 6e 76 6f 6b 65 20 61  utine   Invoke a
1d620 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 63   co-routine to c
1d630 6f 6d 70 75 74 65 20 61 20 73 69 6e 67 6c 65 20  ompute a single 
1d640 72 6f 77 20 6f 66 20 0a 2a 2a 20 20 20 20 20 20  row of .**      
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1d660 68 65 20 72 65 73 75 6c 74 0a 2a 2a 0a 2a 2a 20  he result.**.** 
1d670 20 20 20 20 53 52 54 5f 45 78 69 73 74 73 20 20      SRT_Exists  
1d680 20 20 20 20 53 74 6f 72 65 20 61 20 31 20 69 6e      Store a 1 in
1d690 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65   memory cell pDe
1d6a0 73 74 2d 3e 69 50 61 72 6d 20 69 66 20 74 68 65  st->iParm if the
1d6b0 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20   result.**      
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1d6d0 65 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e  et is not empty.
1d6e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44  .**.**     SRT_D
1d6f0 69 73 63 61 72 64 20 20 20 20 20 54 68 72 6f 77  iscard     Throw
1d700 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 77 61   the results awa
1d710 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65  y..**.** See the
1d720 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
1d730 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
1d740 61 20 63 61 6e 6f 6e 69 63 61 6c 20 6c 69 73 74  a canonical list
1d750 69 6e 67 20 6f 66 20 74 68 65 20 0a 2a 2a 20 61  ing of the .** a
1d760 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
1d770 20 65 44 65 73 74 20 61 6e 64 20 74 68 65 69 72   eDest and their
1d780 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a   meanings..**.**
1d790 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1d7a0 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
1d7b0 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
1d7c0 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
1d7d0 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
1d7e0 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
1d7f0 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
1d800 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
1d810 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
1d820 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1d830 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
1d840 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
1d850 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
1d860 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
1d870 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
1d880 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a  to do that..**.*
1d890 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70  * The pParent, p
1d8a0 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70  arentTab, and *p
1d8b0 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73  ParentAgg fields
1d8c0 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69   are filled in i
1d8d0 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54  f this.** SELECT
1d8e0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e 20   is a subquery. 
1d8f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
1d900 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65  y try to combine
1d910 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20   this SELECT.** 
1d920 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74 20  with its parent 
1d930 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  to form a single
1d940 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e   flat query.  In
1d950 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69   so doing, it mi
1d960 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68  ght.** change th
1d970 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 66  e parent query f
1d980 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67  rom a non-aggreg
1d990 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67  ate to an aggreg
1d9a0 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f  ate query..** Fo
1d9b0 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74  r that reason, t
1d9c0 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c  he pParentAgg fl
1d9d0 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ag is passed as 
1d9e0 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74  a pointer, so it
1d9f0 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67  .** can be chang
1da00 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  ed..**.** Exampl
1da10 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69  e 1:   The meani
1da20 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e  ng of the pParen
1da30 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  t parameter..**.
1da40 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
1da50 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c  ROM t1 JOIN (SEL
1da60 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20  ECT x, count(*) 
1da70 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33  FROM t2) JOIN t3
1da80 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20  ;.**    \       
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1daa0 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
1dab0 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20   _______/       
1dac0 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20 20   /.**     \     
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db00 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f   /.**      \____
1db10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1db20 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
1db30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1db40 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  /.**.** This rou
1db50 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
1db60 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1db70 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20  ry first.   For 
1db80 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50  that call,.** pP
1db90 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55  arent will be NU
1dba0 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20  LL.  During the 
1dbb0 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
1dbc0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74  e outer query, t
1dbd0 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  his .** routine 
1dbe0 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
1dbf0 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20  ively to handle 
1dc00 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 46  the subquery.  F
1dc10 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  or the recursive
1dc20 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e  .** call, pParen
1dc30 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  t will point to 
1dc40 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1dc50 20 20 42 65 63 61 75 73 65 20 74 68 65 20 73 75    Because the su
1dc60 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65  bquery is.** the
1dc70 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20   second element 
1dc80 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a  in a three-way j
1dc90 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54  oin, the parentT
1dca0 61 62 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c  ab parameter wil
1dcb0 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32  l.** be 1 (the 2
1dcc0 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d  nd value of a 0-
1dcd0 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a  indexed array.).
1dce0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
1dcf0 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
1dd00 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
1dd10 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
1dd20 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
1dd30 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1dd40 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
1dd50 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
1dd60 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
1dd70 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
1dd80 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
1dd90 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
1dda0 65 73 75 6c 74 73 20 2a 2f 0a 20 20 53 65 6c 65  esults */.  Sele
1ddb0 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ct *pParent,    
1ddc0 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
1ddd0 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20 74  LECT for which t
1dde0 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75 65  his is a sub-que
1ddf0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65  ry */.  int pare
1de00 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  ntTab,         /
1de10 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65  * Index in pPare
1de20 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73  nt->pSrc of this
1de30 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
1de40 2a 70 50 61 72 65 6e 74 41 67 67 20 20 20 20 20  *pParentAgg     
1de50 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
1de60 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72 65  arent uses aggre
1de70 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
1de80 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
1de90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dea0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
1deb0 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
1dec0 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
1ded0 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
1dee0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
1def0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
1df00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1df10 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
1df20 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1df30 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
1df40 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
1df50 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
1df60 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
1df70 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
1df80 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
1df90 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1dfa0 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
1dfb0 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
1dfc0 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
1dfd0 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
1dfe0 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
1dff0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
1e000 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
1e010 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1e020 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
1e030 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
1e040 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68  rderBy;    /* Th
1e050 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1e060 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
1e070 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1e080 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
1e090 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
1e0a0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
1e0b0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
1e0c0 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
1e0d0 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
1e0e0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
1e0f0 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69  */.  int isDisti
1e100 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
1e110 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
1e120 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
1e130 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
1e140 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  distinct;       
1e150 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75     /* Table to u
1e160 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
1e170 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  nct set */.  int
1e180 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20   rc = 1;        
1e190 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
1e1a0 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73  return from this
1e1b0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
1e1c0 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  nt addrSortIndex
1e1d0 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
1e1e0 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70   of an OP_OpenEp
1e1f0 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
1e200 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  ion */.  AggInfo
1e210 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
1e220 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
1e230 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
1e240 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
1e250 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
1e260 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1e270 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
1e280 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
1e290 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
1e2a0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1e2b0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1e2c0 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  /..  db = pParse
1e2d0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ->db;.  if( p==0
1e2e0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1e2f0 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
1e300 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
1e310 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
1e320 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1e330 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1e340 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
1e350 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
1e360 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
1e370 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
1e380 6e 66 6f 29 29 3b 0a 0a 20 20 70 4f 72 64 65 72  nfo));..  pOrder
1e390 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1e3a0 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ;.  if( Ignorabl
1e3b0 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
1e3c0 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  ){.    p->pOrder
1e3d0 42 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  By = 0;..    /* 
1e3e0 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 74  In these cases t
1e3f0 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 65 72  he DISTINCT oper
1e400 61 74 6f 72 20 6d 61 6b 65 73 20 6e 6f 20 64 69  ator makes no di
1e410 66 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  fference to the.
1e420 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2c 20      ** results, 
1e430 73 6f 20 72 65 6d 6f 76 65 20 69 74 20 69 66 20  so remove it if 
1e440 69 74 20 77 65 72 65 20 73 70 65 63 69 66 69 65  it were specifie
1e450 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  d..    */.    as
1e460 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73  sert(pDest->eDes
1e470 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c  t==SRT_Exists ||
1e480 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1e490 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20  RT_Union || .   
1e4a0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
1e4b0 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74  Dest==SRT_Except
1e4c0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
1e4d0 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a  ==SRT_Discard);.
1e4e0 20 20 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63      p->isDistinc
1e4f0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
1e500 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
1e510 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c  solve(pParse, p,
1e520 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   0) ){.    goto 
1e530 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
1e540 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1e550 70 4f 72 64 65 72 42 79 3b 0a 0a 0a 20 20 2f 2a  pOrderBy;...  /*
1e560 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69   Make local copi
1e570 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  es of the parame
1e580 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75  ters for this qu
1e590 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  ery..  */.  pTab
1e5a0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
1e5b0 20 20 69 73 41 67 67 20 3d 20 70 2d 3e 69 73 41    isAgg = p->isA
1e5c0 67 67 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  gg;.  pEList = p
1e5d0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
1e5e0 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f  pEList==0 ) goto
1e5f0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
1e600 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  /* .  ** Do not 
1e610 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  even attempt to 
1e620 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64  generate any cod
1e630 65 20 69 66 20 77 65 20 68 61 76 65 20 61 6c 72  e if we have alr
1e640 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65  eady seen.  ** e
1e650 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69  rrors before thi
1e660 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
1e670 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
1e680 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f  rse->nErr>0 ) go
1e690 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
1e6a0 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73    /* ORDER BY is
1e6b0 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d   ignored for som
1e6c0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a  e destinations..
1e6d0 20 20 2a 2f 0a 20 20 69 66 28 20 49 67 6e 6f 72    */.  if( Ignor
1e6e0 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
1e6f0 74 29 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72  t) ){.    pOrder
1e700 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
1e710 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
1e720 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
1e730 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1e740 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1e750 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
1e760 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
1e770 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1e780 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
1e790 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
1e7a0 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ause.  */.#if !d
1e7b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1e7c0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1e7d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1e7e0 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
1e7f0 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72  (i=0; !p->pPrior
1e800 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e   && i<pTabList->
1e810 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
1e820 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1e830 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
1e840 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
1e850 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
1e860 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
1e870 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
1e880 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  lect;.    int is
1e890 41 67 67 53 75 62 3b 0a 20 20 20 20 63 68 61 72  AggSub;.    char
1e8a0 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d   *zName = pItem-
1e8b0 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 69 66 28  >zName;..    if(
1e8c0 20 70 53 75 62 3d 3d 30 20 7c 7c 20 70 49 74 65   pSub==0 || pIte
1e8d0 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29  m->isPopulated )
1e8e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1e8f0 66 28 20 7a 4e 61 6d 65 21 3d 30 20 29 7b 20 20  f( zName!=0 ){  
1e900 20 2f 2a 20 41 6e 20 73 71 6c 20 76 69 65 77 20   /* An sql view 
1e910 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
1e920 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
1e930 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
1e940 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
1e950 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
1e960 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 4e 61 6d  thContext = zNam
1e970 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e;.      rc = sq
1e980 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c  lite3SelectResol
1e990 76 65 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ve(pParse, pSub,
1e9a0 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
1e9b0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1e9c0 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
1e9d0 65 78 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ext;.      if( r
1e9e0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
1e9f0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1ea00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1ea10 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61   /* Increment Pa
1ea20 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74  rse.nHeight by t
1ea30 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  he height of the
1ea40 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73   largest express
1ea50 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  ion.    ** tree 
1ea60 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 74 68  refered to by th
1ea70 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73  is, the parent s
1ea80 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64  elect. The child
1ea90 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d   select.    ** m
1eaa0 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65  ay contain expre
1eab0 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61  ssion trees of a
1eac0 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53  t most.    ** (S
1ead0 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
1eae0 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67  EPTH-Parse.nHeig
1eaf0 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73  ht) height. This
1eb00 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a   is a bit.    **
1eb10 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69   more conservati
1eb20 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  ve than necessar
1eb30 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69  y, but much easi
1eb40 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e  er than enforcin
1eb50 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63  g.    ** an exac
1eb60 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a  t limit..    */.
1eb70 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
1eb80 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65  ght += sqlite3Se
1eb90 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
1eba0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
1ebb0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 73   to see if the s
1ebc0 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61  ubquery can be a
1ebd0 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 74 68 65  bsorbed into the
1ebe0 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20   parent. */.    
1ebf0 69 73 41 67 67 53 75 62 20 3d 20 70 53 75 62 2d  isAggSub = pSub-
1ec00 3e 69 73 41 67 67 3b 0a 20 20 20 20 69 66 28 20  >isAgg;.    if( 
1ec10 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
1ec20 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73  pParse, p, i, is
1ec30 41 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29  Agg, isAggSub) )
1ec40 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67  {.      if( isAg
1ec50 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  gSub ){.        
1ec60 70 2d 3e 69 73 41 67 67 20 3d 20 69 73 41 67 67  p->isAgg = isAgg
1ec70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1ec80 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
1ec90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1eca0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
1ecb0 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70  it(&dest, SRT_Ep
1ecc0 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69  hemTab, pItem->i
1ecd0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 73  Cursor);.      s
1ece0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1ecf0 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
1ed00 2c 20 70 2c 20 69 2c 20 26 69 73 41 67 67 29 3b  , p, i, &isAgg);
1ed10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1ed20 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
1ed30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1ed40 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
1ed50 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
1ed60 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
1ed70 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65  ght -= sqlite3Se
1ed80 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
1ed90 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20  );.    pTabList 
1eda0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
1edb0 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64  f( !IgnorableOrd
1edc0 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
1edd0 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
1ede0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
1edf0 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
1ee00 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e  = p->pEList;.#en
1ee10 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70  dif.  pWhere = p
1ee20 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
1ee30 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1ee40 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
1ee50 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
1ee60 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
1ee70 44 69 73 74 69 6e 63 74 3b 0a 0a 23 69 66 6e 64  Distinct;..#ifnd
1ee80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
1ee90 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
1eea0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
1eeb0 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f  are a sequence o
1eec0 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68  f queries, do th
1eed0 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66  e earlier ones f
1eee0 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irst..  */.  if(
1eef0 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
1ef00 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d    if( p->pRightm
1ef10 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ost==0 ){.      
1ef20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a  Select *pLoop, *
1ef30 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  pRight = 0;.    
1ef40 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
1ef50 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63       int mxSelec
1ef60 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f  t;.      for(pLo
1ef70 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
1ef80 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
1ef90 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20  , cnt++){.      
1efa0 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d    pLoop->pRightm
1efb0 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ost = p;.       
1efc0 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20   pLoop->pNext = 
1efd0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
1efe0 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a  pRight = pLoop;.
1eff0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 78        }.      mx
1f000 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69  Select = db->aLi
1f010 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
1f020 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
1f030 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53  ];.      if( mxS
1f040 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d 78 53  elect && cnt>mxS
1f050 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
1f060 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1f070 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
1f080 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70  ny terms in comp
1f090 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20  ound SELECT");. 
1f0a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
1f0b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f0c0 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
1f0d0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
1f0e0 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 23 65 6e   pDest);.  }.#en
1f0f0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  dif..  /* If wri
1f100 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
1f110 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
1f120 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
1f130 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
1f140 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
1f150 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f160 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1f170 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74  if( checkForMult
1f180 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72  iColumnSelectErr
1f190 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  or(pParse, pDest
1f1a0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
1f1b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
1f1c0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ect_end;.  }.#en
1f1d0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73  dif..  /* If pos
1f1e0 73 69 62 6c 65 2c 20 72 65 77 72 69 74 65 20 74  sible, rewrite t
1f1f0 68 65 20 71 75 65 72 79 20 74 6f 20 75 73 65 20  he query to use 
1f200 47 52 4f 55 50 20 42 59 20 69 6e 73 74 65 61 64  GROUP BY instead
1f210 20 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a 20 20   of DISTINCT..  
1f220 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20  ** GROUP BY may 
1f230 75 73 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49  use an index, DI
1f240 53 54 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65  STINCT never doe
1f250 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
1f260 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 21  >isDistinct && !
1f270 70 2d 3e 69 73 41 67 67 20 26 26 20 21 70 2d 3e  p->isAgg && !p->
1f280 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
1f290 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
1f2a0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1f2b0 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  (db, p->pEList);
1f2c0 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
1f2d0 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
1f2e0 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d   p->isDistinct =
1f2f0 20 30 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e   0;.    isDistin
1f300 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ct = 0;.  }..  /
1f310 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
1f320 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1f330 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74  , then this sort
1f340 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d  ing.  ** index m
1f350 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e  ight end up bein
1f360 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
1f370 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a  data can be .  *
1f380 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70  * extracted in p
1f390 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  re-sorted order.
1f3a0 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
1f3b0 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a   case, then the.
1f3c0 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65    ** OP_OpenEphe
1f3d0 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
1f3e0 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  n will be change
1f3f0 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
1f400 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67  once.  ** we fig
1f410 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
1f420 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
1f430 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  s not needed.  T
1f440 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  he addrSortIndex
1f450 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69  .  ** variable i
1f460 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69  s used to facili
1f470 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65  tate that change
1f480 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
1f490 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
1f4a0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
1f4b0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
1f4c0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
1f4d0 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
1f4e0 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72  rBy);.    pOrder
1f4f0 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70  By->iECursor = p
1f500 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
1f510 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
1f520 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74  hm[2] = addrSort
1f530 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71  Index =.      sq
1f540 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1f550 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
1f560 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f580 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
1f590 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  or, pOrderBy->nE
1f5a0 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20  xpr+2, 0,.      
1f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5c0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1f5d0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
1f5e0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
1f5f0 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74  se{.    addrSort
1f600 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
1f610 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
1f620 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
1f630 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
1f640 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
1f650 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
1f660 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
1f670 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
1f680 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1f690 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
1f6a0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73  nEphemeral, pDes
1f6b0 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74  t->iParm, pEList
1f6c0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
1f6d0 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
1f6e0 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64  ter..  */.  iEnd
1f6f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1f700 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f  keLabel(v);.  co
1f710 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
1f720 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
1f730 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  End);..  /* Open
1f740 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
1f750 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
1f760 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
1f770 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69  */.  if( isDisti
1f780 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  nct ){.    KeyIn
1f790 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
1f7a0 20 20 61 73 73 65 72 74 28 20 69 73 41 67 67 20    assert( isAgg 
1f7b0 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 3b 0a 20  || pGroupBy );. 
1f7c0 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50     distinct = pP
1f7d0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
1f7e0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
1f7f0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
1f800 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
1f810 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
1f820 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1f830 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
1f840 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  distinct, 0, 0,.
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f860 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1f870 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
1f880 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
1f890 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69  }else{.    disti
1f8a0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  nct = -1;.  }.. 
1f8b0 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e   /* Aggregate an
1f8c0 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  d non-aggregate 
1f8d0 71 75 65 72 69 65 73 20 61 72 65 20 68 61 6e 64  queries are hand
1f8e0 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
1f8f0 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  */.  if( !isAgg 
1f900 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
1f910 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
1f920 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67  se is for non-ag
1f930 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 0a  gregate queries.
1f940 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65      ** Begin the
1f950 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20   database scan. 
1f960 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f     */.    pWInfo
1f970 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
1f980 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
1f990 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26  bList, pWhere, &
1f9a0 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20  pOrderBy, 0);.  
1f9b0 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
1f9c0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1f9d0 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f  d;..    /* If so
1f9e0 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
1f9f0 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
1fa00 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
1fa10 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
1fa20 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
1fa30 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
1fa40 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
1fa50 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
1fa60 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
1fa70 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
1fa80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1fa90 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
1faa0 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
1fab0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1fac0 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
1fad0 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
1fae0 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  x, 1);.      p->
1faf0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
1fb00 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  = -1;.    }..   
1fb10 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
1fb20 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a  dard inner loop.
1fb30 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1fb40 74 28 21 69 73 44 69 73 74 69 6e 63 74 29 3b 0a  t(!isDistinct);.
1fb50 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
1fb60 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
1fb70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
1fb80 64 65 72 42 79 2c 20 2d 31 2c 20 70 44 65 73 74  derBy, -1, pDest
1fb90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fba0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43        pWInfo->iC
1fbb0 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d  ontinue, pWInfo-
1fbc0 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 20 20 2f  >iBreak);..    /
1fbd0 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
1fbe0 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
1fbf0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
1fc00 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
1fc10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1fc20 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 70 72  * This is the pr
1fc30 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67  ocessing for agg
1fc40 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
1fc50 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
1fc60 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
1fc70 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
1fc80 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
1fc90 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
1fca0 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
1fcb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1fcc0 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
1fcd0 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
1fce0 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
1fcf0 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
1fd00 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1fd10 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
1fd20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
1fd30 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
1fd40 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
1fd50 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
1fd60 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
1fd70 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
1fd80 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
1fd90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
1fda0 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
1fdb0 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
1fdc0 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fde0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
1fdf0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
1fe00 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
1fe10 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
1fe20 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
1fe30 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
1fe40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
1fe50 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
1fe60 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
1fe70 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
1fe80 20 6f 72 64 65 72 20 2a 2f 0a 0a 0a 20 20 20 20   order */...    
1fe90 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1fea0 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20   variables hold 
1feb0 61 64 64 72 65 73 73 65 73 20 6f 72 20 6c 61 62  addresses or lab
1fec0 65 6c 73 20 66 6f 72 20 70 61 72 74 73 20 6f 66  els for parts of
1fed0 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 69 72 74   the.    ** virt
1fee0 75 61 6c 20 6d 61 63 68 69 6e 65 20 70 72 6f 67  ual machine prog
1fef0 72 61 6d 20 77 65 20 61 72 65 20 70 75 74 74 69  ram we are putti
1ff00 6e 67 20 74 6f 67 65 74 68 65 72 20 2a 2f 0a 20  ng together */. 
1ff10 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75     int addrOutpu
1ff20 74 52 6f 77 3b 20 20 20 20 20 20 2f 2a 20 53 74  tRow;      /* St
1ff30 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e  art of subroutin
1ff40 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
1ff50 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20   result row */. 
1ff60 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74     int regOutput
1ff70 52 6f 77 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  Row;       /* Re
1ff80 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
1ff90 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74  ister for output
1ffa0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1ffb0 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62     int addrSetAb
1ffc0 6f 72 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 65  ort;       /* Se
1ffd0 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67  t the abort flag
1ffe0 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
1fff0 20 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 69     int addrIniti
20000 61 6c 69 7a 65 4c 6f 6f 70 3b 20 2f 2a 20 53 74  alizeLoop; /* St
20010 61 72 74 20 6f 66 20 63 6f 64 65 20 74 68 61 74  art of code that
20020 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65   initializes the
20030 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20   input loop */. 
20040 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66     int addrTopOf
20050 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 6f  Loop;      /* To
20060 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c  p of the input l
20070 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  oop */.    int a
20080 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 20  ddrEnd;         
20090 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6c 6c     /* End of all
200a0 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20   processing */. 
200b0 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69     int addrSorti
200c0 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68  ngIdx;     /* Th
200d0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
200e0 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69  al for the sorti
200f0 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
20100 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20  int addrReset;  
20110 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f          /* Subro
20120 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
20130 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
20140 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  tor */.    int r
20150 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 20  egReset;        
20160 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
20170 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
20180 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69  r reset subrouti
20190 6e 65 20 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45  ne */..    addrE
201a0 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
201b0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
201c0 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b     /* Convert TK
201d0 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e  _COLUMN nodes in
201e0 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
201f0 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65   and make entrie
20200 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67  s in.    ** sAgg
20210 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f  Info for all TK_
20220 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
20230 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
20240 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
20250 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
20260 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
20270 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
20280 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
20290 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
202a0 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
202b0 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
202c0 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66  .    sNC.pAggInf
202d0 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20  o = &sAggInfo;. 
202e0 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72     sAggInfo.nSor
202f0 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72  tingColumn = pGr
20300 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79  oupBy ? pGroupBy
20310 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20  ->nExpr+1 : 0;. 
20320 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f     sAggInfo.pGro
20330 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
20340 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
20350 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
20360 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  sNC, pEList);.  
20370 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
20380 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
20390 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
203a0 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
203b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
203c0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
203d0 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
203e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  );.    }.    sAg
203f0 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74  gInfo.nAccumulat
20400 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43  or = sAggInfo.nC
20410 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69  olumn;.    for(i
20420 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
20430 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
20440 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
20450 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
20460 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
20470 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74  [i].pExpr->pList
20480 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
20490 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
204a0 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
204b0 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
204c0 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
204d0 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
204e0 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
204f0 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
20500 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
20510 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
20520 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
20530 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
20540 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
20550 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
20560 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
20570 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
20580 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
20590 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
205a0 20 20 20 20 69 6e 74 20 6a 31 3b 0a 0a 20 20 20      int j1;..   
205b0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62     /* Create lab
205c0 65 6c 73 20 74 68 61 74 20 77 65 20 77 69 6c 6c  els that we will
205d0 20 62 65 20 6e 65 65 64 69 6e 67 0a 20 20 20 20   be needing.    
205e0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 49    */.      addrI
205f0 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20  nitializeLoop = 
20600 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
20610 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 20 20  abel(v);..      
20620 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
20630 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
20640 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61   we might need a
20650 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
20660 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  o.      ** imple
20670 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61  ment it.  Alloca
20680 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  te that sorting 
20690 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69  index now.  If i
206a0 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20  t turns out.    
206b0 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
206c0 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65  not need it afte
206d0 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 45  r all, the OpenE
206e0 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
206f0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69  tion.      ** wi
20700 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
20710 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20  into a Noop.  . 
20720 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41       */.      sA
20730 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
20740 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
20750 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  ++;.      pKeyIn
20760 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
20770 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
20780 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20   pGroupBy);.    
20790 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78    addrSortingIdx
207a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
207b0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
207c0 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20  phemeral, .     
207d0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
207e0 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e  rtingIdx, sAggIn
207f0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
20800 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c  n, .          0,
20810 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
20820 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
20830 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  DOFF);..      /*
20840 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
20850 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65  ry locations use
20860 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67  d by GROUP BY ag
20870 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69  gregate processi
20880 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ng.      */.    
20890 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70    iUseFlag = ++p
208a0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
208b0 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20     iAbortFlag = 
208c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
208d0 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50        iAMem = pP
208e0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
208f0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
20900 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
20910 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d  nExpr;.      iBM
20920 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
20930 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
20940 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
20950 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
20960 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20970 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
20980 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c  ger, 0, iAbortFl
20990 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
209a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61  omment((v, "clea
209b0 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  r abort flag"));
209c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
209d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
209e0 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46  nteger, 0, iUseF
209f0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
20a00 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
20a10 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  icate accumulato
20a20 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20  r empty"));.    
20a30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20a40 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
20a50 30 2c 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a  0, addrInitializ
20a60 65 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20 20 20 2f  eLoop);..      /
20a70 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
20a80 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
20a90 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  puts a single ro
20aa0 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
20ab0 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54        ** set.  T
20ac0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66  his subroutine f
20ad0 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  irst looks at th
20ae0 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20  e iUseFlag.  If 
20af0 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a  iUseFlag.      *
20b00 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  * is less than o
20b10 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
20b20 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
20b30 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a  is a no-op.  If.
20b40 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f        ** the pro
20b50 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f  cessing calls fo
20b60 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61  r the query to a
20b70 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f  bort, this subro
20b80 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  utine.      ** i
20b90 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41  ncrements the iA
20ba0 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20  bortFlag memory 
20bb0 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
20bc0 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20  returning in.   
20bd0 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73     ** order to s
20be0 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72  ignal the caller
20bf0 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20   to abort..     
20c00 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65   */.      addrSe
20c10 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  tAbort = sqlite3
20c20 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
20c30 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
20c40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20c50 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41  P_Integer, 1, iA
20c60 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
20c70 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
20c80 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67   "set abort flag
20c90 22 29 29 3b 0a 20 20 20 20 20 20 72 65 67 4f 75  "));.      regOu
20ca0 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72  tputRow = ++pPar
20cb0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
20cc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20cd0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
20ce0 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
20cf0 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
20d00 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
20d10 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
20d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20d30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
20d40 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61  Pos, iUseFlag, a
20d50 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b  ddrOutputRow+2);
20d60 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
20d70 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20  nt((v, "Groupby 
20d80 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
20d90 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b   entry point"));
20da0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
20db0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
20dc0 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
20dd0 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61  Row);.      fina
20de0 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
20df0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
20e00 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  fo);.      if( p
20e10 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
20e20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
20e30 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
20e40 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74  ving, addrOutput
20e50 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55  Row+1, SQLITE_JU
20e60 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
20e70 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49   }.      selectI
20e80 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
20e90 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30   p, p->pEList, 0
20ea0 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20  , 0, pOrderBy,. 
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ec0 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20 70       distinct, p
20ed0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
20ef0 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64  OutputRow+1, add
20f00 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20  rSetAbort);.    
20f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20f20 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
20f30 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
20f40 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
20f50 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75  nt((v, "end grou
20f60 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
20f70 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
20f80 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
20f90 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
20fa0 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f  ll reset the gro
20fb0 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f  up-by accumulato
20fc0 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
20fd0 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
20fe0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
20ff0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 72 65  ddr(v);.      re
21000 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  gReset = ++pPars
21010 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
21020 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
21030 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
21040 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
21050 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
21060 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73  P_Return, regRes
21070 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42  et);..      /* B
21080 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74  egin a loop that
21090 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c   will extract al
210a0 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e  l source rows in
210b0 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e   GROUP BY order.
210c0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d  .      ** This m
210d0 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f  ight involve two
210e0 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20   separate loops 
210f0 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20  with an OP_Sort 
21100 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20  in between, or. 
21110 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
21120 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f   be a single loo
21130 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69  p that uses an i
21140 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20  ndex to extract 
21150 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20  information.    
21160 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68    ** in the righ
21170 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e  t order to begin
21180 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   with..      */.
21190 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
211a0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
211b0 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c   addrInitializeL
211c0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oop);.      sqli
211d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
211e0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
211f0 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b  set, addrReset);
21200 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  .      pWInfo = 
21210 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
21220 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
21230 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72  st, pWhere, &pGr
21240 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 20  oupBy, 0);.     
21250 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
21260 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
21270 3b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f  ;.      if( pGro
21280 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  upBy==0 ){.     
21290 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69     /* The optimi
212a0 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64  zer is able to d
212b0 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67  eliver rows in g
212c0 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f  roup by order so
212d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64  .        ** we d
212e0 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f  o not have to so
212f0 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e  rt.  The OP_Open
21300 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  Ephemeral table 
21310 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
21320 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74  ** cancelled lat
21330 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74  er because we st
21340 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20  ill need to use 
21350 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20  the pKeyInfo.   
21360 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
21370 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
21380 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
21390 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b  groupBySort = 0;
213a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
213b0 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72        /* Rows ar
213c0 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20  e coming out in 
213d0 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64  undetermined ord
213e0 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  er.  We have to 
213f0 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  push.        ** 
21400 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20  each row into a 
21410 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74  sorting index, t
21420 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72  erminate the fir
21430 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  st loop,.       
21440 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76   ** then loop ov
21450 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  er the sorting i
21460 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f  ndex in order to
21470 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a   get the output.
21480 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f          ** in so
21490 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20  rted order.     
214a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
214b0 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  t regBase;.     
214c0 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64     int regRecord
214d0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
214e0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ol;.        int 
214f0 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20  nGroupBy;..     
21500 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
21510 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f   1;.        nGro
21520 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d  upBy = pGroupBy-
21530 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
21540 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20  nCol = nGroupBy 
21550 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  + 1;.        j =
21560 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20   nGroupBy+1;.   
21570 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
21580 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
21590 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
215a0 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61    if( sAggInfo.a
215b0 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f  Col[i].iSorterCo
215c0 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
215d0 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20         nCol++;. 
215e0 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
215f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21600 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
21610 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47  gBase = sqlite3G
21620 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
21630 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
21640 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
21650 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
21660 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67  e, pGroupBy, reg
21670 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Base, 0);.      
21680 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21690 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  Op2(v, OP_Sequen
216a0 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  ce, sAggInfo.sor
216b0 74 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b  tingIdx,regBase+
216c0 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  nGroupBy);.     
216d0 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b     j = nGroupBy+
216e0 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
216f0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
21700 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
21710 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
21720 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
21730 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
21740 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
21750 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
21760 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
21770 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
21780 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a   = j + regBase;.
21790 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
217a0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
217b0 32 20 3d 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  2 = .#endif.    
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
217e0 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
217f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43    pCol->pTab, pC
21820 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f  ol->iColumn, pCo
21830 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20 30  l->iTable, r1, 0
21840 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
21850 2b 2b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  ++;..           
21860 20 2f 2a 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f   /* sAggInfo.aCo
21870 6c 5b 5d 20 6f 6e 6c 79 20 63 6f 6e 74 61 69 6e  l[] only contain
21880 73 20 6f 6e 65 20 65 6e 74 72 79 20 70 65 72 20  s one entry per 
21890 63 6f 6c 75 6d 6e 2e 20 20 53 6f 0a 20 20 20 20  column.  So.    
218a0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 72          ** The r
218b0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 43 6f 6c  eference to pCol
218c0 2d 3e 69 43 6f 6c 75 6d 6e 2c 70 43 6f 6c 2d 3e  ->iColumn,pCol->
218d0 69 54 61 62 6c 65 20 6d 75 73 74 20 68 61 76 65  iTable must have
218e0 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20   been.          
218f0 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72    ** the first r
21900 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 61 74  eference to that
21910 20 63 6f 6c 75 6d 6e 2e 20 20 48 65 6e 63 65 2c   column.  Hence,
21920 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
21930 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 47   sqliteExprCodeG
21940 65 74 43 6f 6c 75 6d 6e 20 69 73 20 67 75 61 72  etColumn is guar
21950 61 6e 74 65 65 64 20 74 6f 20 70 75 74 20 74 68  anteed to put th
21960 65 20 72 65 73 75 6c 74 20 69 6e 0a 20 20 20 20  e result in.    
21970 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63          ** the c
21980 6f 6c 75 6d 6e 20 72 65 71 75 65 73 74 65 64 2e  olumn requested.
21990 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f   .            */
219a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
219b0 65 72 74 28 20 72 31 3d 3d 72 32 20 29 3b 0a 20  ert( r1==r2 );. 
219c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
219d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
219e0 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
219f0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
21a00 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
21a10 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
21a20 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
21a30 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72  regBase, nCol, r
21a40 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
21a50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21a60 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
21a70 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  sert, sAggInfo.s
21a80 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65  ortingIdx, regRe
21a90 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
21aa0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
21ab0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
21ac0 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
21ad0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
21ae0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
21af0 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b   regBase, nCol);
21b00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21b10 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
21b20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21b30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21b40 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f  P_Sort, sAggInfo
21b50 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
21b60 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56  rEnd);.        V
21b70 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
21b80 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29  GROUP BY sort"))
21b90 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
21ba0 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  fo.useSortingIdx
21bb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 1;.      }.. 
21bc0 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
21bd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
21be0 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20  UP BY terms and 
21bf0 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c  store in b0, b1,
21c00 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20   b2....      ** 
21c10 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f  (b0 is memory lo
21c20 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20  cation iBMem+0, 
21c30 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61  b1 is iBMem+1, a
21c40 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20  nd so forth).   
21c50 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61     ** Then compa
21c60 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  re the current G
21c70 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67  ROUP BY terms ag
21c80 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20  ainst the GROUP 
21c90 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a  BY terms.      *
21ca0 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  * from the previ
21cb0 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  ous row currentl
21cc0 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20  y stored in a0, 
21cd0 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20  a1, a2....      
21ce0 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  */.      addrTop
21cf0 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
21d00 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
21d10 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  v);.      for(j=
21d20 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
21d30 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
21d40 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
21d50 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
21d60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21d70 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
21d80 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
21d90 67 49 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a  gIdx, j, iBMem+j
21da0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
21db0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67  {.          sAgg
21dc0 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20  Info.directMode 
21dd0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 1;.          s
21de0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
21df0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
21e00 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d  >a[j].pExpr, iBM
21e10 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
21e20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
21e30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
21e40 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
21e50 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47  iAMem, iBMem, pG
21e60 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20  roupBy->nExpr,. 
21e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e80 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
21e90 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
21ea0 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20  INFO);.      j1 
21eb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
21ec0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
21ed0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21ee0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
21ef0 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b   j1+1, 0, j1+1);
21f00 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
21f10 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75  ate code that ru
21f20 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ns whenever the 
21f30 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73  GROUP BY changes
21f40 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67  ..      ** Chang
21f50 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  es in the GROUP 
21f60 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20  BY are detected 
21f70 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
21f80 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c  code.      ** bl
21f90 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77  ock.  If there w
21fa0 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20  ere no changes, 
21fb0 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b  this block is sk
21fc0 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ipped..      **.
21fd0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
21fe0 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e  de copies curren
21ff0 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73  t group by terms
22000 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e   in b0,b1,b2,...
22010 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  .      ** over t
22020 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20  o a0,a1,a2.  It 
22030 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f  then calls the o
22040 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
22050 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
22060 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61  sets the aggrega
22070 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  te accumulator r
22080 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70  egisters in prep
22090 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  aration.      **
220a0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52   for the next GR
220b0 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20  OUP BY batch..  
220c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
220d0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
220e0 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20  (pParse, iBMem, 
220f0 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iAMem, pGroupBy-
22100 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  >nExpr);.      s
22110 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22120 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
22130 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
22140 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
22150 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
22160 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  , "output one ro
22170 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w"));.      sqli
22180 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22190 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72   OP_IfPos, iAbor
221a0 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b  tFlag, addrEnd);
221b0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
221c0 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62  nt((v, "check ab
221d0 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
221e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
221f0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
22200 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
22210 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  Reset);.      Vd
22220 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
22230 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72  eset accumulator
22240 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  "));..      /* U
22250 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67  pdate the aggreg
22260 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73  ate accumulators
22270 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
22280 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a  ntent of.      *
22290 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  * the current ro
222a0 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  w.      */.     
222b0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
222c0 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
222d0 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
222e0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
222f0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
22300 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22310 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
22320 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  1, iUseFlag);.  
22330 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22340 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61  (v, "indicate da
22350 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f  ta in accumulato
22360 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
22370 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  End of the loop.
22380 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
22390 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
223a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
223b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
223c0 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  P_Next, sAggInfo
223d0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
223e0 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
223f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22400 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
22410 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
22420 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
22430 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
22440 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29  drSortingIdx, 1)
22450 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
22460 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
22470 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
22480 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
22490 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
224a0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
224b0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
224c0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
224d0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
224e0 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e  ((v, "output fin
224f0 61 6c 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20  al row"));.     
22500 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66   .    } /* endif
22510 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20   pGroupBy */.   
22520 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78   else {.      Ex
22530 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20  prList *pMinMax 
22540 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c  = 0;.      ExprL
22550 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20  ist *pDel = 0;. 
22560 20 20 20 20 20 75 38 20 66 6c 61 67 3b 0a 0a 20       u8 flag;.. 
22570 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66       /* Check if
22580 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66   the query is of
22590 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
225a0 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20  owing forms:.   
225b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
225c0 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46   SELECT min(x) F
225d0 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ROM ....      **
225e0 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29     SELECT max(x)
225f0 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
22600 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 69  **.      ** If i
22610 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74  t is, then ask t
22620 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  he code in where
22630 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  .c to attempt to
22640 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20   sort results.  
22650 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65      ** as if the
22660 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52  re was an "ORDER
22670 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52   ON x" or "ORDER
22680 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75   ON x DESC" clau
22690 73 65 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 66  se. .      ** If
226a0 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65   where.c is able
226b0 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75   to produce resu
226c0 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68  lts sorted in th
226d0 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20  is order, then. 
226e0 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65       ** add vdbe
226f0 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f   code to break o
22700 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73  ut of the proces
22710 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20  sing loop after 
22720 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  the .      ** fi
22730 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73  rst iteration (s
22740 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69  ince the first i
22750 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
22760 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 2a  loop is .      *
22770 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
22780 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72  operate on the r
22790 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69  ow with the mini
227a0 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a  mum or maximum .
227b0 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
227c0 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f  f x, the only ro
227d0 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20  w required)..   
227e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41     **.      ** A
227f0 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75   special flag mu
22800 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  st be passed to 
22810 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
22820 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a  n() to slightly.
22830 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20        ** modify 
22840 62 65 68 61 76 69 6f 75 72 20 61 73 20 66 6f 6c  behaviour as fol
22850 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
22860 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74       **   + If t
22870 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53  he query is a "S
22880 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74  ELECT min(x)", t
22890 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64  hen the loop cod
228a0 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 20  ed by.      **  
228b0 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c     where.c shoul
228c0 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76  d not iterate ov
228d0 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69  er any values wi
228e0 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a  th a NULL value.
228f0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72        **     for
22900 20 78 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20   x..      **.   
22910 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70     **   + The op
22920 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20  timizer code in 
22930 77 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69  where.c (the thi
22940 6e 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20  ng that decides 
22950 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 20  which.      **  
22960 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69     index or indi
22970 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75  ces to use) shou
22980 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65  ld place a diffe
22990 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e  rent priority on
229a0 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73   .      **     s
229b0 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f  atisfying the 'O
229c0 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20  RDER BY' clause 
229d0 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20  than it does in 
229e0 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20  other cases..   
229f0 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20     **     Refer 
22a00 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d  to code and comm
22a10 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20  ents in where.c 
22a20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20  for details..   
22a30 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67     */.      flag
22a40 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 70   = minMaxQuery(p
22a50 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
22a60 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20   if( flag ){.   
22a70 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e       pDel = pMin
22a80 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Max = sqlite3Exp
22a90 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
22aa0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
22ab0 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pr->pList);.    
22ac0 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20      if( pMinMax 
22ad0 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
22ae0 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
22af0 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
22b00 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67  sortOrder = flag
22b10 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  !=WHERE_ORDERBY_
22b20 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 70  MIN;.          p
22b30 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78  MinMax->a[0].pEx
22b40 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
22b50 4d 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  MN;.        }.  
22b60 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
22b70 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
22b80 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
22b90 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
22ba0 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
22bb0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
22bc0 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72   is much simpler
22bd0 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
22be0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
22bf0 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75  w.      ** of ou
22c00 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tput..      */. 
22c10 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
22c20 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
22c30 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
22c40 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
22c50 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
22c60 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
22c70 65 72 65 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 66  ere, &pMinMax, f
22c80 6c 61 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  lag);.      if( 
22c90 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  pWInfo==0 ){.   
22ca0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22cb0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
22cc0 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  Del);.        go
22cd0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
22ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 70 64       }.      upd
22cf0 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
22d00 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
22d10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d  );.      if( !pM
22d20 69 6e 4d 61 78 20 26 26 20 66 6c 61 67 20 29 7b  inMax && flag ){
22d30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22d40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22d50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f  _Goto, 0, pWInfo
22d60 2d 3e 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  ->iBreak);.     
22d70 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
22d80 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65  v, "%s() by inde
22d90 78 22 2c 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f  x",(flag==WHERE_
22da0 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e  ORDERBY_MIN?"min
22db0 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20  ":"max")));.    
22dc0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
22dd0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
22de0 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
22df0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
22e00 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
22e10 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
22e20 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
22e30 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
22e40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
22e50 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
22e60 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20  aving, addrEnd, 
22e70 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
22e80 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  L);.      }.    
22e90 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
22ea0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
22eb0 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  pEList, 0, 0, 0,
22ec0 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20   -1, .          
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
22ee0 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72  t, addrEnd, addr
22ef0 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  End);..      sql
22f00 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
22f10 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
22f20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
22f30 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
22f40 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  v, addrEnd);.   
22f50 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61   .  } /* endif a
22f60 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
22f70 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  /..  /* If there
22f80 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
22f90 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
22fa0 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
22fb0 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
22fc0 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
22fd0 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
22fe0 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
22ff0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
23000 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
23010 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76  ail(pParse, p, v
23020 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
23030 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 23 69   pDest);.  }..#i
23040 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23050 54 5f 53 55 42 51 55 45 52 59 0a 20 20 2f 2a 20  T_SUBQUERY.  /* 
23060 49 66 20 74 68 69 73 20 77 61 73 20 61 20 73 75  If this was a su
23070 62 71 75 65 72 79 2c 20 77 65 20 68 61 76 65 20  bquery, we have 
23080 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68  now converted th
23090 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
230a0 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79  a.  ** temporary
230b0 20 74 61 62 6c 65 2e 20 20 53 6f 20 73 65 74 20   table.  So set 
230c0 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  the SrcList_item
230d0 2e 69 73 50 6f 70 75 6c 61 74 65 64 20 66 6c 61  .isPopulated fla
230e0 67 20 74 6f 20 70 72 65 76 65 6e 74 0a 20 20 2a  g to prevent.  *
230f0 2a 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20  * this subquery 
23100 66 72 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c 75  from being evalu
23110 61 74 65 64 20 61 67 61 69 6e 20 61 6e 64 20 74  ated again and t
23120 6f 20 66 6f 72 63 65 20 74 68 65 20 75 73 65 20  o force the use 
23130 6f 66 0a 20 20 2a 2a 20 74 68 65 20 74 65 6d 70  of.  ** the temp
23140 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a  orary table..  *
23150 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  /.  if( pParent 
23160 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
23170 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53  Parent->pSrc->nS
23180 72 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a  rc>parentTab );.
23190 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
231a0 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72  ent->pSrc->a[par
231b0 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d  entTab].pSelect=
231c0 3d 70 20 29 3b 0a 20 20 20 20 70 50 61 72 65 6e  =p );.    pParen
231d0 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e  t->pSrc->a[paren
231e0 74 54 61 62 5d 2e 69 73 50 6f 70 75 6c 61 74 65  tTab].isPopulate
231f0 64 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 1;.  }.#endi
23200 66 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  f..  /* Jump her
23210 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71  e to skip this q
23220 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
23230 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
23240 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20  bel(v, iEnd);.. 
23250 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77   /* The SELECT w
23260 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
23270 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65  coded.   Set the
23280 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20   return code to 
23290 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  0.  ** to indica
232a0 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20  te no errors..  
232b0 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20  */.  rc = 0;..  
232c0 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  /* Control jumps
232d0 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65   to here if an e
232e0 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
232f0 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70  red above, or up
23300 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  on.  ** successf
23310 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65  ul coding of the
23320 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65   SELECT..  */.se
23330 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20  lect_end:..  /* 
23340 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
23350 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c  names if we will
23360 20 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69   be using them i
23370 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54  n a callback.  T
23380 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73  his.  ** step is
23390 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
233a0 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20  output is going 
233b0 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65  to some other de
233c0 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  stination..  */.
233d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
233e0 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44  _OK && pDest->eD
233f0 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
23400 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  k ){.    generat
23410 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
23420 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
23430 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73  EList);.  }..  s
23440 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23450 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b   sAggInfo.aCol);
23460 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
23470 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  (db, sAggInfo.aF
23480 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unc);.  return r
23490 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  c;.}..#if define
234a0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
234b0 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /*.*************
234c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
234d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
234e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
234f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23500 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
23510 69 6e 67 20 63 6f 64 65 20 69 73 20 75 73 65 64  ing code is used
23520 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
23530 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
23540 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68    The code.** th
23550 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20  at follows does 
23560 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f  not appear in no
23570 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a  rmal builds..**.
23580 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
23590 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 72  s are used to pr
235a0 69 6e 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74  int out the cont
235b0 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61  ent of all or pa
235c0 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73  rt of a .** pars
235d0 65 20 73 74 72 75 63 74 75 72 65 73 20 73 75 63  e structures suc
235e0 68 20 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45  h as Select or E
235f0 78 70 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74  xpr.  Such print
23600 6f 75 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a  outs are useful.
23610 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74  ** for helping t
23620 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61  o understand wha
23630 74 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69  t is happening i
23640 6e 73 69 64 65 20 74 68 65 20 63 6f 64 65 20 67  nside the code g
23650 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69  enerator.** duri
23660 6e 67 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e  ng the execution
23670 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45   of complex SELE
23680 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
23690 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
236a0 6e 65 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65  ne are not calle
236b0 64 20 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20  d anywhere from 
236c0 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61  within the norma
236d0 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20  l.** code base. 
236e0 20 54 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64   Then are intend
236f0 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
23700 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
23710 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66  debugger.** or f
23720 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70  rom temporary "p
23730 72 69 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74  rintf" statement
23740 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64  s inserted for d
23750 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  ebugging..*/.voi
23760 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78  d sqlite3PrintEx
23770 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  pr(Expr *p){.  i
23780 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26  f( p->token.z &&
23790 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b   p->token.n>0 ){
237a0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
237b0 67 50 72 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c  gPrintf("(%.*s",
237c0 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e   p->token.n, p->
237d0 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73  token.z);.  }els
237e0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e{.    sqlite3De
237f0 62 75 67 50 72 69 6e 74 66 28 22 28 25 64 22 2c  bugPrintf("(%d",
23800 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69   p->op);.  }.  i
23810 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  f( p->pLeft ){. 
23820 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23830 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20  rintf(" ");.    
23840 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
23850 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a  (p->pLeft);.  }.
23860 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20    if( p->pRight 
23870 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
23880 62 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a  bugPrintf(" ");.
23890 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
238a0 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 29 3b  Expr(p->pRight);
238b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
238c0 62 75 67 50 72 69 6e 74 66 28 22 29 22 29 3b 0a  bugPrintf(")");.
238d0 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72  }.void sqlite3Pr
238e0 69 6e 74 45 78 70 72 4c 69 73 74 28 45 78 70 72  intExprList(Expr
238f0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
23900 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
23910 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
23920 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
23930 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 4c 69  te3PrintExpr(pLi
23940 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
23950 0a 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74  .    if( i<pList
23960 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20  ->nExpr-1 ){.   
23970 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23980 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20 20  rintf(", ");.   
23990 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71   }.  }.}.void sq
239a0 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74  lite3PrintSelect
239b0 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
239c0 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74  indent){.  sqlit
239d0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
239e0 2a 73 53 45 4c 45 43 54 28 25 70 29 20 22 2c 20  *sSELECT(%p) ", 
239f0 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a  indent, "", p);.
23a00 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
23a10 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
23a20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
23a30 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
23a40 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a   if( p->pSrc ){.
23a50 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69      char *zPrefi
23a60 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  x;.    int i;.  
23a70 20 20 7a 50 72 65 66 69 78 20 3d 20 22 46 52 4f    zPrefix = "FRO
23a80 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  M";.    for(i=0;
23a90 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
23aa0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
23ab0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
23ac0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70  m *pItem = &p->p
23ad0 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
23ae0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23af0 6e 74 66 28 22 25 2a 73 20 22 2c 20 69 6e 64 65  ntf("%*s ", inde
23b00 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a  nt+6, zPrefix);.
23b10 20 20 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20        zPrefix = 
23b20 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  "";.      if( pI
23b30 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
23b40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
23b50 65 62 75 67 50 72 69 6e 74 66 28 22 28 5c 6e 22  ebugPrintf("(\n"
23b60 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
23b70 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28 70 49  e3PrintSelect(pI
23b80 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e  tem->pSelect, in
23b90 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20 20  dent+10);.      
23ba0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23bb0 69 6e 74 66 28 22 25 2a 73 29 22 2c 20 69 6e 64  intf("%*s)", ind
23bc0 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20  ent+8, "");.    
23bd0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
23be0 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  m->zName ){.    
23bf0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23c00 50 72 69 6e 74 66 28 22 25 73 22 2c 20 70 49 74  Printf("%s", pIt
23c10 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
23c20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
23c30 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  tem->pTab ){.   
23c40 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
23c50 67 50 72 69 6e 74 66 28 22 28 74 61 62 6c 65 3a  gPrintf("(table:
23c60 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54   %s)", pItem->pT
23c70 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
23c80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
23c90 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
23ca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
23cb0 62 75 67 50 72 69 6e 74 66 28 22 20 41 53 20 25  bugPrintf(" AS %
23cc0 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  s", pItem->zAlia
23cd0 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
23ce0 20 20 69 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d    if( i<p->pSrc-
23cf0 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20  >nSrc-1 ){.     
23d00 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23d10 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20 20  rintf(",");.    
23d20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
23d30 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
23d40 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
23d50 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b  if( p->pWhere ){
23d60 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
23d70 67 50 72 69 6e 74 66 28 22 25 2a 73 20 57 48 45  gPrintf("%*s WHE
23d80 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  RE ", indent, ""
23d90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
23da0 69 6e 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72  intExpr(p->pWher
23db0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
23dc0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
23dd0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
23de0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
23df0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23e00 66 28 22 25 2a 73 20 47 52 4f 55 50 20 42 59 20  f("%*s GROUP BY 
23e10 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
23e20 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
23e30 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
23e40 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
23e50 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
23e60 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n");.  }.  if( p
23e70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ->pHaving ){.   
23e80 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23e90 6e 74 66 28 22 25 2a 73 20 48 41 56 49 4e 47 20  ntf("%*s HAVING 
23ea0 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
23eb0 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
23ec0 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 29  Expr(p->pHaving)
23ed0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
23ee0 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
23ef0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
23f00 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
23f10 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23f20 22 25 2a 73 20 4f 52 44 45 52 20 42 59 20 22 2c  "%*s ORDER BY ",
23f30 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
23f40 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
23f50 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
23f60 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
23f70 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
23f80 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20  );.  }.}./* End 
23f90 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
23fa0 20 64 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20   debug printing 
23fb0 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  code.***********
23fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24000 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  **/.#endif /* de
24010 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
24020 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
24030 4c 49 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a     LITE_DEBUG) */.