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

Artifact 75d4ffe971e25831125ea165c0c580df00f4c403:


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 37 37  select.c,v 1.477
0200: 20 32 30 30 38 2f 31 30 2f 30 36 20 30 35 3a 33   2008/10/06 05:3
0210: 32 3a 31 39 20 64 61 6e 69 65 6c 6b 31 39 37 37  2:19 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 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
09f0: 69 73 44 69 73 74 69 6e 63 74 20 3f 20 53 46 5f  isDistinct ? SF_
0a00: 44 69 73 74 69 6e 63 74 20 3a 20 30 3b 0a 20 20  Distinct : 0;.  
0a10: 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  pNew->op = TK_SE
0a20: 4c 45 43 54 3b 0a 20 20 61 73 73 65 72 74 28 20  LECT;.  assert( 
0a30: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c  pOffset==0 || pL
0a40: 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65  imit!=0 );.  pNe
0a50: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  w->pLimit = pLim
0a60: 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66  it;.  pNew->pOff
0a70: 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
0a80: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
0a90: 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[0] = -1;.  p
0aa0: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
0ab0: 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[1] = -1;.  pNe
0ac0: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
0ad0: 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64  2] = -1;.  if( d
0ae0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0af0: 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c  ) {.    clearSel
0b00: 65 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ect(db, pNew);. 
0b10: 20 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73 74     if( pNew!=&st
0b20: 61 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33 44  andin ) sqlite3D
0b30: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
0b40: 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
0b50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
0b60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
0b70: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
0b80: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
0b90: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
0ba0: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
0bb0: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
0bc0: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
0bd0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  db, Select *p){.
0be0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
0bf0: 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70  learSelect(db, p
0c00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
0c10: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d  Free(db, p);.  }
0c20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
0c30: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
0c40: 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74 68  rs preceeding th
0c50: 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20  e JOIN keyword, 
0c60: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a  determine the.**
0c70: 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20   type of join.  
0c80: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
0c90: 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  r constant that 
0ca0: 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74  expresses that t
0cb0: 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20  ype.** in terms 
0cc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0cd0: 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a   bit values:.**.
0ce0: 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a  **     JT_INNER.
0cf0: 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a  **     JT_CROSS.
0d00: 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a  **     JT_OUTER.
0d10: 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41  **     JT_NATURA
0d20: 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54  L.**     JT_LEFT
0d30: 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54  .**     JT_RIGHT
0d40: 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75  .**.** A full ou
0d50: 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20  ter join is the 
0d60: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a  combination of J
0d70: 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49  T_LEFT and JT_RI
0d80: 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  GHT..**.** If an
0d90: 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75   illegal or unsu
0da0: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
0db0: 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20  e is seen, then 
0dc0: 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20  still return.** 
0dd0: 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74  a join type, but
0de0: 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e   put an error in
0df0: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
0e00: 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
0e10: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61  lite3JoinType(Pa
0e20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
0e30: 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70  en *pA, Token *p
0e40: 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20  B, Token *pC){. 
0e50: 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
0e60: 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c  0;.  Token *apAl
0e70: 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  l[3];.  Token *p
0e80: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0e90: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
0ea0: 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 77 6f 72  nst char zKeywor
0eb0: 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20 6e 43 68  d[8];.    u8 nCh
0ec0: 61 72 3b 0a 20 20 20 20 75 38 20 63 6f 64 65 3b  ar;.    u8 code;
0ed0: 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20  .  } keywords[] 
0ee0: 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61 74 75 72  = {.    { "natur
0ef0: 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52  al", 7, JT_NATUR
0f00: 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66  AL },.    { "lef
0f10: 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46  t",    4, JT_LEF
0f20: 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  T|JT_OUTER },.  
0f30: 20 20 7b 20 22 72 69 67 68 74 22 2c 20 20 20 35    { "right",   5
0f40: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
0f50: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75  TER },.    { "fu
0f60: 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45  ll",    4, JT_LE
0f70: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
0f80: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f  UTER },.    { "o
0f90: 75 74 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f  uter",   5, JT_O
0fa0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69  UTER },.    { "i
0fb0: 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49  nner",   5, JT_I
0fc0: 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63  NNER },.    { "c
0fd0: 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49  ross",   5, JT_I
0fe0: 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 7d 2c  NNER|JT_CROSS },
0ff0: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
1000: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
1010: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
1020: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
1030: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
1040: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
1050: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
1060: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
1070: 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b  (j=0; j<sizeof(k
1080: 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28  eywords)/sizeof(
1090: 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b  keywords[0]); j+
10a0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
10b0: 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >n==keywords[j].
10c0: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
10d0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
10e0: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
10f0: 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65   keywords[j].zKe
1100: 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20  yword, p->n)==0 
1110: 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74  ){.        joint
1120: 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73 5b  ype |= keywords[
1130: 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20  j].code;.       
1140: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1150: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
1160: 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  =sizeof(keywords
1170: 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  )/sizeof(keyword
1180: 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 6a  s[0]) ){.      j
1190: 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52  ointype |= JT_ER
11a0: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
11b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
11c0: 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  (.     (jointype
11d0: 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   & (JT_INNER|JT_
11e0: 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e  OUTER))==(JT_INN
11f0: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a  ER|JT_OUTER) ||.
1200: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1210: 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20   JT_ERROR)!=0.  
1220: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1230: 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20  r *zSp = " ";.  
1240: 20 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20    assert( pB!=0 
1250: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30  );.    if( pC==0
1260: 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20   ){ zSp++; }.   
1270: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1280: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
1290: 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64  n or unsupported
12a0: 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20   join type: ".  
12b0: 20 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22       "%T %T%s%T"
12c0: 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70  , pA, pB, zSp, p
12d0: 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  C);.    jointype
12e0: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
12f0: 65 6c 73 65 20 69 66 28 20 6a 6f 69 6e 74 79 70  else if( jointyp
1300: 65 20 26 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a  e & JT_RIGHT ){.
1310: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1320: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
1330: 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46 55     "RIGHT and FU
1340: 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61  LL OUTER JOINs a
1350: 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  re not currently
1360: 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20   supported");.  
1370: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
1380: 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  INNER;.  }.  ret
1390: 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a  urn jointype;.}.
13a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
13b0: 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c  e index of a col
13c0: 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20  umn in a table. 
13d0: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68   Return -1 if th
13e0: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e  e column.** is n
13f0: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
1400: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
1410: 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49  atic int columnI
1420: 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62  ndex(Table *pTab
1430: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  , const char *zC
1440: 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ol){.  int i;.  
1450: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
1460: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
1470: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1480: 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  Cmp(pTab->aCol[i
1490: 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ].zName, zCol)==
14a0: 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
14b0: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
14c0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
14d0: 76 61 6c 75 65 20 6f 66 20 61 20 74 6f 6b 65 6e  value of a token
14e0: 20 74 6f 20 61 20 27 5c 30 30 30 27 2d 74 65 72   to a '\000'-ter
14f0: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a  minated string..
1500: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1510: 65 74 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70  etToken(Token *p
1520: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
1530: 7b 0a 20 20 70 2d 3e 7a 20 3d 20 28 75 38 2a 29  {.  p->z = (u8*)
1540: 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20 7a 20 3f 20  z;.  p->n = z ? 
1550: 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20  strlen(z) : 0;. 
1560: 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a   p->dyn = 0;.}..
1570: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 74 6f  /*.** Set the to
1580: 6b 65 6e 20 74 6f 20 74 68 65 20 64 6f 75 62 6c  ken to the doubl
1590: 65 2d 71 75 6f 74 65 64 20 61 6e 64 20 65 73 63  e-quoted and esc
15a0: 61 70 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  aped version of 
15b0: 74 68 65 20 73 74 72 69 6e 67 20 70 6f 69 6e 74  the string point
15c0: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 2e 20 46  ed.** to by z. F
15d0: 6f 72 20 65 78 61 6d 70 6c 65 3b 0a 2a 2a 0a 2a  or example;.**.*
15e0: 2a 20 20 20 20 7b 61 22 62 63 7d 20 20 2d 3e 20  *    {a"bc}  -> 
15f0: 20 7b 22 61 22 22 62 63 22 7d 0a 2a 2f 0a 73 74   {"a""bc"}.*/.st
1600: 61 74 69 63 20 76 6f 69 64 20 73 65 74 51 75 6f  atic void setQuo
1610: 74 65 64 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a  tedToken(Parse *
1620: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
1630: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
1640: 7b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  {..  /* Check if
1650: 20 74 68 65 20 73 74 72 69 6e 67 20 61 70 70 65   the string appe
1660: 61 72 73 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ars to be quoted
1670: 20 75 73 69 6e 67 20 22 2e 2e 2e 22 20 6f 72 20   using "..." or 
1680: 60 2e 2e 2e 60 0a 20 20 2a 2a 20 6f 72 20 5b 2e  `...`.  ** or [.
1690: 2e 2e 5d 20 6f 72 20 27 2e 2e 2e 27 20 6f 72 20  ..] or '...' or 
16a0: 69 66 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f  if the string co
16b0: 6e 74 61 69 6e 73 20 61 6e 79 20 22 20 63 68 61  ntains any " cha
16c0: 72 61 63 74 65 72 73 2e 20 20 0a 20 20 2a 2a 20  racters.  .  ** 
16d0: 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e  If it does, then
16e0: 20 72 65 63 6f 72 64 20 61 20 76 65 72 73 69 6f   record a versio
16f0: 6e 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  n of the string 
1700: 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
1710: 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 73  .  ** characters
1720: 20 65 73 63 61 70 65 64 2e 0a 20 20 2a 2f 0a 20   escaped..  */. 
1730: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20   const char *z2 
1740: 3d 20 7a 3b 0a 20 20 69 66 28 20 2a 7a 32 21 3d  = z;.  if( *z2!=
1750: 27 5b 27 20 26 26 20 2a 7a 32 21 3d 27 60 27 20  '[' && *z2!='`' 
1760: 26 26 20 2a 7a 32 21 3d 27 5c 27 27 20 29 7b 0a  && *z2!='\'' ){.
1770: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29      while( *z2 )
1780: 7b 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 32 3d  {.      if( *z2=
1790: 3d 27 22 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  ='"' ) break;.  
17a0: 20 20 20 20 7a 32 2b 2b 3b 0a 20 20 20 20 7d 0a      z2++;.    }.
17b0: 20 20 7d 0a 0a 20 20 69 66 28 20 2a 7a 32 20 29    }..  if( *z2 )
17c0: 7b 0a 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20  {.    /* String 
17d0: 63 6f 6e 74 61 69 6e 73 20 22 20 63 68 61 72 61  contains " chara
17e0: 63 74 65 72 73 20 2d 20 63 6f 70 79 20 61 6e 64  cters - copy and
17f0: 20 71 75 6f 74 65 20 74 68 65 20 73 74 72 69 6e   quote the strin
1800: 67 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 7a 20 3d  g. */.    p->z =
1810: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 50   (u8 *)sqlite3MP
1820: 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
1830: 2c 20 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a  , "\"%w\"", z);.
1840: 20 20 20 20 69 66 28 20 70 2d 3e 7a 20 29 7b 0a      if( p->z ){.
1850: 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20 73 74 72        p->n = str
1860: 6c 65 6e 28 28 63 68 61 72 20 2a 29 70 2d 3e 7a  len((char *)p->z
1870: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 79 6e 20  );.      p->dyn 
1880: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
1890: 73 65 7b 0a 20 20 20 20 2f 2a 20 53 74 72 69 6e  se{.    /* Strin
18a0: 67 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 22 20  g contains no " 
18b0: 63 68 61 72 61 63 74 65 72 73 20 2d 20 63 6f 70  characters - cop
18c0: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 2a  y the pointer. *
18d0: 2f 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 28 75 38  /.    p->z = (u8
18e0: 2a 29 7a 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d 20  *)z;.    p->n = 
18f0: 28 7a 32 20 2d 20 7a 29 3b 0a 20 20 20 20 70 2d  (z2 - z);.    p-
1900: 3e 64 79 6e 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  >dyn = 0;.  }.}.
1910: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e  ./*.** Create an
1920: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
1930: 20 66 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69   for an identifi
1940: 65 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  er with the name
1950: 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a 45 78 70   of zName.*/.Exp
1960: 72 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65  r *sqlite3Create
1970: 49 64 45 78 70 72 28 50 61 72 73 65 20 2a 70 50  IdExpr(Parse *pP
1980: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
1990: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b 65   *zName){.  Toke
19a0: 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65 74 54 6f  n dummy;.  setTo
19b0: 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d  ken(&dummy, zNam
19c0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e);.  return sql
19d0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
19e0: 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26  , TK_ID, 0, 0, &
19f0: 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dummy);.}../*.**
1a00: 20 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74   Add a term to t
1a10: 68 65 20 57 48 45 52 45 20 65 78 70 72 65 73 73  he WHERE express
1a20: 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74  ion in *ppExpr t
1a30: 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
1a40: 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20  .** zCol column 
1a50: 74 6f 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74  to be equal in t
1a60: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54  he two tables pT
1a70: 61 62 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a  ab1 and pTab2..*
1a80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64  /.static void ad
1a90: 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61  dWhereTerm(.  Pa
1aa0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1ab0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1ac0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63  g context */.  c
1ad0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c  onst char *zCol,
1ae0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1af0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  of the column */
1b00: 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a  .  const Table *
1b10: 70 54 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46  pTab1,      /* F
1b20: 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  irst table */.  
1b30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69  const char *zAli
1b40: 61 73 31 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61  as1,     /* Alia
1b50: 73 20 66 6f 72 20 66 69 72 73 74 20 74 61 62 6c  s for first tabl
1b60: 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
1b70: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65  */.  const Table
1b80: 20 2a 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a   *pTab2,      /*
1b90: 20 53 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   Second table */
1ba0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1bb0: 41 6c 69 61 73 32 2c 20 20 20 20 20 2f 2a 20 41  Alias2,     /* A
1bc0: 6c 69 61 73 20 66 6f 72 20 73 65 63 6f 6e 64 20  lias for second 
1bd0: 74 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e  table.  May be N
1be0: 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69  ULL */.  int iRi
1bf0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 2c 20 20 20  ghtJoinTable,   
1c00: 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
1c10: 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 74   for the right t
1c20: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  able */.  Expr *
1c30: 2a 70 70 45 78 70 72 2c 20 20 20 20 20 20 20 20  *ppExpr,        
1c40: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 71     /* Add the eq
1c50: 75 61 6c 69 74 79 20 74 65 72 6d 20 74 6f 20 74  uality term to t
1c60: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
1c70: 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a  /.  int isOuterJ
1c80: 6f 69 6e 20 20 20 20 20 20 20 20 20 20 2f 2a 20  oin          /* 
1c90: 54 72 75 65 20 69 66 20 64 65 61 6c 69 6e 67 20  True if dealing 
1ca0: 77 69 74 68 20 61 6e 20 4f 55 54 45 52 20 6a 6f  with an OUTER jo
1cb0: 69 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  in */.){.  Expr 
1cc0: 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a 70  *pE1a, *pE1b, *p
1cd0: 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 32  E1c;.  Expr *pE2
1ce0: 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63 3b  a, *pE2b, *pE2c;
1cf0: 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20 20  .  Expr *pE;..  
1d00: 70 45 31 61 20 3d 20 73 71 6c 69 74 65 33 43 72  pE1a = sqlite3Cr
1d10: 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73  eateIdExpr(pPars
1d20: 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70 45 32 61  e, zCol);.  pE2a
1d30: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1d40: 49 64 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a  IdExpr(pParse, z
1d50: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69  Col);.  if( zAli
1d60: 61 73 31 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41  as1==0 ){.    zA
1d70: 6c 69 61 73 31 20 3d 20 70 54 61 62 31 2d 3e 7a  lias1 = pTab1->z
1d80: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 31 62  Name;.  }.  pE1b
1d90: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1da0: 49 64 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a  IdExpr(pParse, z
1db0: 41 6c 69 61 73 31 29 3b 0a 20 20 69 66 28 20 7a  Alias1);.  if( z
1dc0: 41 6c 69 61 73 32 3d 3d 30 20 29 7b 0a 20 20 20  Alias2==0 ){.   
1dd0: 20 7a 41 6c 69 61 73 32 20 3d 20 70 54 61 62 32   zAlias2 = pTab2
1de0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70  ->zName;.  }.  p
1df0: 45 32 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E2b = sqlite3Cre
1e00: 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65  ateIdExpr(pParse
1e10: 2c 20 7a 41 6c 69 61 73 32 29 3b 0a 20 20 70 45  , zAlias2);.  pE
1e20: 31 63 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  1c = sqlite3PExp
1e30: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
1e40: 2c 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29  , pE1b, pE1a, 0)
1e50: 3b 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74  ;.  pE2c = sqlit
1e60: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
1e70: 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20 70 45  TK_DOT, pE2b, pE
1e80: 32 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d 20 73  2a, 0);.  pE = s
1e90: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1ea0: 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 63 2c  se, TK_EQ, pE1c,
1eb0: 20 70 45 32 63 2c 20 30 29 3b 0a 20 20 69 66 28   pE2c, 0);.  if(
1ec0: 20 70 45 20 26 26 20 69 73 4f 75 74 65 72 4a 6f   pE && isOuterJo
1ed0: 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65  in ){.    ExprSe
1ee0: 74 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  tProperty(pE, EP
1ef0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
1f00: 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pE->iRightJoinTa
1f10: 62 6c 65 20 3d 20 69 52 69 67 68 74 4a 6f 69 6e  ble = iRightJoin
1f20: 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70  Table;.  }.  *pp
1f30: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
1f40: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
1f50: 2c 2a 70 70 45 78 70 72 2c 20 70 45 29 3b 0a 7d  ,*ppExpr, pE);.}
1f60: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1f70: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
1f80: 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  erty on all term
1f90: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  s of the given e
1fa0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e  xpression..** An
1fb0: 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69  d set the Expr.i
1fc0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
1fd0: 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65  o iTable for eve
1fe0: 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a  ry term in the.*
1ff0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  * expression..**
2000: 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a  .** The EP_FromJ
2010: 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20  oin property is 
2020: 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66  used on terms of
2030: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2040: 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45  o tell.** the LE
2050: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72  FT OUTER JOIN pr
2060: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74  ocessing logic t
2070: 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73  hat this term is
2080: 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20   part of the.** 
2090: 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e  join restriction
20a0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
20b0: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
20c0: 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70  ause and not a p
20d0: 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f  art.** of the mo
20e0: 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45  re general WHERE
20f0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20   clause.  These 
2100: 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20  terms are moved 
2110: 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57  over to the.** W
2120: 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69  HERE clause duri
2130: 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69  ng join processi
2140: 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74  ng but we need t
2150: 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20  o remember that 
2160: 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74  they.** originat
2170: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
2180: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a  USING clause..**
2190: 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69  .** The Expr.iRi
21a0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c  ghtJoinTable tel
21b0: 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ls the WHERE cla
21c0: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74  use processing t
21d0: 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65  hat the.** expre
21e0: 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e  ssion depends on
21f0: 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69   table iRightJoi
2200: 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74  nTable even if t
2210: 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  hat table is not
2220: 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d  .** explicitly m
2230: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
2240: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61  expression.  Tha
2250: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  t information is
2260: 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63   needed.** for c
2270: 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ases like this:.
2280: 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
2290: 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
22a0: 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
22b0: 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a  2.b AND t1.x=5.*
22c0: 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63  *.** The where c
22d0: 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64  lause needs to d
22e0: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
22f0: 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a  g of the t1.x=5.
2300: 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66  ** term until af
2310: 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  ter the t2 loop 
2320: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e  of the join.  In
2330: 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20   that way, a.** 
2340: 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c  NULL t2 row will
2350: 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65   be inserted whe
2360: 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20  never t1.x!=5.  
2370: 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20  If we do not.** 
2380: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
2390: 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74  ng of t1.x=5, it
23a0: 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73   will be process
23b0: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  ed immediately.*
23c0: 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c  * after the t1 l
23d0: 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74  oop and rows wit
23e0: 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e  h t1.x!=5 will n
23f0: 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a  ever appear in.*
2400: 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68  * the output, wh
2410: 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74  ich is incorrect
2420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2430: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70   setJoinExpr(Exp
2440: 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  r *p, int iTable
2450: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  ){.  while( p ){
2460: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
2470: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
2480: 6f 69 6e 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69  oin);.    p->iRi
2490: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69  ghtJoinTable = i
24a0: 54 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f  Table;.    setJo
24b0: 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  inExpr(p->pLeft,
24c0: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20   iTable);.    p 
24d0: 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d  = p->pRight;.  }
24e0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
24f0: 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65  routine processe
2500: 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72  s the join infor
2510: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  mation for a SEL
2520: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
2530: 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  * ON and USING c
2540: 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65  lauses are conve
2550: 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20  rted into extra 
2560: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
2570: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41  RE clause..** NA
2580: 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f  TURAL joins also
2590: 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48   create extra WH
25a0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
25b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
25c0: 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  s of a FROM clau
25d0: 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  se are contained
25e0: 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70   in the Select.p
25f0: 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Src structure..*
2600: 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20  * The left most 
2610: 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72  table is the fir
2620: 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65  st entry in Sele
2630: 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69  ct.pSrc.  The ri
2640: 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c  ght-most.** tabl
2650: 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e  e is the last en
2660: 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f  try.  The join o
2670: 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20  perator is held 
2680: 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a  in the entry to.
2690: 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  ** the left.  Th
26a0: 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61  us entry 0 conta
26b0: 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  ins the join ope
26c0: 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  rator for the jo
26d0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e  in between.** en
26e0: 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20  tries 0 and 1.  
26f0: 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  Any ON or USING 
2700: 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74  clauses associat
2710: 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e  ed with the join
2720: 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74   are.** also att
2730: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
2740: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
2750: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2760: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
2770: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
2780: 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
2790: 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73  int sqliteProces
27a0: 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61  sJoin(Parse *pPa
27b0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
27c0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
27d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27e0: 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73     /* All tables
27f0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2800: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  use */.  int i, 
2810: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
2820: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2830: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73   counters */.  s
2840: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2850: 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f  em *pLeft;     /
2860: 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69  * Left table bei
2870: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73  ng joined */.  s
2880: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2890: 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f  em *pRight;    /
28a0: 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65  * Right table be
28b0: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20  ing joined */.. 
28c0: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
28d0: 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63  .  pLeft = &pSrc
28e0: 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74  ->a[0];.  pRight
28f0: 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20   = &pLeft[1];.  
2900: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
2910: 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52  >nSrc-1; i++, pR
2920: 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29  ight++, pLeft++)
2930: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65  {.    Table *pLe
2940: 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70  ftTab = pLeft->p
2950: 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Tab;.    Table *
2960: 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67  pRightTab = pRig
2970: 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e  ht->pTab;.    in
2980: 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20  t isOuter;..    
2990: 69 66 28 20 70 4c 65 66 74 54 61 62 3d 3d 30 20  if( pLeftTab==0 
29a0: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 20  || pRightTab==0 
29b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
29c0: 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67 68  isOuter = (pRigh
29d0: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
29e0: 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20  _OUTER)!=0;..   
29f0: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54   /* When the NAT
2a00: 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20  URAL keyword is 
2a10: 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45  present, add WHE
2a20: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
2a30: 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
2a40: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
2a50: 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65   two tables have
2a60: 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20   in common..    
2a70: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
2a80: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
2a90: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
2aa0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2ab0: 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73  n || pRight->pUs
2ac0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
2ad0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2ae0: 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41  Parse, "a NATURA
2af0: 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68  L join may not h
2b00: 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  ave ".          
2b10: 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47   "an ON or USING
2b20: 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20   clause", 0);.  
2b30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2b40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
2b50: 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74 54 61  r(j=0; j<pLeftTa
2b60: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
2b70: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
2b80: 6d 65 20 3d 20 70 4c 65 66 74 54 61 62 2d 3e 61  me = pLeftTab->a
2b90: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col[j].zName;.  
2ba0: 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e        if( column
2bb0: 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c  Index(pRightTab,
2bc0: 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
2bd0: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
2be0: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61  Term(pParse, zNa
2bf0: 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c  me, pLeftTab, pL
2c00: 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20  eft->zAlias, .  
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
2c30: 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a  htTab, pRight->z
2c40: 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20  Alias,.         
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69 43 75       pRight->iCu
2c70: 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  rsor, &p->pWhere
2c80: 2c 20 69 73 4f 75 74 65 72 29 3b 0a 20 20 20 20  , isOuter);.    
2c90: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d        .        }
2ca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2cb0: 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20      /* Disallow 
2cc0: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
2cd0: 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65  G clauses in the
2ce0: 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a   same join.    *
2cf0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
2d00: 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d  ->pOn && pRight-
2d10: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
2d20: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2d30: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
2d40: 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e   have both ON an
2d50: 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20  d USING ".      
2d60: 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68    "clauses in th
2d70: 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20  e same join");. 
2d80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2d90: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
2da0: 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74   the ON clause t
2db0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
2dc0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63   WHERE clause, c
2dd0: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20  onnected by.    
2de0: 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ** an AND operat
2df0: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
2e00: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29  f( pRight->pOn )
2e10: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75  {.      if( isOu
2e20: 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70  ter ) setJoinExp
2e30: 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70  r(pRight->pOn, p
2e40: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b  Right->iCursor);
2e50: 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65  .      p->pWhere
2e60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
2e70: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  d(pParse->db, p-
2e80: 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d  >pWhere, pRight-
2e90: 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69  >pOn);.      pRi
2ea0: 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20  ght->pOn = 0;.  
2eb0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
2ec0: 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  te extra terms o
2ed0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2ee0: 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  se for each colu
2ef0: 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20  mn named.    ** 
2f00: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
2f10: 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49  use.  Example: I
2f20: 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  f the two tables
2f30: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72   to be joined ar
2f40: 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20  e .    ** A and 
2f50: 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20  B and the USING 
2f60: 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20  clause names X, 
2f70: 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61  Y, and Z, then a
2f80: 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74  dd this.    ** t
2f90: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
2fa0: 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41  se:    A.X=B.X A
2fb0: 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41  ND A.Y=B.Y AND A
2fc0: 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65  .Z=B.Z.    ** Re
2fd0: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66  port an error if
2fe0: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74   any column ment
2ff0: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49  ioned in the USI
3000: 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20  NG clause is.   
3010: 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   ** not containe
3020: 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  d in both tables
3030: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20   to be joined.. 
3040: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
3050: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
3060: 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c        IdList *pL
3070: 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55  ist = pRight->pU
3080: 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  sing;.      for(
3090: 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49  j=0; j<pList->nI
30a0: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
30b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
30c0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
30d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
30e0: 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 54  lumnIndex(pLeftT
30f0: 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20  ab, zName)<0 || 
3100: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
3110: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20  htTab, zName)<0 
3120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
3130: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3140: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69  rse, "cannot joi
3150: 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25  n using column %
3160: 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20  s - column ".   
3170: 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72           "not pr
3180: 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61  esent in both ta
3190: 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  bles", zName);. 
31a0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
31b0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
31c0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
31d0: 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c  m(pParse, zName,
31e0: 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74   pLeftTab, pLeft
31f0: 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20  ->zAlias, .     
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3210: 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61 62         pRightTab
3220: 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73  , pRight->zAlias
3230: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
3250: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26  ight->iCursor, &
3260: 70 2d 3e 70 57 68 65 72 65 2c 20 69 73 4f 75 74  p->pWhere, isOut
3270: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
3280: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3290: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  0;.}../*.** Inse
32a0: 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22  rt code into "v"
32b0: 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20   that will push 
32c0: 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68  the record on th
32d0: 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20  e top of the.** 
32e0: 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73  stack into the s
32f0: 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  orter..*/.static
3300: 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f   void pushOntoSo
3310: 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rter(.  Parse *p
3320: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
3330: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
3340: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3350: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20  pOrderBy,    /* 
3360: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
3370: 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  use */.  Select 
3380: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
3390: 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c  /* The whole SEL
33a0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
33b0: 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 20 20  .  int regData  
33c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
33d0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
33e0: 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ta to be sorted 
33f0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
3400: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
3410: 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70  .  int nExpr = p
3420: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
3430: 20 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d 20    int regBase = 
3440: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
3450: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70  nge(pParse, nExp
3460: 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67 52  r+2);.  int regR
3470: 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
3480: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
3490: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
34a0: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
34b0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 72  rse, pOrderBy, r
34c0: 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 73 71  egBase, 0);.  sq
34d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
34e0: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
34f0: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
3500: 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  or, regBase+nExp
3510: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
3520: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
3530: 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67 42 61  , regData, regBa
3540: 73 65 2b 6e 45 78 70 72 2b 31 2c 20 31 29 3b 0a  se+nExpr+1, 1);.
3550: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3560: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
3570: 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e  cord, regBase, n
3580: 45 78 70 72 20 2b 20 32 2c 20 72 65 67 52 65 63  Expr + 2, regRec
3590: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
35a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
35b0: 49 64 78 49 6e 73 65 72 74 2c 20 70 4f 72 64 65  IdxInsert, pOrde
35c0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  rBy->iECursor, r
35d0: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
35e0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
35f0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
3600: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
3610: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
3620: 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
3630: 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69 66  , nExpr+2);.  if
3640: 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  ( pSelect->iLimi
3650: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  t ){.    int add
3660: 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 69  r1, addr2;.    i
3670: 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69  nt iLimit;.    i
3680: 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66  f( pSelect->iOff
3690: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c 69  set ){.      iLi
36a0: 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69  mit = pSelect->i
36b0: 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65  Offset+1;.    }e
36c0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69  lse{.      iLimi
36d0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69  t = pSelect->iLi
36e0: 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  mit;.    }.    a
36f0: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
3700: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
3710: 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 0a  fZero, iLimit);.
3720: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3730: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
3740: 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b  mm, iLimit, -1);
3750: 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
3760: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
3770: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
3780: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
3790: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
37a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37b0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c  dOp1(v, OP_Last,
37c0: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
37d0: 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
37e0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
37f0: 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72 64 65 72  P_Delete, pOrder
3800: 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  By->iECursor);. 
3810: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3820: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29  mpHere(v, addr2)
3830: 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69  ;.    pSelect->i
3840: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Limit = 0;.  }.}
3850: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
3860: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
3870: 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74  e OFFSET.*/.stat
3880: 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73  ic void codeOffs
3890: 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  et(.  Vdbe *v,  
38a0: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
38b0: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
38c0: 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63  is VM */.  Selec
38d0: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  t *p,        /* 
38e0: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
38f0: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
3900: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
3910: 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  nue     /* Jump 
3920: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65  here to skip the
3930: 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20   current record 
3940: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69  */.){.  if( p->i
3950: 4f 66 66 73 65 74 20 26 26 20 69 43 6f 6e 74 69  Offset && iConti
3960: 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  nue!=0 ){.    in
3970: 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69  t addr;.    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 41 64 64 49 6d 6d 2c 20 70 2d 3e 69   OP_AddImm, p->i
39a0: 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20  Offset, -1);.   
39b0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
39c0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
39d0: 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65  IfNeg, p->iOffse
39e0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
39f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3a00: 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e  Goto, 0, iContin
3a10: 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ue);.    VdbeCom
3a20: 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f  ment((v, "skip O
3a30: 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29  FFSET records"))
3a40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3a50: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
3a60: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
3a70: 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77   Add code that w
3a80: 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ill check to mak
3a90: 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67  e sure the N reg
3aa0: 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
3ab0: 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20  at iMem.** form 
3ac0: 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79  a distinct entry
3ad0: 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72  .  iTab is a sor
3ae0: 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
3af0: 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79  holds previously
3b00: 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61  .** seen combina
3b10: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76  tions of the N v
3b20: 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e  alues.  A new en
3b30: 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69  try is made in i
3b40: 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75  Tab.** if the cu
3b50: 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61  rrent N values a
3b60: 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20  re new..**.** A 
3b70: 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65  jump to addrRepe
3b80: 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74  at is made and t
3b90: 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72  he N+1 values ar
3ba0: 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
3bb0: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68  e.** stack if th
3bc0: 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73  e top N elements
3bd0: 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63   are not distinc
3be0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
3bf0: 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a  d codeDistinct(.
3c00: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3c10: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
3c20: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
3c30: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
3c40: 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20   int iTab,      
3c50: 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67      /* A sorting
3c60: 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74   index used to t
3c70: 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74  est for distinct
3c80: 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ness */.  int ad
3c90: 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20  drRepeat,    /* 
3ca0: 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20  Jump to here if 
3cb0: 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  not distinct */.
3cc0: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
3cd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3ce0: 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  f elements */.  
3cf0: 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20  int iMem        
3d00: 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d     /* First elem
3d10: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ent */.){.  Vdbe
3d20: 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a   *v;.  int r1;..
3d30: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
3d40: 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69  dbe;.  r1 = sqli
3d50: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
3d60: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
3d70: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
3d80: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65  _MakeRecord, iMe
3d90: 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c  m, N, r1);.  sql
3da0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
3db0: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62  , OP_Found, iTab
3dc0: 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 72 31  , addrRepeat, r1
3dd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3de0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
3df0: 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31  Insert, iTab, r1
3e00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
3e10: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
3e20: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
3e30: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72   Generate an err
3e40: 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20  or message when 
3e50: 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65 64  a SELECT is used
3e60: 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78 70   within a subexp
3e70: 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d  ression.** (exam
3e80: 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45 4c  ple:  "a IN (SEL
3e90: 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65  ECT * FROM table
3ea0: 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20 6d  )") but it has m
3eb0: 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75 6c  ore than 1 resul
3ec0: 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65  t.** column.  We
3ed0: 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75   do this in a su
3ee0: 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73 65  broutine because
3ef0: 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
3f00: 73 20 69 6e 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  s in multiple.**
3f10: 20 70 6c 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   places..*/.stat
3f20: 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d  ic int checkForM
3f30: 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74  ultiColumnSelect
3f40: 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a  Error(.  Parse *
3f50: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
3f60: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20   Parse context. 
3f70: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
3f80: 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73  *pDest,   /* Des
3f90: 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45  tination of SELE
3fa0: 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  CT results */.  
3fb0: 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20 20  int nExpr       
3fc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3fd0: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
3fe0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c   returned by SEL
3ff0: 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ECT */.){.  int 
4000: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
4010: 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70  Dest;.  if( nExp
4020: 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53  r>1 && (eDest==S
4030: 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
4040: 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20  =SRT_Set) ){.   
4050: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4060: 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61  (pParse, "only a
4070: 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61   single result a
4080: 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20  llowed for ".   
4090: 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68      "a SELECT th
40a0: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
40b0: 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20   expression");. 
40c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
40d0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
40e0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
40f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
4100: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
4110: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
4120: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
4130: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
4140: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
4150: 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72  b and nColumn ar
4160: 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65  e both zero, the
4170: 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70  n the pEList exp
4180: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  ressions.** are 
4190: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64  evaluated in ord
41a0: 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61  er to get the da
41b0: 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  ta for this row.
41c0: 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a    If nColumn>0.*
41d0: 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70  * then data is p
41e0: 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61  ulled from srcTa
41f0: 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20  b and pEList is 
4200: 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74  used only to get
4210: 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65   the.** datatype
4220: 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
4230: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
4240: 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  d selectInnerLoo
4250: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
4260: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
4270: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
4280: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
4290: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
42a0: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
42b0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
42c0: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
42d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
42e0: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  st,       /* Lis
42f0: 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e  t of values bein
4300: 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20  g extracted */. 
4310: 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20   int srcTab,    
4320: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c           /* Pull
4330: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20   data from this 
4340: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
4350: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
4360: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4370: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73  columns in the s
4380: 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20  ource table */. 
4390: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
43a0: 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e  rBy,     /* If n
43b0: 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65  ot NULL, sort re
43c0: 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73  sults using this
43d0: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69   key */.  int di
43e0: 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20  stinct,         
43f0: 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b    /* If >=0, mak
4400: 65 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61  e sure results a
4410: 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  re distinct */. 
4420: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
4430: 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20  st,      /* How 
4440: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
4450: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
4460: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20  nt iContinue,   
4470: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
4480: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
4490: 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f  with next row */
44a0: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
44b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
44c0: 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
44d0: 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
44e0: 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56  r loop */.){.  V
44f0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
4500: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
4510: 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e  .  int hasDistin
4520: 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
4530: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
4540: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
4550: 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  esent */.  int r
4560: 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20  egResult;       
4570: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
4580: 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e  of memory holdin
4590: 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  g result set */.
45a0: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
45b0: 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a  est->eDest;   /*
45c0: 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
45d0: 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  of results */.  
45e0: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73  int iParm = pDes
45f0: 74 2d 3e 69 50 61 72 6d 3b 20 20 20 2f 2a 20 46  t->iParm;   /* F
4600: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
4610: 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64   disposal method
4620: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c   */.  int nResul
4630: 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tCol;           
4640: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
4650: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
4660: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
4670: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
4680: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
4690: 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69  hasDistinct = di
46a0: 73 74 69 6e 63 74 3e 3d 30 3b 0a 20 20 69 66 28  stinct>=0;.  if(
46b0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
46c0: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
46d0: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
46e0: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , p, iContinue);
46f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
4700: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
4710: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  lumns..  */.  if
4720: 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  ( nColumn>0 ){. 
4730: 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20     nResultCol = 
4740: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65  nColumn;.  }else
4750: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4760: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
4770: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73  ;.  }.  if( pDes
4780: 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20  t->iMem==0 ){.  
4790: 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20    pDest->iMem = 
47a0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
47b0: 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20      pDest->nMem 
47c0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
47d0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
47e0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
47f0: 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d  }else if( pDest-
4800: 3e 6e 4d 65 6d 21 3d 6e 52 65 73 75 6c 74 43 6f  >nMem!=nResultCo
4810: 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  l ){.    /* This
4820: 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 77   happens when tw
4830: 6f 20 53 45 4c 45 43 54 73 20 6f 66 20 61 20 63  o SELECTs of a c
4840: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 68  ompound SELECT h
4850: 61 76 65 20 64 69 66 66 65 72 69 6e 67 0a 20 20  ave differing.  
4860: 20 20 2a 2a 20 6e 75 6d 62 65 72 73 20 6f 66 20    ** numbers of 
4870: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20  result columns. 
4880: 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   The error messa
4890: 67 65 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  ge will be gener
48a0: 61 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  ated by.    ** a
48b0: 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f   higher-level ro
48c0: 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 72 65  utine. */.    re
48d0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 65 67 52  turn;.  }.  regR
48e0: 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69  esult = pDest->i
48f0: 4d 65 6d 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 75  Mem;.  if( nColu
4900: 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  mn>0 ){.    for(
4910: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
4920: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
4930: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4940: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
4950: 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74  ab, i, regResult
4960: 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  +i);.    }.  }el
4970: 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52  se if( eDest!=SR
4980: 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  T_Exists ){.    
4990: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
49a0: 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53  ation is an EXIS
49b0: 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  TS(...) expressi
49c0: 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20  on, the actual. 
49d0: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74     ** values ret
49e0: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
49f0: 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75  ECT are not requ
4a00: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
4a10: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
4a20: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4a30: 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75   pEList, regResu
4a40: 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  lt, eDest==SRT_O
4a50: 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 43  utput);.  }.  nC
4a60: 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43  olumn = nResultC
4a70: 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ol;..  /* If the
4a80: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
4a90: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
4aa0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
4ab0: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
4ac0: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
4ad0: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
4ae0: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
4af0: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
4b00: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
4b10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44  .  */.  if( hasD
4b20: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61  istinct ){.    a
4b30: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
4b40: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
4b50: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e  pEList->nExpr==n
4b60: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f  Column );.    co
4b70: 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
4b80: 65 2c 20 64 69 73 74 69 6e 63 74 2c 20 69 43 6f  e, distinct, iCo
4b90: 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c  ntinue, nColumn,
4ba0: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
4bb0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
4bc0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
4bd0: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
4be0: 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  inue);.    }.  }
4bf0: 0a 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72  ..  if( checkFor
4c00: 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
4c10: 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
4c20: 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Dest, pEList->nE
4c30: 78 70 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  xpr) ){.    retu
4c40: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rn;.  }..  switc
4c50: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
4c60: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
4c70: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
4c80: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
4c90: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
4ca0: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
4cb0: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
4cc0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4cd0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
4ce0: 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54  ECT.    case SRT
4cf0: 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20  _Union: {.      
4d00: 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31  int r1;.      r1
4d10: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
4d20: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
4d30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4d40: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
4d50: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
4d60: 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b  t, nColumn, r1);
4d70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4d80: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4d90: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
4da0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
4db0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
4dc0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
4dd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4de0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
4df0: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
4e00: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
4e10: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
4e20: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
4e30: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
4e40: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
4e50: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
4e60: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
4e70: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
4e80: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
4e90: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
4ea0: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
4eb0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4ec0: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
4ed0: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
4ee0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
4ef0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4f00: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  ndif..    /* Sto
4f10: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
4f20: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
4f30: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
4f40: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
4f50: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
4f60: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
4f70: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
4f80: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
4f90: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
4fa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4fb0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4fc0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
4fd0: 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20  lumn, r1);.     
4fe0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
4ff0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
5000: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
5010: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29  pOrderBy, p, r1)
5020: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5030: 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20         int r2 = 
5040: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
5050: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
5060: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5070: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
5080: 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b  wid, iParm, r2);
5090: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
50a0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
50b0: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
50c0: 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  r1, r2);.       
50d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
50e0: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
50f0: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20  PPEND);.        
5100: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
5110: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
5120: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5130: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5140: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5150: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
5160: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
5170: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5180: 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77  UERY.    /* If w
5190: 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
51a0: 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
51b0: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
51c0: 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20  )" construct,.  
51d0: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
51e0: 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67  should be a sing
51f0: 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  le item on the s
5200: 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69  tack.  Write thi
5210: 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e  s.    ** item in
5220: 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65  to the set table
5230: 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61   with bogus data
5240: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
5250: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
5260: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
5270: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70  mn==1 );.      p
5280: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
5290: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
52a0: 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ity(pEList->a[0]
52b0: 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61  .pExpr, pDest->a
52c0: 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20  ffinity);.      
52d0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
52e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69          /* At fi
52f0: 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77  rst glance you w
5300: 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f  ould think we co
5310: 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74  uld optimize out
5320: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
5330: 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73  ORDER BY in this
5340: 20 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20   case since the 
5350: 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73  order of entries
5360: 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20   in the set.    
5370: 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
5380: 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65  matter.  But the
5390: 72 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49  re might be a LI
53a0: 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77  MIT clause, in w
53b0: 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
53c0: 63 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64  case the order d
53d0: 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20  oes matter */.  
53e0: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
53f0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
5400: 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73  derBy, p, regRes
5410: 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ult);.      }els
5420: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
5430: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
5440: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5450: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5460: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
5470: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
5480: 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20 26 70 2d  sult, 1, r1, &p-
5490: 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  >affinity, 1);. 
54a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
54b0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
54c0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
54d0: 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20  gResult, 1);.   
54e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
54f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
5500: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
5510: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
5520: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5530: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
5540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5550: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
5560: 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
5570: 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
5580: 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
5590: 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
55a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
55b0: 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
55c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
55d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
55e0: 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29  teger, 1, iParm)
55f0: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
5600: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
5610: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
5620: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
5630: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5640: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
5650: 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
5660: 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
5670: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
5680: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
5690: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
56a0: 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
56b0: 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
56c0: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
56d0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
56e0: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
56f0: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
5700: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5710: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
5720: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
5730: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
5740: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
5750: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
5760: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
5770: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5780: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
5790: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
57a0: 52 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31  Result, iParm, 1
57b0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
57c0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
57d0: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
57e0: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
57f0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
5800: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
5810: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
5820: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5830: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
5840: 53 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f  Send the data to
5850: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
5860: 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73  nction or to a s
5870: 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74  ubroutine.  In t
5880: 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f  he.    ** case o
5890: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20  f a subroutine, 
58a0: 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
58b0: 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73  tself is respons
58c0: 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ible for.    ** 
58d0: 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  popping the data
58e0: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
58f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5900: 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 0a   SRT_Coroutine:.
5910: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
5920: 70 75 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  put: {.      if(
5930: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
5940: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
5950: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5960: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
5970: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5980: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
5990: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
59a0: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
59b0: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
59c0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
59d0: 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20  derBy, p, r1);. 
59e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
59f0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
5a00: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
5a10: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d  }else if( eDest=
5a20: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
5a30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5a40: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5a50: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
5a60: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  iParm);.      }e
5a70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5a80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5a90: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
5aa0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
5ab0: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
5ac0: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
5ad0: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
5ae0: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  se, regResult, n
5af0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
5b00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5b10: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
5b20: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
5b30: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
5b40: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
5b50: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
5b60: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
5b70: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
5b80: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
5b90: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
5ba0: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
5bb0: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
5bc0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
5bd0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
5be0: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
5bf0: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
5c00: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
5c10: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
5c20: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
5c30: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
5c40: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5c50: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
5c60: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
5c70: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5c80: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
5c90: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
5ca0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
5cb0: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
5cc0: 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
5cd0: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
5ce0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
5cf0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 20 20  pOrderBy==0 );  
5d00: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
5d10: 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  n ORDER BY, the 
5d20: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20  call to.        
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d40: 20 20 20 20 2a 2a 20 70 75 73 68 4f 6e 74 6f 53      ** pushOntoS
5d50: 6f 72 74 65 72 28 29 20 77 6f 75 6c 64 20 68 61  orter() would ha
5d60: 76 65 20 63 6c 65 61 72 65 64 20 70 2d 3e 69 4c  ve cleared p->iL
5d70: 69 6d 69 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  imit */.    sqli
5d80: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5d90: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69   OP_AddImm, p->i
5da0: 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
5db0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5dc0: 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  2(v, OP_IfZero, 
5dd0: 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
5de0: 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  k);.  }.}../*.**
5df0: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
5e00: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
5e10: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
5e20: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
5e30: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
5e40: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
5e50: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
5e60: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
5e70: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
5e80: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
5e90: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
5ea0: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
5eb0: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
5ec0: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
5ed0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
5ee0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
5ef0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
5f00: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
5f10: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
5f20: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
5f30: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
5f40: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
5f50: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
5f60: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
5f70: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
5f80: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
5f90: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
5fa0: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
5fb0: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
5fc0: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
5fd0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
5fe0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5ff0: 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20   is obtain from 
6000: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
6010: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
6020: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
6030: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
6040: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
6050: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
6060: 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20  freed.  Add the 
6070: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
6080: 65 20 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c  e to the P4 fiel
6090: 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75  d of an opcode u
60a0: 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e  sing.** P4_KEYIN
60b0: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68  FO_HANDOFF is th
60c0: 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64  e usual way of d
60d0: 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73  ealing with this
60e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
60f0: 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d  nfo *keyInfoFrom
6100: 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a  ExprList(Parse *
6110: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
6120: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pList){.  sqli
6130: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6140: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70  ->db;.  int nExp
6150: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
6160: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78  nfo;.  struct Ex
6170: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
6180: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  em;.  int i;..  
6190: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
61a0: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
61b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
61c0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
61d0: 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28  pInfo) + nExpr*(
61e0: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
61f0: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  +1) );.  if( pIn
6200: 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  fo ){.    pInfo-
6210: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
6220: 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  8*)&pInfo->aColl
6230: 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e  [nExpr];.    pIn
6240: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78  fo->nField = nEx
6250: 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65  pr;.    pInfo->e
6260: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
6270: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
6280: 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78  =pList->a; i<nEx
6290: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
62a0: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
62b0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70   *pColl;.      p
62c0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
62d0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
62e0: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
62f0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
6300: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
6310: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
6320: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
6330: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69    pInfo->aColl[i
6340: 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
6350: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
6360: 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73  er[i] = pItem->s
6370: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
6380: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e    }.  return pIn
6390: 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  fo;.}.../*.** If
63a0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
63b0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73  was generated us
63c0: 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70  ing a non-null p
63d0: 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74  OrderBy argument
63e0: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
63f0: 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65  sults were place
6400: 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20  d in a sorter.  
6410: 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69  After the loop i
6420: 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  s terminated.** 
6430: 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74  we need to run t
6440: 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75  he sorter and ou
6450: 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73  tput the results
6460: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
6470: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
6480: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e  rates the code n
6490: 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74  eeded to do that
64a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
64b0: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
64c0: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
64d0: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
64e0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
64f0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
6500: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
6510: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64  tatement */.  Vd
6520: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
6530: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
6540: 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20   into this VDBE 
6550: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
6560: 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ,      /* Number
6570: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   of columns of d
6580: 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
6590: 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72  est *pDest /* Wr
65a0: 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72  ite the sorted r
65b0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
65c0: 7b 0a 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71  {.  int brk = sq
65d0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
65e0: 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e  el(v);.  int con
65f0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
6600: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69  akeLabel(v);.  i
6610: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69  nt addr;.  int i
6620: 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64  Tab;.  int pseud
6630: 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72  oTab = 0;.  Expr
6640: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
6650: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20   p->pOrderBy;.. 
6660: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
6670: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74  st->eDest;.  int
6680: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
6690: 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65  iParm;..  int re
66a0: 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52  gRow;.  int regR
66b0: 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20  owid;..  iTab = 
66c0: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
66d0: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
66e0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
66f0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
6700: 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65 75 64  ine ){.    pseud
6710: 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  oTab = pParse->n
6720: 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
6730: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6740: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
6750: 2c 20 30 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  , 0, nColumn);. 
6760: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6770: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp2(v, OP_OpenP
6780: 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62  seudo, pseudoTab
6790: 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  , eDest==SRT_Out
67a0: 70 75 74 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72  put);.  }.  addr
67b0: 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
67c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
67d0: 6f 72 74 2c 20 69 54 61 62 2c 20 62 72 6b 29 3b  ort, iTab, brk);
67e0: 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
67f0: 20 70 2c 20 63 6f 6e 74 29 3b 0a 20 20 72 65 67   p, cont);.  reg
6800: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Row = sqlite3Get
6810: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6820: 0a 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71  .  regRowid = sq
6830: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
6840: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
6850: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6860: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
6870: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
6880: 20 2b 20 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20   + 1, regRow);. 
6890: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
68a0: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  {.    case SRT_T
68b0: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
68c0: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
68d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
68e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
68f0: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65  Rowid, iParm, re
6900: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
6910: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6920: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
6930: 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65  Parm, regRow, re
6940: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
6950: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6960: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
6970: 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61  END);.      brea
6980: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
6990: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
69a0: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53  QUERY.    case S
69b0: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
69c0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
69d0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
69e0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
69f0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
6a00: 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f  regRow, 1, regRo
6a10: 77 69 64 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74  wid, &p->affinit
6a20: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  y, 1);.      sql
6a30: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
6a40: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
6a50: 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a  se, regRow, 1);.
6a60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6a70: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
6a80: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
6a90: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
6aa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6ab0: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
6ac0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
6ad0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
6ae0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
6af0: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
6b00: 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31  regRow, iParm, 1
6b10: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
6b20: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
6b30: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
6b40: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
6b50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6b60: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
6b70: 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 0a 20 20  e SRT_Output:.  
6b80: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
6b90: 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  tine: {.      in
6ba0: 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t i;.      sqlit
6bb0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6bc0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
6bd0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
6be0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6bf0: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
6c00: 70 73 65 75 64 6f 54 61 62 2c 20 72 65 67 52 6f  pseudoTab, regRo
6c10: 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  w, regRowid);.  
6c20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
6c30: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
6c40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
6c50: 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69 4d 65  gRow!=pDest->iMe
6c60: 6d 2b 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73  m+i );.        s
6c70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6c80: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
6c90: 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65  seudoTab, i, pDe
6ca0: 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20 20  st->iMem+i);.   
6cb0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
6cc0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
6cd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6ce0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6cf0: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
6d00: 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c  Dest->iMem, nCol
6d10: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  umn);.        sq
6d20: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
6d30: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
6d40: 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d  rse, pDest->iMem
6d50: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
6d60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6d70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6d80: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
6d90: 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20  pDest->iParm);. 
6da0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6db0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
6dc0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
6dd0: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
6de0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6df0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
6e00: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6e10: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a  Parse, regRow);.
6e20: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
6e30: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
6e40: 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a  regRowid);..  /*
6e50: 20 4c 49 4d 49 54 20 68 61 73 20 62 65 65 6e 20   LIMIT has been 
6e60: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74  implemented by t
6e70: 68 65 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  he pushOntoSorte
6e80: 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a  r() routine..  *
6e90: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
6ea0: 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 2f  Limit==0 );..  /
6eb0: 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  * The bottom of 
6ec0: 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  the loop.  */.  
6ed0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
6ee0: 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29  veLabel(v, cont)
6ef0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
6f00: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
6f10: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20  , iTab, addr);. 
6f20: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
6f30: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29  lveLabel(v, brk)
6f40: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
6f50: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
6f60: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
6f70: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
6f80: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6f90: 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54 61  _Close, pseudoTa
6fa0: 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f  b, 0);.  }..}../
6fb0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
6fc0: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
6fd0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
6fe0: 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79   'declaration ty
6ff0: 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78  pe' of the.** ex
7000: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
7010: 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62  The string may b
7020: 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61  e treated as sta
7030: 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65  tic by the calle
7040: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63  r..**.** The dec
7050: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73  laration type is
7060: 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74   the exact datat
7070: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65  ype definition e
7080: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
7090: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52  e.** original CR
70a0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
70b0: 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72  ment if the expr
70c0: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
70d0: 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61  mn. The.** decla
70e0: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
70f0: 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73  a ROWID field is
7100: 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c   INTEGER. Exactl
7110: 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73  y when an expres
7120: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  sion.** is consi
7130: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63  dered a column c
7140: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e  an be complex in
7150: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
7160: 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65   subqueries. The
7170: 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65  .** result-set e
7180: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c  xpression in all
7190: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
71a0: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
71b0: 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69  nts is .** consi
71c0: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62  dered a column b
71d0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
71e0: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
71f0: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
7200: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
7210: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
7220: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
7230: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
7240: 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  );.**   SELECT a
7250: 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  bc FROM (SELECT 
7260: 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20  col AS abc FROM 
7270: 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  tbl);.** .** The
7280: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
7290: 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73  e for any expres
72a0: 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  sion other than 
72b0: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  a column is NULL
72c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
72d0: 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79  t char *columnTy
72e0: 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  pe(.  NameContex
72f0: 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20  t *pNC, .  Expr 
7300: 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20  *pExpr,.  const 
7310: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44  char **pzOriginD
7320: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
7330: 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20  **pzOriginTab,. 
7340: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
7350: 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63  OriginCol.){.  c
7360: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65  har const *zType
7370: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
7380: 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20  st *zOriginDb = 
7390: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
73a0: 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30 3b  *zOriginTab = 0;
73b0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
73c0: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20  OriginCol = 0;. 
73d0: 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70 45   int j;.  if( pE
73e0: 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70  xpr==0 || pNC->p
73f0: 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  SrcList==0 ) ret
7400: 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63 68  urn 0;..  switch
7410: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
7420: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
7430: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
7440: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
7450: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
7460: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
7470: 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  . Locate the tab
7480: 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  le the column is
7490: 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   being.      ** 
74a0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
74b0: 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53  n NameContext.pS
74c0: 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62  rcList. This tab
74d0: 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20  le may be real. 
74e0: 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
74f0: 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71   table or a subq
7500: 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  uery..      */. 
7510: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
7520: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
7530: 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74   /* Table struct
7540: 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78  ure column is ex
7550: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a  tracted from */.
7560: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
7570: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
7580: 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20    /* Select the 
7590: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
75a0: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
75b0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
75c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a  pr->iColumn;  /*
75d0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
75e0: 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20   in pTab */.    
75f0: 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20    while( pNC && 
7600: 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  !pTab ){.       
7610: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
7620: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
7630: 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  st;.        for(
7640: 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  j=0;j<pTabList->
7650: 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74  nSrc && pTabList
7660: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d  ->a[j].iCursor!=
7670: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b  pExpr->iTable;j+
7680: 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +);.        if( 
7690: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
76a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
76b0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
76c0: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
76d0: 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73      pS = pTabLis
76e0: 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b  t->a[j].pSelect;
76f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7700: 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20            pNC = 
7710: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
7720: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
7730: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
7740: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
7750: 49 58 20 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a  IX ME:.        *
7760: 2a 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72  * This can occur
7770: 73 20 69 66 20 79 6f 75 20 68 61 76 65 20 73 6f  s if you have so
7780: 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 22 53 45  mething like "SE
7790: 4c 45 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73  LECT new.x;" ins
77a0: 69 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ide.        ** a
77b0: 20 74 72 69 67 67 65 72 2e 20 20 49 6e 20 6f 74   trigger.  In ot
77c0: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 79 6f  her words, if yo
77d0: 75 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  u reference the 
77e0: 73 70 65 63 69 61 6c 20 22 6e 65 77 22 0a 20 20  special "new".  
77f0: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69        ** table i
7800: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
7810: 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 57   of a select.  W
7820: 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20  e do not have a 
7830: 67 6f 6f 64 20 77 61 79 0a 20 20 20 20 20 20 20  good way.       
7840: 20 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68 65 20   ** to find the 
7850: 61 63 74 75 61 6c 20 74 61 62 6c 65 20 74 79 70  actual table typ
7860: 65 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20 22 54  e, so call it "T
7870: 45 58 54 22 2e 20 20 54 68 69 73 20 69 73 20 72  EXT".  This is r
7880: 65 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a  eally.        **
7890: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61 20   something of a 
78a0: 62 75 67 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f  bug, but I do no
78b0: 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69  t know how to fi
78c0: 78 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  x it..        **
78d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
78e0: 20 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70   code does not p
78f0: 72 6f 64 75 63 65 20 74 68 65 20 63 6f 72 72 65  roduce the corre
7900: 63 74 20 61 6e 73 77 65 72 20 2d 20 69 74 20 6a  ct answer - it j
7910: 75 73 74 20 70 72 65 76 65 6e 74 73 0a 20 20 20  ust prevents.   
7920: 20 20 20 20 20 2a 2a 20 61 20 73 65 67 66 61 75       ** a segfau
7930: 6c 74 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  lt.  See ticket 
7940: 23 31 32 32 39 2e 0a 20 20 20 20 20 20 20 20 2a  #1229..        *
7950: 2f 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20  /.        zType 
7960: 3d 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20 20  = "TEXT";.      
7970: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
7980: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
7990: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66  pTab );.      if
79a0: 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pS ){.        
79b0: 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69  /* The "table" i
79c0: 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62  s actually a sub
79d0: 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65  -select or a vie
79e0: 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  w in the FROM cl
79f0: 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ause.        ** 
7a00: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
7a10: 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  atement. Return 
7a20: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
7a30: 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a  type and origin.
7a40: 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
7a50: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73  for the result-s
7a60: 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  et column of the
7a70: 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20   sub-select..   
7a80: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
7a90: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  if( iCol>=0 && i
7aa0: 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  Col<pS->pEList->
7ab0: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
7ac0: 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73     /* If iCol is
7ad0: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
7ae0: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
7af0: 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68  sion requests th
7b00: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  e.          ** r
7b10: 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d  owid of the sub-
7b20: 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
7b30: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
7b40: 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20  is legal (see . 
7b50: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74           ** test
7b60: 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29   case misc2.2.2)
7b70: 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61   - it always eva
7b80: 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a  luates to NULL..
7b90: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
7ba0: 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65         NameConte
7bb0: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20  xt sNC;.        
7bc0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
7bd0: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
7be0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
7bf0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
7c00: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
7c10: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
7c20: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  0;.          sNC
7c30: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
7c40: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
7c50: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
7c60: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
7c70: 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69  riginDb, &zOrigi
7c80: 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f  nTab, &zOriginCo
7c90: 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  l); .        }. 
7ca0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
7cb0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
7cc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61          /* A rea
7cd0: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  l table */.     
7ce0: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29     assert( !pS )
7cf0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
7d00: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
7d10: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
7d20: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
7d30: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
7d40: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
7d50: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ol) );.        i
7d60: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
7d70: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
7d80: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
7d90: 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d      zOriginCol =
7da0: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
7db0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7dc0: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
7dd0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
7de0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  e;.          zOr
7df0: 69 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  iginCol = pTab->
7e00: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
7e10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7e20: 20 20 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d      zOriginTab =
7e30: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
7e40: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70        if( pNC->p
7e50: 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20  Parse ){.       
7e60: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
7e70: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
7e80: 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  x(pNC->pParse->d
7e90: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
7ea0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  );.          zOr
7eb0: 69 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50  iginDb = pNC->pP
7ec0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
7ed0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b].zName;.      
7ee0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7ef0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
7f00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7f10: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
7f20: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
7f30: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
7f40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
7f50: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
7f60: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
7f70: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
7f80: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
7f90: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
7fa0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
7fb0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
7fc0: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
7fd0: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
7fe0: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
7ff0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
8000: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
8010: 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  pr->pSelect;.   
8020: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
8030: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
8040: 78 70 72 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  xpr;.      sNC.p
8050: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
8060: 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e  rc;.      sNC.pN
8070: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
8080: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
8090: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
80a0: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
80b0: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
80c0: 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69  riginDb, &zOrigi
80d0: 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f  nTab, &zOriginCo
80e0: 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  l); .      break
80f0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8100: 20 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f 72   }.  .  if( pzOr
8110: 69 67 69 6e 44 62 20 29 7b 0a 20 20 20 20 61 73  iginDb ){.    as
8120: 73 65 72 74 28 20 70 7a 4f 72 69 67 69 6e 54 61  sert( pzOriginTa
8130: 62 20 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c  b && pzOriginCol
8140: 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69   );.    *pzOrigi
8150: 6e 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b  nDb = zOriginDb;
8160: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61  .    *pzOriginTa
8170: 62 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a  b = zOriginTab;.
8180: 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c      *pzOriginCol
8190: 20 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20   = zOriginCol;. 
81a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70   }.  return zTyp
81b0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
81c0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
81d0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
81e0: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
81f0: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
8200: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
8210: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
8220: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
8230: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
8240: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8250: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
8260: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
8270: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
8280: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
8290: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
82a0: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
82b0: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
82c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
82d0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
82e0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
82f0: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
8300: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
8310: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
8320: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
8330: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
8340: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
8350: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f  e = pParse;.  fo
8360: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
8370: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
8380: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
8390: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
83a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
83b0: 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51  zType;.#ifdef SQ
83c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
83d0: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
83e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
83f0: 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  gDb = 0;.    con
8400: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61  st char *zOrigTa
8410: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
8420: 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20   char *zOrigCol 
8430: 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  = 0;.    zType =
8440: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
8450: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
8460: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
8470: 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  Col);..    /* Th
8480: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
8490: 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
84a0: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
84b0: 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20   and other .    
84c0: 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66  ** column specif
84d0: 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63  ic strings, in c
84e0: 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69  ase the schema i
84f0: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
8500: 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75  his.    ** virtu
8510: 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65  al machine is de
8520: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
8530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8540: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8550: 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20  LNAME_DATABASE, 
8560: 7a 4f 72 69 67 44 62 2c 20 50 34 5f 54 52 41 4e  zOrigDb, P4_TRAN
8570: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
8580: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8590: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
85a0: 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c  TABLE, zOrigTab,
85b0: 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a   P4_TRANSIENT);.
85c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
85d0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
85e0: 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20  COLNAME_COLUMN, 
85f0: 7a 4f 72 69 67 43 6f 6c 2c 20 50 34 5f 54 52 41  zOrigCol, P4_TRA
8600: 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20  NSIENT);.#else. 
8610: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
8620: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
8630: 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  , 0, 0);.#endif.
8640: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8650: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8660: 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45  COLNAME_DECLTYPE
8670: 2c 20 7a 54 79 70 65 2c 20 50 34 5f 54 52 41 4e  , zType, P4_TRAN
8680: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64  SIENT);.  }.#end
8690: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
86a0: 54 5f 44 45 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a  T_DECLTYPE */.}.
86b0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
86c0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
86d0: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
86e0: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
86f0: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
8700: 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e  lt set.  This in
8710: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
8720: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
8730: 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75  .** azCol[] valu
8740: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
8750: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
8760: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
8770: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
8780: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
8790: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
87a0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
87b0: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
87c0: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
87d0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
87e0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
87f0: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
8800: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
8810: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
8820: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
8830: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
8840: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8850: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
8860: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
8870: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8880: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
8890: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
88a0: 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74   EXPLAIN, skip t
88b0: 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66  his step */.  if
88c0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
88d0: 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  n ){.    return;
88e0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
88f0: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
8900: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
8910: 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30  NamesSet || v==0
8920: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
8930: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
8940: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
8950: 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c  sSet = 1;.  full
8960: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
8970: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
8980: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
8990: 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62  shortNames = (db
89a0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
89b0: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
89c0: 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  =0;.  sqlite3Vdb
89d0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70  eSetNumCols(v, p
89e0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
89f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
8a00: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
8a10: 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  .    Expr *p;.  
8a20: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
8a30: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
8a40: 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ( p==0 ) continu
8a50: 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  e;.    if( pELis
8a60: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b  t->a[i].zName ){
8a70: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
8a80: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
8a90: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73  ].zName;.      s
8aa0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8ab0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8ac0: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
8ad0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a  strlen(zName));.
8ae0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
8af0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
8b00: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  || p->op==TK_AGG
8b10: 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61 62  _COLUMN) && pTab
8b20: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61  List ){.      Ta
8b30: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
8b40: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
8b50: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
8b60: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
8b70: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c  for(j=0; j<pTabL
8b80: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
8b90: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
8ba0: 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20  sor!=p->iTable; 
8bb0: 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73  j++){}.      ass
8bc0: 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d  ert( j<pTabList-
8bd0: 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70  >nSrc );.      p
8be0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
8bf0: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
8c00: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
8c10: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
8c20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8c30: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
8c40: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
8c50: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
8c60: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
8c70: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
8c80: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
8c90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
8ca0: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
8cb0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
8cc0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73    }.      if( !s
8cd0: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75  hortNames && !fu
8ce0: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
8cf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8d00: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8d10: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68  OLNAME_NAME, (ch
8d20: 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  ar*)p->span.z, p
8d30: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
8d40: 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e   }else if( fullN
8d50: 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e  ames || (!shortN
8d60: 61 6d 65 73 20 26 26 20 70 54 61 62 4c 69 73 74  ames && pTabList
8d70: 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20  ->nSrc>1) ){.   
8d80: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
8d90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
8da0: 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20  ar *zTab;. .    
8db0: 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c      zTab = pTabL
8dc0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73  ist->a[j].zAlias
8dd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 75  ;.        if( fu
8de0: 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d  llNames || zTab=
8df0: 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62  =0 ) zTab = pTab
8e00: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
8e10: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
8e20: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
8e30: 25 73 22 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29  %s", zTab, zCol)
8e40: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8e50: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8e60: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8e70: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59  ME, zName, P4_DY
8e80: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  NAMIC);.      }e
8e90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
8ea0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8eb0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8ec0: 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74 72  _NAME, zCol, str
8ed0: 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20  len(zCol));.    
8ee0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
8ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8f00: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8f10: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28   COLNAME_NAME, (
8f20: 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c  char*)p->span.z,
8f30: 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20   p->span.n);.   
8f40: 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74   }.  }.  generat
8f50: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61  eColumnTypes(pPa
8f60: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
8f70: 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64  EList);.}..#ifnd
8f80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
8f90: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
8fa0: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
8fb0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
8fc0: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
8fd0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
8fe0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
8ff0: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
9000: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
9010: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
9020: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
9030: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
9040: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
9050: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9060: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
9070: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
9080: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9090: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
90a0: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
90b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
90c0: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
90d0: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
90e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
90f0: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64  return z;.}.#end
9100: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9110: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
9120: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  T */../*.** Give
9130: 6e 20 61 20 61 6e 20 65 78 70 72 65 73 73 69 6f  n a an expressio
9140: 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73  n list (which is
9150: 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74   really the list
9160: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a   of expressions.
9170: 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ** that form the
9180: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
9190: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
91a0: 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f  t) compute appro
91b0: 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  priate.** column
91c0: 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62   names for a tab
91d0: 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f  le that would ho
91e0: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
91f0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c  n list..**.** Al
9200: 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77  l column names w
9210: 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a  ill be unique..*
9220: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f  *.** Only the co
9230: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63  lumn names are c
9240: 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e  omputed.  Column
9250: 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a  .zType, Column.z
9260: 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68  Coll,.** and oth
9270: 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c  er fields of Col
9280: 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  umn are zeroed..
9290: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
92a0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
92b0: 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  s.  If a memory 
92c0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
92d0: 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72   occurs,.** stor
92e0: 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c  e NULL in *paCol
92f0: 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c   and 0 in *pnCol
9300: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
9310: 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61  TE_NOMEM..*/.sta
9320: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f  tic int selectCo
9330: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
9340: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
9350: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
9360: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
9370: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
9380: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
9390: 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77  Expr list from w
93a0: 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63  hich to derive c
93b0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
93c0: 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20   int *pnCol,    
93d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
93e0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
93f0: 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a  columns here */.
9400: 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c    Column **paCol
9410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
9420: 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d  te the new colum
9430: 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29  n list here */.)
9440: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
9450: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9460: 69 6e 74 20 69 2c 20 6a 2c 20 63 6e 74 3b 0a 20  int i, j, cnt;. 
9470: 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a   Column *aCol, *
9480: 70 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  pCol;.  int nCol
9490: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 63  ;.  Expr *p;.  c
94a0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e  har *zName;.  in
94b0: 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 2a 70 6e 43  t nName;..  *pnC
94c0: 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20 70 45 4c 69  ol = nCol = pELi
94d0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 43 6f  st->nExpr;.  aCo
94e0: 6c 20 3d 20 2a 70 61 43 6f 6c 20 3d 20 73 71 6c  l = *paCol = sql
94f0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
9500: 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c  (db, sizeof(aCol
9510: 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 69 66  [0])*nCol);.  if
9520: 28 20 61 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  ( aCol==0 ) retu
9530: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
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 6e 43 6f 6c 3b 20 69  =aCol; i<nCol; i
9560: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
9570: 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f   /* Get an appro
9580: 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20  priate name for 
9590: 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  the column.    *
95a0: 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74  /.    p = pEList
95b0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
95c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
95d0: 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ght==0 || p->pRi
95e0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20  ght->token.z==0 
95f0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  || p->pRight->to
9600: 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20  ken.z[0]!=0 );. 
9610: 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20     if( (zName = 
9620: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
9630: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
9640: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
9650: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53   contains an "AS
9660: 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c   <name>" phrase,
9670: 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74   use <name> as t
9680: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  he name */.     
9690: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
96a0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61  DbStrDup(db, zNa
96b0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
96c0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c        Expr *pCol
96d0: 20 3d 20 70 3b 0a 20 20 20 20 20 20 54 61 62 6c   = p;.      Tabl
96e0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 77  e *pTab;.      w
96f0: 68 69 6c 65 28 20 70 43 6f 6c 2d 3e 6f 70 3d 3d  hile( pCol->op==
9700: 54 4b 5f 44 4f 54 20 29 20 70 43 6f 6c 20 3d 20  TK_DOT ) pCol = 
9710: 70 43 6f 6c 2d 3e 70 52 69 67 68 74 3b 0a 20 20  pCol->pRight;.  
9720: 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 6f 70      if( pCol->op
9730: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 28  ==TK_COLUMN && (
9740: 70 54 61 62 20 3d 20 70 43 6f 6c 2d 3e 70 54 61  pTab = pCol->pTa
9750: 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)!=0 ){.       
9760: 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20   /* For columns 
9770: 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  use the column n
9780: 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ame name */.    
9790: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
97a0: 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  Col->iColumn;.  
97b0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
97c0: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
97d0: 69 50 4b 65 79 3b 0a 20 20 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 0a  rintf(db, "%s",.
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9810: 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d   iCol>=0 ? pTab-
9820: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
9830: 65 20 3a 20 22 72 6f 77 69 64 22 29 3b 0a 20 20  e : "rowid");.  
9840: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9850: 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72     /* Use the or
9860: 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74  iginal text of t
9870: 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  he column expres
9880: 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65  sion as its name
9890: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   */.        zNam
98a0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
98b0: 74 66 28 64 62 2c 20 22 25 54 22 2c 20 26 70 43  tf(db, "%T", &pC
98c0: 6f 6c 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20  ol->span);.     
98d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
98e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
98f0: 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
9900: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
9910: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
9920: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
9930: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
9940: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  );..    /* Make 
9950: 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  sure the column 
9960: 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20  name is unique. 
9970: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   If the name is 
9980: 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20  not unique,.    
9990: 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65  ** append a inte
99a0: 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
99b0: 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
99c0: 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
99d0: 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74  /.    nName = st
99e0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  rlen(zName);.   
99f0: 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c   for(j=cnt=0; j<
9a00: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  i; j++){.      i
9a10: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
9a20: 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  p(aCol[j].zName,
9a30: 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20   zName)==0 ){.  
9a40: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77        char *zNew
9a50: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 4e  Name;.        zN
9a60: 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a  ame[nName] = 0;.
9a70: 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65          zNewName
9a80: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
9a90: 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a  f(db, "%s:%d", z
9aa0: 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20  Name, ++cnt);.  
9ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9ac0: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
9ad0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9ae0: 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zNewName;.      
9af0: 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    j = -1;.      
9b00: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
9b10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9b20: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e      }.    pCol->
9b30: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
9b40: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c   }.  if( db->mal
9b50: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
9b60: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28   int j;.    for(
9b70: 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  j=0; j<i; j++){.
9b80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9b90: 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e  ree(db, aCol[j].
9ba0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
9bb0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9bc0: 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a  db, aCol);.    *
9bd0: 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a  paCol = 0;.    *
9be0: 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72  pnCol = 0;.    r
9bf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
9c00: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
9c10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
9c20: 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e  *.** Add type an
9c30: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
9c40: 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c  rmation to a col
9c50: 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f  umn list based o
9c60: 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74  n.** a SELECT st
9c70: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20  atement..** .** 
9c80: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
9c90: 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20  presumably came 
9ca0: 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d  from selectColum
9cb0: 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69  nNamesFromExprLi
9cc0: 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c  st()..** The col
9cd0: 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c  umn list has onl
9ce0: 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70  y names, not typ
9cf0: 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73  es or collations
9d00: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
9d10: 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20  ne goes through 
9d20: 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70  and adds the typ
9d30: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
9d40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
9d50: 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74  utine requires t
9d60: 68 61 74 20 61 6c 6c 20 69 6e 64 65 6e 74 69 66  hat all indentif
9d70: 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  iers in the SELE
9d80: 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  CT.** statement 
9d90: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a  be resolved..*/.
9da0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
9db0: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
9dc0: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50  ndCollation(.  P
9dd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9de0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
9df0: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 69 6e  contexts */.  in
9e00: 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t nCol,         
9e10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9e20: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f   columns */.  Co
9e30: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20 20 20  lumn *aCol,     
9e40: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63      /* List of c
9e50: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53 65 6c 65  olumns */.  Sele
9e60: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
9e70: 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64    /* SELECT used
9e80: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79   to determine ty
9e90: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
9ea0: 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ns */.){.  sqlit
9eb0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9ec0: 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  >db;.  NameConte
9ed0: 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e  xt sNC;.  Column
9ee0: 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65   *pCol;.  CollSe
9ef0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
9f00: 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  i;.  Expr *p;.  
9f10: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
9f20: 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65  item *a;..  asse
9f30: 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
9f40: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
9f50: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
9f60: 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
9f70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43   );.  assert( nC
9f80: 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ol==pSelect->pEL
9f90: 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62  ist->nExpr || db
9fa0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9fb0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
9fc0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
9fd0: 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  n;.  memset(&sNC
9fe0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
9ff0: 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  );.  sNC.pSrcLis
a000: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
a010: 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74  c;.  a = pSelect
a020: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66  ->pEList->a;.  f
a030: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f  or(i=0, pCol=aCo
a040: 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
a050: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  pCol++){.    p =
a060: 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[i].pExpr;.   
a070: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
a080: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
a090: 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73  b, columnType(&s
a0a0: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29  NC, p, 0, 0, 0))
a0b0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
a0c0: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
a0d0: 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20  prAffinity(p);. 
a0e0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
a0f0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
a100: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
a110: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
a120: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73   pCol->zColl = s
a130: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
a140: 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  b, pColl->zName)
a150: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
a160: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
a170: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
a180: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
a190: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
a1a0: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
a1b0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
a1c0: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
a1d0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
a1e0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
a1f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
a200: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
a210: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
a220: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
a230: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
a240: 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73  savedFlags;..  s
a250: 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e  avedFlags = db->
a260: 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  flags;.  db->fla
a270: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75  gs &= ~SQLITE_Fu
a280: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62  llColNames;.  db
a290: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
a2a0: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b  E_ShortColNames;
a2b0: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
a2c0: 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65  Prep(pParse, pSe
a2d0: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
a2e0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
a2f0: 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65  eturn 0;.  while
a300: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
a310: 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53  r ) pSelect = pS
a320: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
a330: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76   db->flags = sav
a340: 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20  edFlags;.  pTab 
a350: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
a360: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
a370: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
a380: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
a390: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a3a0: 70 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  pTab->db = db;. 
a3b0: 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
a3c0: 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
a3d0: 20 30 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75   0;.  selectColu
a3e0: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
a3f0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
a400: 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
a410: 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
a420: 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43  l);.  selectAddC
a430: 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
a440: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  ation(pParse, pT
a450: 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e  ab->nCol, pTab->
a460: 61 43 6f 6c 2c 20 70 53 65 6c 65 63 74 29 3b 0a  aCol, pSelect);.
a470: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
a480: 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
a490: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
a4a0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
a4b0: 61 62 6c 65 28 70 54 61 62 29 3b 0a 20 20 20 20  able(pTab);.    
a4c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a4d0: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
a4e0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45  /*.** Get a VDBE
a4f0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
a500: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20  arser context.  
a510: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
a520: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
a530: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
a540: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
a550: 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65  L and leave a me
a560: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
a570: 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65  .*/.Vdbe *sqlite
a580: 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  3GetVdbe(Parse *
a590: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
a5a0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
a5b0: 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  be;.  if( v==0 )
a5c0: 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65  {.    v = pParse
a5d0: 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65  ->pVdbe = sqlite
a5e0: 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  3VdbeCreate(pPar
a5f0: 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66  se->db);.#ifndef
a600: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
a610: 43 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a  CE.    if( v ){.
a620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a630: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72  eAddOp0(v, OP_Tr
a640: 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ace);.    }.#end
a650: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
a660: 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  v;.}.../*.** Com
a670: 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20  pute the iLimit 
a680: 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c  and iOffset fiel
a690: 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ds of the SELECT
a6a0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
a6b0: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
a6c0: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  set expressions.
a6d0: 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66    pLimit and pOf
a6e0: 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78  fset hold the ex
a6f0: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
a700: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
a710: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
a720: 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
a730: 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
a740: 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
a750: 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65  Or NULL if those
a760: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d   keywords are om
a770: 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e  itted. iLimit an
a780: 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72  d iOffset .** ar
a790: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
a7a0: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
a7b0: 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65  mbers for counte
a7c0: 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
a7d0: 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74  te .** the limit
a7e0: 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
a7f0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d   there is no lim
a800: 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
a810: 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69  , then .** iLimi
a820: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
a830: 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
a840: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
a850: 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
a860: 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s of iLimit and 
a870: 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
a880: 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
a890: 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
a8a0: 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  by pLimit and pO
a8b0: 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61  ffset.  iLimit a
a8c0: 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68  nd.** iOffset sh
a8d0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
a8e0: 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72  reset to appropr
a8f0: 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c  iate default val
a900: 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20  ues.** (usually 
a910: 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d  but not always -
a920: 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  1) prior to call
a930: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
a940: 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69  ..** Only if pLi
a950: 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65  mit!=0 or pOffse
a960: 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  t!=0 do the limi
a970: 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
a980: 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
a990: 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
a9a0: 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
a9b0: 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
a9c0: 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
a9d0: 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
a9e0: 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
a9f0: 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
aa00: 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
aa10: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
aa20: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
aa30: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
aa40: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
aa50: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
aa60: 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a  Break){.  Vdbe *
aa70: 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69  v = 0;.  int iLi
aa80: 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  mit = 0;.  int i
aa90: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64  Offset;.  int ad
aaa0: 64 72 31 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  dr1;.  if( p->iL
aab0: 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a  imit ) return;..
aac0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
aad0: 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
aae0: 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
aaf0: 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
ab00: 20 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f   contraversy abo
ab10: 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
ab20: 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
ab30: 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
ab40: 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
ab50: 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
ab60: 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
ab70: 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
ab80: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
ab90: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
aba0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  ->iLimit = iLimi
abb0: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
abc0: 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  em;.    v = sqli
abd0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
abe0: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
abf0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
ac00: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
ac10: 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74  Parse, p->pLimit
ac20: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73  , iLimit);.    s
ac30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
ac40: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
ac50: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 56  , iLimit);.    V
ac60: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
ac70: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
ac80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ac90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
aca0: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42  Zero, iLimit, iB
acb0: 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  reak);.  }.  if(
acc0: 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20   p->pOffset ){. 
acd0: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
ace0: 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
acf0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66  se->nMem;.    if
ad00: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
ad10: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
ad20: 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  m++;   /* Alloca
ad30: 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67 69  te an extra regi
ad40: 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f  ster for limit+o
ad50: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 7d 0a 20  ffset */.    }. 
ad60: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
ad70: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
ad80: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
ad90: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
ada0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
adb0: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f  , p->pOffset, iO
adc0: 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
add0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
ade0: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
adf0: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 56 64 62  Offset);.    Vdb
ae00: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
ae10: 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  FSET counter"));
ae20: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
ae30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
ae40: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66  , OP_IfPos, iOff
ae50: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
ae60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ae70: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f  P_Integer, 0, iO
ae80: 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
ae90: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
aea0: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 69  v, addr1);.    i
aeb0: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
aec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
aed0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64  eAddOp3(v, OP_Ad
aee0: 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73  d, iLimit, iOffs
aef0: 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a  et, iOffset+1);.
af00: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
af10: 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46  t((v, "LIMIT+OFF
af20: 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64  SET"));.      ad
af30: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
af40: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
af50: 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  Pos, iLimit);.  
af60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
af70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
af80: 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74  ger, -1, iOffset
af90: 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
afa0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
afb0: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a  , addr1);.    }.
afc0: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
afd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
afe0: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
aff0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
b000: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
b010: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
b020: 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
b030: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75  n of.** the resu
b040: 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63  lt set for the c
b050: 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73  ompound-select s
b060: 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52  tatement "p".  R
b070: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a  eturn NULL if.**
b080: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
b090: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
b0a0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
b0b0: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
b0c0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
b0d0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
b0e0: 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  ect is taken fro
b0f0: 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  m the.** left-mo
b100: 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73  st term of the s
b110: 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61  elect that has a
b120: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
b130: 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  nce..*/.static C
b140: 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c  ollSeq *multiSel
b150: 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ectCollSeq(Parse
b160: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
b170: 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
b180: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b    CollSeq *pRet;
b190: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
b1a0: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d   ){.    pRet = m
b1b0: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
b1c0: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  q(pParse, p->pPr
b1d0: 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65  ior, iCol);.  }e
b1e0: 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  lse{.    pRet = 
b1f0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65  0;.  }.  if( pRe
b200: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74  t==0 ){.    pRet
b210: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
b220: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
b230: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
b240: 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  .pExpr);.  }.  r
b250: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
b260: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
b270: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
b280: 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  ECT */../* Forwa
b290: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
b2a0: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
b2b0: 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
b2c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b2d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
b2e0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
b2f0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
b300: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
b310: 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
b320: 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
b330: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
b340: 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
b350: 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
b360: 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a  y results */.);.
b370: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b380: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
b390: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ELECT./*.** This
b3a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
b3b0: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20  ed to process a 
b3c0: 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66  compound query f
b3d0: 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20  orm from.** two 
b3e0: 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
b3f0: 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20 55   queries using U
b400: 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c  NION, UNION ALL,
b410: 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49   EXCEPT, or.** I
b420: 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22  NTERSECT.**.** "
b430: 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  p" points to the
b440: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74   right-most of t
b450: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20  he two queries. 
b460: 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68   the query on th
b470: 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e  e.** left is p->
b480: 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66  pPrior.  The lef
b490: 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c  t query could al
b4a0: 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  so be a compound
b4b0: 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69   query.** in whi
b4c0: 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ch case this rou
b4d0: 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
b4e0: 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  led recursively.
b4f0: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
b500: 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  lts of the total
b510: 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65   query are to be
b520: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20   written into a 
b530: 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  destination.** o
b540: 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74  f type eDest wit
b550: 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72  h parameter iPar
b560: 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  m..**.** Example
b570: 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20   1:  Consider a 
b580: 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75  three-way compou
b590: 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  nd SQL statement
b5a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  ..**.**     SELE
b5b0: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT a FROM t1 UNI
b5c0: 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  ON SELECT b FROM
b5d0: 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t2 UNION SELECT
b5e0: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a   c FROM t3.**.**
b5f0: 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
b600: 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20  is parsed up as 
b610: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
b620: 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d     SELECT c FROM
b630: 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a   t3.**      |.**
b640: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53        `----->  S
b650: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a  ELECT b FROM t2.
b660: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
b670: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
b680: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20        `------>  
b690: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
b6a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77  .**.** The arrow
b6b0: 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  s in the diagram
b6c0: 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74   above represent
b6d0: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69   the Select.pPri
b6e0: 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53  or pointer..** S
b6f0: 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
b700: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  e is called with
b710: 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20   p equal to the 
b720: 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  t3 query, then.*
b730: 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65  * pPrior will be
b740: 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20   the t2 query.  
b750: 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b  p->op will be TK
b760: 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63  _UNION in this c
b770: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63  ase..**.** Notic
b780: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f  e that because o
b790: 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65  f the way SQLite
b7a0: 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64   parses compound
b7b0: 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a   SELECTs, the.**
b7c0: 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65   individual sele
b7d0: 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70  cts always group
b7e0: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
b7f0: 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ght..*/.static i
b800: 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a  nt multiSelect(.
b810: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
b820: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
b830: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
b840: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
b850: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
b860: 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
b870: 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
b880: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
b890: 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
b8a0: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
b8b0: 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
b8c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b8d0: 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63  TE_OK;   /* Succ
b8e0: 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20  ess code from a 
b8f0: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
b900: 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
b910: 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
b920: 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
b930: 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
b940: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
b950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
b960: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
b970: 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
b980: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
b990: 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
b9a0: 76 65 20 64 61 74 61 20 64 65 73 74 69 6e 61 74  ve data destinat
b9b0: 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
b9c0: 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f  *pDelete = 0;  /
b9d0: 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c  * Chain of simpl
b9e0: 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c  e selects to del
b9f0: 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ete */.  sqlite3
ba00: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f   *db;          /
ba10: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
ba20: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d  ction */..  /* M
ba30: 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
ba40: 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72  s no ORDER BY or
ba50: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e   LIMIT clause on
ba60: 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20   prior SELECTs. 
ba70: 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c   Only.  ** the l
ba80: 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29  ast (right-most)
ba90: 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73   SELECT in the s
baa0: 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61  eries may have a
bab0: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  n ORDER BY or LI
bac0: 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  MIT..  */.  asse
bad0: 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69  rt( p && p->pPri
bae0: 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e  or );  /* Callin
baf0: 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61  g function guara
bb00: 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63 68 20  ntees this much 
bb10: 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
bb20: 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d  ->db;.  pPrior =
bb30: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73   p->pPrior;.  as
bb40: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
bb50: 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72  ightmost!=pPrior
bb60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
bb70: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
bb80: 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  ==p->pRightmost 
bb90: 29 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65  );.  dest = *pDe
bba0: 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  st;.  if( pPrior
bbb0: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
bbc0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
bbd0: 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20  g(pParse,"ORDER 
bbe0: 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  BY clause should
bbf0: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
bc00: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
bc10: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
bc20: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
bc30: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
bc40: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
bc50: 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d   }.  if( pPrior-
bc60: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >pLimit ){.    s
bc70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
bc80: 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61  Parse,"LIMIT cla
bc90: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
bca0: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
bcb0: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
bcc0: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
bcd0: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
bce0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
bcf0: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
bd00: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
bd10: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
bd20: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f  sert( v!=0 );  /
bd30: 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61  * The VDBE alrea
bd40: 64 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61  dy created by ca
bd50: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
bd60: 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  /..  /* Create t
bd70: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
bd80: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
bd90: 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
bda0: 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73  .  if( dest.eDes
bdb0: 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
bdc0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
bdd0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
bde0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bdf0: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
be00: 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 50 61 72  meral, dest.iPar
be10: 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  m, p->pEList->nE
be20: 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65  xpr);.    dest.e
be30: 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65  Dest = SRT_Table
be40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
be50: 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54   sure all SELECT
be60: 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
be70: 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  nt have the same
be80: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
be90: 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69  nts.  ** in thei
bea0: 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20  r result sets.. 
beb0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
bec0: 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f  >pEList && pPrio
bed0: 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69  r->pEList );.  i
bee0: 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  f( p->pEList->nE
bef0: 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c  xpr!=pPrior->pEL
bf00: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
bf10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
bf20: 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43  g(pParse, "SELEC
bf30: 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
bf40: 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a  nd right of %s".
bf50: 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
bf60: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
bf70: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
bf80: 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
bf90: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
bfa0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
bfb0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
bfc0: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  end;.  }..  /* C
bfd0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20  ompound SELECTs 
bfe0: 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44  that have an ORD
bff0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
c000: 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74   handled separat
c010: 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ely..  */.  if( 
c020: 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
c030: 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
c040: 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61  electOrderBy(pPa
c050: 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
c060: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
c070: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
c080: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
c090: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
c0a0: 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
c0b0: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
c0c0: 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20  se TK_ALL: {.   
c0d0: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b     int addr = 0;
c0e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
c0f0: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
c100: 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
c110: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
c120: 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  it;.      pPrior
c130: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70  ->pOffset = p->p
c140: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 72 63  Offset;.      rc
c150: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
c160: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
c170: 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
c180: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
c190: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
c1a0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
c1b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
c1c0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
c1d0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
c1e0: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
c1f0: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
c200: 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74  = pPrior->iLimit
c210: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
c220: 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
c230: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
c240: 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
c250: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
c260: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
c270: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
c280: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20  Limit);.        
c290: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
c2a0: 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c  "Jump ahead if L
c2b0: 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
c2c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
c2d0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
c2e0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
c2f0: 73 74 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  st);.      pDele
c300: 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
c310: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
c320: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
c330: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
c340: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c350: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
c360: 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20  .      if( addr 
c370: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c380: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c390: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d  , addr);.      }
c3a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c3b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c3c0: 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65  EXCEPT:.    case
c3d0: 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20   TK_UNION: {.   
c3e0: 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b     int unionTab;
c3f0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
c400: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
c410: 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64  orary table hold
c420: 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  ing result */.  
c430: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20      int op = 0; 
c440: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
c450: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
c460: 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73  ns to apply to s
c470: 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  elf */.      int
c480: 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a   priorOp;     /*
c490: 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   The SRT_ operat
c4a0: 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ion to apply to 
c4b0: 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f  prior selects */
c4c0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
c4d0: 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f  mit, *pOffset; /
c4e0: 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f  * Saved values o
c4f0: 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20  f p->nLimit and 
c500: 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20  p->nOffset */.  
c510: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
c520: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75      SelectDest u
c530: 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20  niondest;..     
c540: 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
c550: 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
c560: 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f  dest.eDest==prio
c570: 72 4f 70 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69  rOp && !p->pLimi
c580: 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74  t && !p->pOffset
c590: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
c5a0: 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
c5b0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
c5c0: 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
c5d0: 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
c5e0: 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
c5f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c600: 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
c610: 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  iParm;.      }el
c620: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
c630: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
c640: 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
c650: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
c660: 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
c670: 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
c680: 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
c690: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
c6a0: 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
c6b0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
c6c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
c6d0: 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
c6e0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
c6f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c700: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
c710: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
c720: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c730: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
c740: 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
c750: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
c760: 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
c770: 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
c780: 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ost->selFlags |=
c790: 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
c7a0: 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
c7b0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
c7c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
c7d0: 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
c7e0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
c7f0: 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
c800: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
c810: 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
c820: 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y );.      sqlit
c830: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
c840: 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69  (&uniondest, pri
c850: 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b  orOp, unionTab);
c860: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c870: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
c880: 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e  , pPrior, &union
c890: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
c8a0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
c8b0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c8c0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
c8d0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
c8e0: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
c8f0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
c900: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
c910: 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b  op==TK_EXCEPT ){
c920: 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
c930: 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20  T_Except;.      
c940: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
c950: 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
c960: 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
c970: 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
c980: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c990: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
c9a0: 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
c9b0: 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
c9c0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
c9d0: 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
c9e0: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
c9f0: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
ca00: 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e        uniondest.
ca10: 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20  eDest = op;.    
ca20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
ca30: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
ca40: 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
ca50: 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74     /* Query flat
ca60: 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65  tening in sqlite
ca70: 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20  3Select() might 
ca80: 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72  refill p->pOrder
ca90: 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20  By..      ** Be 
caa0: 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70  sure to delete p
cab0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72  ->pOrderBy, ther
cac0: 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20  efore, to avoid 
cad0: 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a  a memory leak. *
cae0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
caf0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
cb00: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
cb10: 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
cb20: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
cb30: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
cb40: 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  ior;.      p->pO
cb50: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
cb60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
cb70: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
cb80: 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
cb90: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
cba0: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
cbb0: 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
cbc0: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->iLimit = 0;. 
cbd0: 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
cbe0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
cbf0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
cc00: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
cc10: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20  nd;.      }...  
cc20: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
cc30: 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
cc40: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
cc50: 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
cc60: 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  m.      ** it is
cc70: 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
cc80: 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ly need..      *
cc90: 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  /      .      if
cca0: 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  ( dest.eDest!=pr
ccb0: 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61  iorOp || unionTa
ccc0: 62 21 3d 64 65 73 74 2e 69 50 61 72 6d 20 29 7b  b!=dest.iParm ){
ccd0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
cce0: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
ccf0: 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
cd00: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
cd10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73  .        if( des
cd20: 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  t.eDest==SRT_Out
cd30: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  put ){.         
cd40: 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
cd50: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = p;.          w
cd60: 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
cd70: 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
cd80: 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
cd90: 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
cda0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
cdb0: 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
cdc0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
cdd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65    }.        iBre
cde0: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
cdf0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
ce00: 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
ce10: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
ce20: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63  el(v);.        c
ce30: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
ce40: 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
ce50: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
ce60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ce70: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
ce80: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
ce90: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  k);.        iSta
cea0: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
ceb0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
cec0: 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e          selectIn
ced0: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
cee0: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e  p, p->pEList, un
cef0: 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73  ionTab, p->pELis
cf00: 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf20: 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20    0, -1, &dest, 
cf30: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
cf40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cf50: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
cf60: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
cf70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cf80: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
cf90: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
cfa0: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
cfb0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
cfc0: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
cfd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cfe0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cff0: 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
d000: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
d010: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d020: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
d030: 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69  RSECT: {.      i
d040: 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
d050: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
d060: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
d070: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
d080: 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20  it, *pOffset;.  
d090: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
d0a0: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69      SelectDest i
d0b0: 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20  ntersectdest;.  
d0c0: 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20      int r1;..   
d0d0: 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
d0e0: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
d0f0: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
d100: 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
d110: 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70       ** two temp
d120: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48  orary tables.  H
d130: 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20  ence it has its 
d140: 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e  own case.  Begin
d150: 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c  .      ** by all
d160: 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c  ocating the tabl
d170: 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e  es we will need.
d180: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
d190: 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
d1a0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
d1b0: 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
d1c0: 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
d1d0: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
d1e0: 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20   );..      addr 
d1f0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d200: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
d210: 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30  hemeral, tab1, 0
d220: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
d230: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
d240: 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
d250: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
d260: 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
d270: 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
d280: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  t->selFlags |= S
d290: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
d2a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d2b0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
d2c0: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
d2d0: 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
d2e0: 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
d2f0: 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
d300: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
d310: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
d320: 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64  Init(&intersectd
d330: 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  est, SRT_Union, 
d340: 74 61 62 31 29 3b 0a 20 20 20 20 20 20 72 63 20  tab1);.      rc 
d350: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
d360: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
d370: 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
d380: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
d390: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
d3a0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d3b0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
d3c0: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
d3d0: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
d3e0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
d3f0: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
d400: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
d410: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d420: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
d430: 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
d440: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
d450: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
d460: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
d470: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
d480: 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
d490: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
d4a0: 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
d4b0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
d4c0: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
d4d0: 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
d4e0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
d4f0: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
d500: 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
d510: 74 2e 69 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a  t.iParm = tab2;.
d520: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d530: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
d540: 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65   p, &intersectde
d550: 73 74 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  st);.      pDele
d560: 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
d570: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
d580: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
d590: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
d5a0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
d5b0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
d5c0: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
d5d0: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
d5e0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
d5f0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
d600: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d610: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
d620: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
d630: 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74  e code to take t
d640: 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  he intersection 
d650: 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f  of the two tempo
d660: 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61  rary.      ** ta
d670: 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bles..      */. 
d680: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
d690: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
d6a0: 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
d6b0: 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
d6c0: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
d6d0: 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
d6e0: 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
d6f0: 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
d700: 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
d710: 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  r;.        gener
d720: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
d730: 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
d740: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
d750: 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20   }.      iBreak 
d760: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
d770: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
d780: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
d790: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
d7a0: 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c  ;.      computeL
d7b0: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
d7c0: 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
d7d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d7e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d7f0: 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
d800: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 72 31 20  reak);.      r1 
d810: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
d820: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
d830: 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
d840: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d850: 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31   OP_RowKey, tab1
d860: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
d870: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d880: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
d890: 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 29 3b  ab2, iCont, r1);
d8a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
d8b0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
d8c0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
d8d0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
d8e0: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
d8f0: 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70  List, tab1, p->p
d900: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d920: 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74      0, -1, &dest
d930: 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
d940: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d950: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
d960: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
d970: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d980: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74  p2(v, OP_Next, t
d990: 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  ab1, iStart);.  
d9a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
d9b0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
d9c0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
d9d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d9e0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
d9f0: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
da00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
da10: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31  , OP_Close, tab1
da20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
da30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
da40: 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
da50: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
da60: 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
da70: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
da80: 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
da90: 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
daa0: 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
dab0: 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
dac0: 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
dad0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
dae0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
daf0: 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
db00: 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
db10: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
db20: 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
db30: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
db40: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
db50: 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
db60: 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
db70: 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
db80: 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
db90: 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
dba0: 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
dbb0: 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
dbc0: 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
dbd0: 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
dbe0: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
dbf0: 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
dc00: 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
dc10: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
dc20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
dc30: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
dc40: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
dc50: 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
dc60: 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
dc70: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
dc80: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
dc90: 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dcb0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
dcc0: 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
dcd0: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
dce0: 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
dd00: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
dd10: 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
dd20: 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
dd30: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
dd40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
dd50: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
dd60: 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
dd70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
dd80: 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b  pRightmost==p );
dd90: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  .    nCol = p->p
dda0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
ddb0: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
ddc0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
ddd0: 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  (db,.           
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
ddf0: 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43  of(*pKeyInfo)+nC
de00: 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  ol*(sizeof(CollS
de10: 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20 20  eq*) + 1));.    
de20: 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
de30: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
de40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
de50: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
de60: 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  t_end;.    }..  
de70: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20    pKeyInfo->enc 
de80: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70  = ENC(db);.    p
de90: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
dea0: 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72  = nCol;..    for
deb0: 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65  (i=0, apColl=pKe
dec0: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c  yInfo->aColl; i<
ded0: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c  nCol; i++, apCol
dee0: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43  l++){.      *apC
def0: 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
df00: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
df10: 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   p, i);.      if
df20: 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a  ( 0==*apColl ){.
df30: 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
df40: 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
df50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
df60: 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
df70: 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
df80: 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  oop->pPrior){.  
df90: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
dfa0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
dfb0: 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70  int addr = pLoop
dfc0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
dfd0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ];.        if( a
dfe0: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ddr<0 ){.       
dff0: 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20     /* If [0] is 
e000: 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20  unused then [1] 
e010: 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20  is also unused. 
e020: 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20   So we can.     
e030: 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
e040: 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73  afely abort as s
e050: 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74  oon as the first
e060: 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20   unused slot is 
e070: 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
e080: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
e090: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
e0a0: 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ]<0 );.         
e0b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
e0c0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
e0d0: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
e0e0: 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20   addr, nCol);.  
e0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e100: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
e110: 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  r, (char*)pKeyIn
e120: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
e130: 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
e140: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
e150: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
e160: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
e170: 62 46 72 65 65 28 64 62 2c 20 70 4b 65 79 49 6e  bFree(db, pKeyIn
e180: 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  fo);.  }..multi_
e190: 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44  select_end:.  pD
e1a0: 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 64 65 73 74  est->iMem = dest
e1b0: 2e 69 4d 65 6d 3b 0a 20 20 70 44 65 73 74 2d 3e  .iMem;.  pDest->
e1c0: 6e 4d 65 6d 20 3d 20 64 65 73 74 2e 6e 4d 65 6d  nMem = dest.nMem
e1d0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
e1e0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
e1f0: 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ete);.  return r
e200: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
e210: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
e220: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
e230: 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74  *.** Code an out
e240: 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66  put subroutine f
e250: 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69  or a coroutine i
e260: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
e270: 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
e280: 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tment..**.** The
e290: 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70   data to be outp
e2a0: 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ut is contained 
e2b0: 69 6e 20 70 49 6e 2d 3e 69 4d 65 6d 2e 20 20 54  in pIn->iMem.  T
e2c0: 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d  here are.** pIn-
e2d0: 3e 6e 4d 65 6d 20 63 6f 6c 75 6d 6e 73 20 74 6f  >nMem columns to
e2e0: 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65   be output.  pDe
e2f0: 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20  st is where the 
e300: 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a  output should.**
e310: 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   be sent..**.** 
e320: 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65  regReturn is the
e330: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
e340: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
e350: 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a  the subroutine.*
e360: 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  * return address
e370: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72  ..**.** If regPr
e380: 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20  ev>0 then it is 
e390: 61 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  a the first regi
e3a0: 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72  ster in a vector
e3b0: 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73   that.** records
e3c0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75   the previous ou
e3d0: 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72  tput.  mem[regPr
e3e0: 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68  ev] is a flag th
e3f0: 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69  at is false.** i
e400: 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
e410: 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74   no previous out
e420: 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76  put.  If regPrev
e430: 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a  >0 then code is.
e440: 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  ** generated to 
e450: 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  suppress duplica
e460: 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69  tes.  pKeyInfo i
e470: 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61  s used for compa
e480: 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a  ring.** keys..**
e490: 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54  .** If the LIMIT
e4a0: 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69   found in p->iLi
e4b0: 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20  mit is reached, 
e4c0: 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
e4d0: 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a   to.** iBreak..*
e4e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e  /.static int gen
e4f0: 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
e500: 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a  utine(.  Parse *
e510: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
e520: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
e530: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
e540: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
e550: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
e560: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65  tatement */.  Se
e570: 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20  lectDest *pIn,  
e580: 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69        /* Corouti
e590: 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74  ne supplying dat
e5a0: 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
e5b0: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
e5c0: 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20  * Where to send 
e5d0: 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  the data */.  in
e5e0: 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20  t regReturn,    
e5f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
e600: 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
e610: 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
e620: 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  gPrev,          
e630: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65    /* Previous re
e640: 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20  sult register.  
e650: 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66  No uniqueness if
e660: 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20   0 */.  KeyInfo 
e670: 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
e680: 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67  /* For comparing
e690: 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65   with previous e
e6a0: 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 34  ntry */.  int p4
e6b0: 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
e6c0: 20 20 2f 2a 20 54 68 65 20 70 34 20 74 79 70 65    /* The p4 type
e6d0: 20 66 6f 72 20 70 4b 65 79 49 6e 66 6f 20 2a 2f   for pKeyInfo */
e6e0: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
e6f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
e700: 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69  mp here if we hi
e710: 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29  t the LIMIT */.)
e720: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
e730: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
e740: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  nt iContinue;.  
e750: 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64  int addr;..  add
e760: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
e770: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
e780: 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
e790: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
e7a0: 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  l(v);..  /* Supp
e7b0: 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20  ress duplicates 
e7c0: 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  for UNION, EXCEP
e7d0: 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
e7e0: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67   .  */.  if( reg
e7f0: 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  Prev ){.    int 
e800: 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d  j1, j2;.    j1 =
e810: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e820: 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
e830: 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 6a 32  regPrev);.    j2
e840: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e850: 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
e860: 72 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72  re, pIn->iMem, r
e870: 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e  egPrev+1, pIn->n
e880: 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Mem,.           
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8a0: 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
e8b0: 66 6f 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 20  fo, p4type);.   
e8c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e8d0: 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
e8e0: 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  2+2, iContinue, 
e8f0: 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  j2+2);.    sqlit
e900: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
e910: 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , j1);.    sqlit
e920: 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70  e3ExprCodeCopy(p
e930: 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  Parse, pIn->iMem
e940: 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
e950: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c  ->nMem);.    sql
e960: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e970: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
e980: 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20   regPrev);.  }. 
e990: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
e9a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
e9b0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
e9c0: 53 75 70 70 72 65 73 73 20 74 68 65 20 74 68 65  Suppress the the
e9d0: 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e   first OFFSET en
e9e0: 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69  tries if there i
e9f0: 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75  s an OFFSET clau
ea00: 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66  se.  */.  codeOf
ea10: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
ea20: 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68  inue);..  switch
ea30: 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29  ( pDest->eDest )
ea40: 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  {.    /* Store t
ea50: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
ea60: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
ea70: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
ea80: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
ea90: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
eaa0: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
eab0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
eac0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
ead0: 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32  e);.      int r2
eae0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
eaf0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
eb00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
eb10: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
eb20: 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d 65  Record, pIn->iMe
eb30: 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 20 72 31  m, pIn->nMem, r1
eb40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
eb50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
eb60: 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74  _NewRowid, pDest
eb70: 2d 3e 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  ->iParm, r2);.  
eb80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
eb90: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
eba0: 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  rt, pDest->iParm
ebb0: 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
ebc0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ebd0: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
ebe0: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
ebf0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
ec00: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
ec10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
ec20: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
ec30: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
ec40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
ec50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ec60: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
ec70: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
ec80: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
ec90: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
eca0: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
ecb0: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
ecc0: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
ecd0: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
ece0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
ecf0: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
ed00: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
ed10: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
ed20: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
ed30: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
ed40: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
ed50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ed60: 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20  In->nMem==1 );. 
ed70: 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79       p->affinity
ed80: 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c   = .         sql
ed90: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
eda0: 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  ity(p->pEList->a
edb0: 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74  [0].pExpr, pDest
edc0: 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20  ->affinity);.   
edd0: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
ede0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
edf0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ee00: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
ee10: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
ee20: 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72 31 2c 20 26  ->iMem, 1, r1, &
ee30: 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  p->affinity, 1);
ee40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
ee50: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
ee60: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
ee70: 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  n->iMem, 1);.   
ee80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ee90: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
eea0: 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61  sert, pDest->iPa
eeb0: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  rm, r1);.      s
eec0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
eed0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
eee0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
eef0: 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20     }..#if 0  /* 
ef00: 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20  Never occurs on 
ef10: 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65 72  an ORDER BY quer
ef20: 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61  y */.    /* If a
ef30: 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20  ny row exist in 
ef40: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
ef50: 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74  record that fact
ef60: 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20   and abort..    
ef70: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
ef80: 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20  Exists: {.      
ef90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
efa0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
efb0: 20 31 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d   1, pDest->iParm
efc0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
efd0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
efe0: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
eff0: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
f000: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f010: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
f020: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
f030: 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
f040: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
f050: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
f060: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
f070: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
f080: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
f090: 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
f0a0: 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
f0b0: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
f0c0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
f0d0: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
f0e0: 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65  assert( pIn->nMe
f0f0: 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  m==1 );.      sq
f100: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
f110: 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
f120: 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  Mem, pDest->iPar
f130: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
f140: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
f150: 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
f160: 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
f170: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
f180: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
f190: 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
f1a0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
f1b0: 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  /..    /* The re
f1c0: 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
f1d0: 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
f1e0: 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
f1f0: 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
f200: 44 65 73 74 2d 3e 69 4d 65 6d 2e 20 20 54 68 65  Dest->iMem.  The
f210: 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
f220: 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   yields..    */.
f230: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
f240: 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
f250: 69 66 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d  if( pDest->iMem=
f260: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =0 ){.        pD
f270: 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c 69  est->iMem = sqli
f280: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
f290: 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d 65  pParse, pIn->nMe
f2a0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73  m);.        pDes
f2b0: 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e 6e  t->nMem = pIn->n
f2c0: 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Mem;.      }.   
f2d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f2e0: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
f2f0: 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d  In->iMem, pDest-
f300: 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 6e 4d  >iMem, pDest->nM
f310: 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
f320: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f330: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
f340: 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62  >iParm);.      b
f350: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
f360: 20 2f 2a 20 52 65 73 75 6c 74 73 20 61 72 65 20   /* Results are 
f370: 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
f380: 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
f390: 73 2e 20 20 54 68 65 6e 20 74 68 65 0a 20 20 20  s.  Then the.   
f3a0: 20 2a 2a 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77   ** OP_ResultRow
f3b0: 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
f3c0: 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33  to cause sqlite3
f3d0: 5f 73 74 65 70 28 29 20 74 6f 20 72 65 74 75 72  _step() to retur
f3e0: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 78  n.    ** the nex
f3f0: 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e  t row of result.
f400: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
f410: 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a 20   SRT_Output: {. 
f420: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f430: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
f440: 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d 65  ultRow, pIn->iMe
f450: 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20  m, pIn->nMem);. 
f460: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f470: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
f480: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
f490: 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  >iMem, pIn->nMem
f4a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f4b0: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
f4c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f4d0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
f4e0: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
f4f0: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
f500: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
f510: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
f520: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
f530: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
f540: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
f550: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
f560: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
f570: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
f580: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
f590: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
f5a0: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
f5b0: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
f5c0: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
f5d0: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
f5e0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
f5f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f600: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
f610: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
f620: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
f630: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
f640: 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20   reached..  */. 
f650: 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
f660: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
f670: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
f680: 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  dImm, p->iLimit,
f690: 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   -1);.    sqlite
f6a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f6b0: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
f6c0: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
f6d0: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
f6e0: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
f6f0: 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
f700: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
f710: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
f720: 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ue);.  sqlite3Vd
f730: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
f740: 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e  eturn, regReturn
f750: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64  );..  return add
f760: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65  r;.}../*.** Alte
f770: 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64  rnative compound
f780: 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e   select code gen
f790: 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73  erator for cases
f7a0: 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69   when there.** i
f7b0: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
f7c0: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ause..**.** We a
f7d0: 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66  ssume a query of
f7e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
f7f0: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
f800: 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72  <selectA>  <oper
f810: 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e  ator>  <selectB>
f820: 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65    ORDER BY <orde
f830: 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c  rbylist>.**.** <
f840: 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65  operator> is one
f850: 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55   of UNION ALL, U
f860: 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
f870: 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65   INTERSECT.  The
f880: 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63   idea.** is to c
f890: 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74  ode both <select
f8a0: 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e  A> and <selectB>
f8b0: 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
f8c0: 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20  BY clause as.** 
f8d0: 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68  co-routines.  Th
f8e0: 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f  en run the co-ro
f8f0: 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c  utines in parall
f900: 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65  el and merge the
f910: 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
f920: 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e   the output.  In
f930: 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
f940: 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
f950: 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20  (called selectA 
f960: 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20  and.** selectB) 
f970: 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72  there are 7 subr
f980: 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  outines:.**.**  
f990: 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20    outA:    Move 
f9a0: 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
f9b0: 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74  e selectA corout
f9c0: 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
f9d0: 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
f9e0: 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
f9f0: 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  nd query..**.** 
fa00: 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65     outB:    Move
fa10: 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
fa20: 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75  he selectB corou
fa30: 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
fa40: 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
fa50: 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
fa60: 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c  und query.  (Onl
fa70: 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  y generated for 
fa80: 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20  UNION and.**    
fa90: 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
faa0: 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20  LL.  EXCEPT and 
fab0: 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72  INSERTSECT never
fac0: 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68   output a row th
fad0: 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
fae0: 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69    appears only i
faf0: 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41  n B.).**.**    A
fb00: 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ltB:    Called w
fb10: 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
fb20: 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
fb30: 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a  utines and A<B..
fb40: 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20  **.**    AeqB:  
fb50: 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
fb60: 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
fb70: 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
fb80: 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a   and A==B..**.**
fb90: 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c      AgtB:    Cal
fba0: 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
fbb0: 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
fbc0: 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
fbd0: 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  A>B..**.**    Eo
fbe0: 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fA:    Called wh
fbf0: 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
fc00: 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
fc10: 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42  A..**.**    EofB
fc20: 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
fc30: 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
fc40: 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e  ed from selectB.
fc50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
fc60: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
fc70: 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62   latter five sub
fc80: 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20  routines depend 
fc90: 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70  on which .** <op
fca0: 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a  erator> is used:
fcb0: 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  .**.**.**       
fcc0: 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
fcd0: 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20          UNION   
fce0: 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20           EXCEPT 
fcf0: 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45           INTERSE
fd00: 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d  CT.**          -
fd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
fd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
fd30: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
fd40: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
fd50: 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20  --.**   AltB:   
fd60: 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
fd70: 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
fd80: 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
fd90: 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a         nextA.**.
fda0: 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74  **   AeqB:   out
fdb0: 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
fdc0: 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20   nextA          
fdd0: 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
fde0: 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a   outA, nextA.**.
fdf0: 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74  **   AgtB:   out
fe00: 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
fe10: 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
fe20: 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20     nextB        
fe30: 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20      nextB.**.** 
fe40: 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20    EofA:   outB, 
fe50: 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
fe60: 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
fe70: 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  halt            
fe80: 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f   halt.**.**   Eo
fe90: 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  fB:   outA, next
fea0: 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
feb0: 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
fec0: 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c  extA         hal
fed0: 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41  t.**.** In the A
fee0: 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41  ltB, AeqB, and A
fef0: 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c  gtB subroutines,
ff00: 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c   an EOF on A fol
ff10: 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20  lowing nextA.** 
ff20: 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69  causes an immedi
ff30: 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41  ate jump to EofA
ff40: 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42   and an EOF on B
ff50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42   following nextB
ff60: 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d   causes.** an im
ff70: 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
ff80: 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f  EofB.  Within Eo
ff90: 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64  fA and EofB, and
ffa0: 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72   EOF on entry or
ffb0: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  .** following ne
ffc0: 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d  xtX causes a jum
ffd0: 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
ffe0: 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65  the select proce
fff0: 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70  ssing..**.** Dup
10000 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69  licate removal i
10010 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43  n the UNION, EXC
10020 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
10030 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64  CT cases is hand
10040 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  led.** within th
10050 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
10060 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65  ine.  The regPre
10070 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68  v register set h
10080 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  olds the previou
10090 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61  sly.** output va
100a0 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73  lue.  A comparis
100b0 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e  on is made again
100c0 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  st this value an
100d0 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
100e0 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
100f0 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77  e next results w
10100 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65  ould be the same
10110 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
10120 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
10130 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20  ementation plan 
10140 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  is to implement 
10150 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
10160 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20  es and seven.** 
10170 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73  subroutines firs
10180 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20  t, then put the 
10190 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74  control logic at
101a0 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69   the bottom.  Li
101b0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
101c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69          goto Ini
101d0 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f  t.**     coA: co
101e0 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
101f0 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20   query (A).**   
10200 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65    coB: coroutine
10210 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79   for right query
10220 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a   (B).**    outA:
10230 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
10240 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  of A.**    outB:
10250 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
10260 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20  of B (UNION and 
10270 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a  UNION ALL only).
10280 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a  **    EofA: ....
10290 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a  **    EofB: ....
102a0 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a  **    AltB: ....
102b0 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a  **    AeqB: ....
102c0 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a  **    AgtB: ....
102d0 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74  **    Init: init
102e0 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65  ialize coroutine
102f0 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20   registers.**   
10300 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41         yield coA
10310 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
10320 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41  eof(A) goto EofA
10330 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
10340 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20  ld coB.**       
10350 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74     if eof(B) got
10360 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70  o EofB.**    Cmp
10370 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a  r: Compare A, B.
10380 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70  **          Jump
10390 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
103a0 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e  B.**     End: ..
103b0 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20  ..**.** We call 
103c0 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
103d0 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42  , EofA, and EofB
103e0 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62   "subroutines" b
103f0 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  ut they are not.
10400 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c  ** actually call
10410 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61  ed using Gosub a
10420 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52  nd they do not R
10430 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64  eturn.  EofA and
10440 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e   EofB loop.** un
10450 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20  til all data is 
10460 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a  exhausted then j
10470 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22  ump to the "end"
10480 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65   labe.  AltB, Ae
10490 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20  qB,.** and AgtB 
104a0 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c  jump to either L
104b0 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45  2 or to one of E
104c0 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a  ofA or EofB..*/.
104d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
104e0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
104f0 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  ECT.static int m
10500 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
10510 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
10520 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
10530 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
10540 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
10550 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10560 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
10570 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
10580 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
10590 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
105a0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
105b0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
105c0 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
105d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
105e0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
105f0 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
10600 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
10610 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
10620 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
10630 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10650 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
10660 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
10670 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41  SelectDest destA
10680 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
10690 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
106a0 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ne A */.  Select
106b0 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20  Dest destB;     
106c0 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
106d0 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a  or coroutine B *
106e0 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41  /.  int regAddrA
106f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
10700 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
10710 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  r select-A corou
10720 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
10730 67 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 20  gEofA;          
10740 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63  /* Flag to indic
10750 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d  ate when select-
10760 41 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f  A is complete */
10770 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
10780 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
10790 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
107a0 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
107b0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
107c0 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 20 2f  EofB;          /
107d0 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61  * Flag to indica
107e0 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 42  te when select-B
107f0 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a   is complete */.
10800 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
10810 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  A;      /* Addre
10820 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
10830 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
10840 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
10850 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  B;      /* Addre
10860 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
10870 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
10880 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20    int regOutA;  
10890 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
108a0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
108b0 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
108c0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
108d0 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20   regOutB;       
108e0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
108f0 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
10900 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
10910 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
10920 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  OutA;         /*
10930 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
10940 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
10950 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
10960 72 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rOutB;         /
10970 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
10980 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
10990 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
109a0 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20  drEofA;         
109b0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
109c0 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75  e select-A-exhau
109d0 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
109e0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
109f0 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
10a00 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
10a10 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20  ect-B-exhausted 
10a20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
10a30 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20  int addrAltB;   
10a40 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10a50 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72   of the A<B subr
10a60 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10a70 61 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20  addrAeqB;       
10a80 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10a90 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74  the A==B subrout
10aa0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
10ab0 72 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rAgtB;         /
10ac0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
10ad0 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20   A>B subroutine 
10ae0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
10af0 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tA;        /* Li
10b00 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
10b10 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
10b20 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20  nt regLimitB;   
10b30 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
10b40 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
10b50 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
10b60 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f  Prev;          /
10b70 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67  * A range of reg
10b80 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70  isters to hold p
10b90 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a  revious output *
10ba0 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d  /.  int savedLim
10bb0 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76  it;       /* Sav
10bc0 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  ed value of p->i
10bd0 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73  Limit */.  int s
10be0 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20  avedOffset;     
10bf0 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
10c00 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f  of p->iOffset */
10c10 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72  .  int labelCmpr
10c20 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65  ;        /* Labe
10c30 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  l for the start 
10c40 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67  of the merge alg
10c50 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20  orithm */.  int 
10c60 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20  labelEnd;       
10c70 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
10c80 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76  he end of the ov
10c90 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d  erall SELECT stm
10ca0 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20  t */.  int j1;  
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10cc0 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  Jump instruction
10cd0 73 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72  s that get retar
10ce0 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  getted */.  int 
10cf0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
10d00 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41    /* One of TK_A
10d10 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b  LL, TK_UNION, TK
10d20 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45  _EXCEPT, TK_INTE
10d30 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e  RSECT */.  KeyIn
10d40 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b  fo *pKeyDup = 0;
10d50 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
10d60 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64  nformation for d
10d70 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
10d80 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
10d90 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43  KeyMerge;   /* C
10da0 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
10db0 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e  ation for mergin
10dc0 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69  g rows */.  sqli
10dd0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
10de0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
10df0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
10e00 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
10e10 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
10e20 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
10e30 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  int nOrderBy;   
10e40 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10e50 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
10e60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
10e70 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75  */.  int *aPermu
10e80 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  te;        /* Ma
10e90 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52  pping from ORDER
10ea0 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73   BY terms to res
10eb0 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20  ult set columns 
10ec0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
10ed0 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a  >pOrderBy!=0 );.
10ee0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75    assert( pKeyDu
10ef0 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61  p==0 ); /* "Mana
10f00 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20  ged" code needs 
10f10 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33  this.  Ticket #3
10f20 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70  382. */.  db = p
10f30 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
10f40 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
10f50 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
10f60 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10f70 3b 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73  ;.  labelEnd = s
10f80 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
10f90 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43  bel(v);.  labelC
10fa0 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mpr = sqlite3Vdb
10fb0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
10fc0 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74  .  /* Patch up t
10fd0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
10fe0 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  se.  */.  op = p
10ff0 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72  ->op;  .  pPrior
11000 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
11010 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
11020 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
11030 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
11040 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72  OrderBy;.  asser
11050 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  t( pOrderBy );. 
11060 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
11070 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  erBy->nExpr;..  
11080 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73  /* For operators
11090 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
110a0 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f  N ALL we have to
110b0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a   make sure that.
110c0 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
110d0 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20  Y clause covers 
110e0 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
110f0 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41  e result set.  A
11100 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f  dd.  ** terms to
11110 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
11120 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72  ause as necessar
11130 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  y..  */.  if( op
11140 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
11150 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c  for(i=1; db->mal
11160 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20  locFailed==0 && 
11170 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  i<=p->pEList->nE
11180 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
11190 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
111a0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
111b0 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
111c0 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
111d0 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c  j<nOrderBy; j++,
111e0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
111f0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
11200 2d 3e 69 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  ->iCol>0 );.    
11210 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
11220 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a  Col==i ) break;.
11230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11240 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b  ( j==nOrderBy ){
11250 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
11260 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78  New = sqlite3PEx
11270 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
11280 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 30 29 3b  TEGER, 0, 0, 0);
11290 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
112a0 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
112b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
112c0 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
112d0 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
112e0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 54          pNew->iT
112f0 61 62 6c 65 20 3d 20 69 3b 0a 20 20 20 20 20 20  able = i;.      
11300 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c    pOrderBy = sql
11310 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
11320 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
11330 72 42 79 2c 20 70 4e 65 77 2c 20 30 29 3b 0a 20  rBy, pNew, 0);. 
11340 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
11350 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 69  >a[nOrderBy++].i
11360 43 6f 6c 20 3d 20 69 3b 0a 20 20 20 20 20 20 7d  Col = i;.      }
11370 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11380 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
11390 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74  parison permutat
113a0 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20  ion and keyinfo 
113b0 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74  that is used wit
113c0 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75  h.  ** the permu
113d0 74 61 74 69 6f 6e 20 69 6e 20 6f 72 64 65 72 20  tation in order 
113e0 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 74  to comparisons t
113f0 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
11400 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77  he next.  ** row
11410 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65   of results come
11420 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f  s from selectA o
11430 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f  r selectB.  Also
11440 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20   add explicit.  
11450 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f  ** collations to
11460 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
11470 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68  ause terms so th
11480 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71  at when the subq
11490 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74  ueries.  ** to t
114a0 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65  he right and the
114b0 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61   left are evalua
114c0 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68  ted, they use th
114d0 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63  e correct.  ** c
114e0 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ollation..  */. 
114f0 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69   aPermute = sqli
11500 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
11510 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e  b, sizeof(int)*n
11520 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
11530 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20  aPermute ){.    
11540 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
11550 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
11560 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
11570 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e  pOrderBy->a; i<n
11580 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49  OrderBy; i++, pI
11590 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  tem++){.      as
115a0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 43 6f  sert( pItem->iCo
115b0 6c 3e 30 20 20 26 26 20 70 49 74 65 6d 2d 3e 69  l>0  && pItem->i
115c0 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Col<=p->pEList->
115d0 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
115e0 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74  Permute[i] = pIt
115f0 65 6d 2d 3e 69 43 6f 6c 20 2d 20 31 3b 0a 20 20  em->iCol - 1;.  
11600 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67    }.    pKeyMerg
11610 65 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e =.      sqlite
11620 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
11630 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 4d 65 72   sizeof(*pKeyMer
11640 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a 28 73 69  ge)+nOrderBy*(si
11650 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
11660 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  ));.    if( pKey
11670 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20 70  Merge ){.      p
11680 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f  KeyMerge->aSortO
11690 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b 65  rder = (u8*)&pKe
116a0 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 6e 4f  yMerge->aColl[nO
116b0 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 20 20 70  rderBy];.      p
116c0 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69 65 6c 64  KeyMerge->nField
116d0 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20   = nOrderBy;.   
116e0 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 65 6e     pKeyMerge->en
116f0 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
11700 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
11710 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
11720 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
11730 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 45 78  Coll;.        Ex
11740 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64  pr *pTerm = pOrd
11750 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
11760 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
11770 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  erm->flags & EP_
11780 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  ExpCollate ){.  
11790 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
117a0 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  pTerm->pColl;.  
117b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
117c0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d         pColl = m
117d0 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
117e0 71 28 70 50 61 72 73 65 2c 20 70 2c 20 61 50 65  q(pParse, p, aPe
117f0 72 6d 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20  rmute[i]);.     
11800 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67       pTerm->flag
11810 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61  s |= EP_ExpColla
11820 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54  te;.          pT
11830 65 72 6d 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f  erm->pColl = pCo
11840 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ll;.        }.  
11850 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
11860 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c  >aColl[i] = pCol
11870 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d  l;.        pKeyM
11880 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72  erge->aSortOrder
11890 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  [i] = pOrderBy->
118a0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
118b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
118c0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d  }else{.    pKeyM
118d0 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erge = 0;.  }.. 
118e0 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65   /* Reattach the
118f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
11900 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20   to the query.. 
11910 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
11920 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
11930 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
11940 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
11950 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
11960 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20  , pOrderBy);..  
11970 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61  /* Allocate a ra
11980 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  nge of temporary
11990 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
119a0 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65  he KeyInfo neede
119b0 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c  d.  ** for the l
119c0 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65  ogic that remove
119d0 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75  s duplicate resu
119e0 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65  lt rows when the
119f0 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69  .  ** operator i
11a00 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  s UNION, EXCEPT,
11a10 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62   or INTERSECT (b
11a20 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c  ut not UNION ALL
11a30 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  )..  */.  if( op
11a40 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
11a50 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d  regPrev = 0;.  }
11a60 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
11a70 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
11a80 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >nExpr;.    asse
11a90 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45  rt( nOrderBy>=nE
11aa0 78 70 72 20 29 3b 0a 20 20 20 20 72 65 67 50 72  xpr );.    regPr
11ab0 65 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ev = sqlite3GetT
11ac0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
11ad0 20 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 73   nExpr+1);.    s
11ae0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11af0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
11b00 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  0, regPrev);.   
11b10 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74   pKeyDup = sqlit
11b20 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
11b30 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
11b40 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65       sizeof(*pKe
11b50 79 44 75 70 29 20 2b 20 6e 45 78 70 72 2a 28 73  yDup) + nExpr*(s
11b60 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
11b70 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  1) );.    if( pK
11b80 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 70  eyDup ){.      p
11b90 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64  KeyDup->aSortOrd
11ba0 65 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 44  er = (u8*)&pKeyD
11bb0 75 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d  up->aColl[nExpr]
11bc0 3b 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d  ;.      pKeyDup-
11bd0 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70 72 3b  >nField = nExpr;
11be0 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e  .      pKeyDup->
11bf0 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
11c00 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11c10 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
11c20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43       pKeyDup->aC
11c30 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65  oll[i] = multiSe
11c40 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
11c50 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
11c60 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72     pKeyDup->aSor
11c70 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20  tOrder[i] = 0;. 
11c80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11c90 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65  . .  /* Separate
11ca0 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68   the left and th
11cb0 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72  e right query fr
11cc0 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20  om one another. 
11cd0 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   */.  p->pPrior 
11ce0 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  = 0;.  pPrior->p
11cf0 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20  Rightmost = 0;. 
11d00 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
11d10 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
11d20 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  se, p, p->pOrder
11d30 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
11d40 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69  if( pPrior->pPri
11d50 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  or==0 ){.    sql
11d60 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
11d70 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
11d80 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e  pPrior, pPrior->
11d90 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
11da0 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  ");.  }..  /* Co
11db0 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20  mpute the limit 
11dc0 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63  registers */.  c
11dd0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
11de0 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
11df0 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28  labelEnd);.  if(
11e00 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70   p->iLimit && op
11e10 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
11e20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50  regLimitA = ++pP
11e30 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
11e40 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50  regLimitB = ++pP
11e50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
11e60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11e70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d  2(v, OP_Copy, p-
11e80 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f  >iOffset ? p->iO
11e90 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69  ffset+1 : p->iLi
11ea0 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ec0 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41         regLimitA
11ed0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11ee0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
11ef0 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20  opy, regLimitA, 
11f00 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65  regLimitB);.  }e
11f10 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  lse{.    regLimi
11f20 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d  tA = regLimitB =
11f30 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
11f40 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
11f50 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d  p->pLimit);.  p-
11f60 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73  >pLimit = 0;.  s
11f70 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
11f80 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29  (db, p->pOffset)
11f90 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d  ;.  p->pOffset =
11fa0 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20   0;..  regAddrA 
11fb0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
11fc0 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d 20 2b 2b  ;.  regEofA = ++
11fd0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
11fe0 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61  regAddrB = ++pPa
11ff0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
12000 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  EofB = ++pParse-
12010 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41  >nMem;.  regOutA
12020 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
12030 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b  m;.  regOutB = +
12040 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
12050 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
12060 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53  stInit(&destA, S
12070 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
12080 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
12090 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
120a0 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72  (&destB, SRT_Cor
120b0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
120c0 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 70 61  );..  /* Jump pa
120d0 73 74 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  st the various s
120e0 75 62 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 63  ubroutines and c
120f0 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20 74 68 65  oroutines to the
12100 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65 72 67 65   main.  ** merge
12110 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31 20   loop.  */.  j1 
12120 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12130 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
12140 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d  .  addrSelectA =
12150 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
12160 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 0a 20 20  entAddr(v);...  
12170 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f  /* Generate a co
12180 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75  routine to evalu
12190 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
121a0 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a  tatement to the.
121b0 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65    ** left of the
121c0 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74   compound operat
121d0 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c  or - the "A" sel
121e0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
121f0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
12200 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65  "Begin coroutine
12210 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54   for left SELECT
12220 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69  "));.  pPrior->i
12230 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
12240 41 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  A;.  sqlite3Sele
12250 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
12260 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71  r, &destA);.  sq
12270 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12280 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
12290 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71  , regEofA);.  sq
122a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
122b0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
122c0 41 64 64 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f  AddrA);.  VdbeNo
122d0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  opComment((v, "E
122e0 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  nd coroutine for
122f0 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b   left SELECT"));
12300 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
12310 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
12320 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
12330 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20  CT statement on 
12340 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20  .  ** the right 
12350 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74  - the "B" select
12360 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65  .  */.  addrSele
12370 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctB = sqlite3Vdb
12380 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
12390 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
123a0 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f  nt((v, "Begin co
123b0 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68  routine for righ
123c0 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73  t SELECT"));.  s
123d0 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  avedLimit = p->i
123e0 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66  Limit;.  savedOf
123f0 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
12400 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  t;.  p->iLimit =
12410 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d   regLimitB;.  p-
12420 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a  >iOffset = 0;  .
12430 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
12440 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
12450 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  B);.  p->iLimit 
12460 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20  = savedLimit;.  
12470 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76  p->iOffset = sav
12480 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69  edOffset;.  sqli
12490 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
124a0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
124b0 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69  regEofB);.  sqli
124c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
124d0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
124e0 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  drB);.  VdbeNoop
124f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
12500 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
12510 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
12520 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
12530 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
12540 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
12550 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
12560 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  A.  ** select as
12570 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
12580 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
12590 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
125a0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
125b0 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
125c0 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29  routine for A"))
125d0 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67  ;.  addrOutA = g
125e0 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
125f0 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12610 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73   p, &destA, pDes
12620 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20  t, regOutA,.    
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
12640 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50  Prev, pKeyDup, P
12650 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
12660 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  F, labelEnd);.  
12670 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
12680 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
12690 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
126a0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
126b0 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  B.  ** select as
126c0 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
126d0 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
126e0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
126f0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
12700 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
12710 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f  ON ){.    VdbeNo
12720 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
12730 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
12740 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72  r B"));.    addr
12750 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutB = generateO
12760 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
12770 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
12780 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
12790 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tB, pDest, regOu
127a0 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tB,.            
127b0 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
127c0 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46  eyDup, P4_KEYINF
127d0 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62 65 6c 45  O_STATIC, labelE
127e0 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  nd);.  }..  /* G
127f0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
12800 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
12810 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
12820 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20  m select A.  ** 
12830 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
12840 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
12850 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e  elect B remains.
12860 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
12870 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
12880 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -A subroutine"))
12890 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  ;.  if( op==TK_E
128a0 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
128b0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
128c0 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
128d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
128e0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
128f0 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  elEnd);.  }else{
12900 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20    .    addrEofA 
12910 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12920 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
12930 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29  gEofB, labelEnd)
12940 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12950 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
12960 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
12970 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71 6c  drOutB);.    sql
12980 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12990 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
129a0 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrB);.    sqlit
129b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
129c0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
129d0 45 6f 66 41 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  EofA);.  }..  /*
129e0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
129f0 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
12a00 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
12a10 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a  rom select B.  *
12a20 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
12a30 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
12a40 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e   select A remain
12a50 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
12a60 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
12a70 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  {.    addrEofB =
12a80 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 7d 65 6c   addrEofA;.  }el
12a90 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f  se{  .    VdbeNo
12aa0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
12ab0 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  of-B subroutine"
12ac0 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42  ));.    addrEofB
12ad0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12ae0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
12af0 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e 64  egEofA, labelEnd
12b00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12b10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
12b20 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
12b30 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71  ddrOutA);.    sq
12b40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
12b50 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
12b60 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69  AddrA);.    sqli
12b70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12b80 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
12b90 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rEofB);.  }..  /
12ba0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12bb0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
12bc0 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20  se of A<B.  */. 
12bd0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
12be0 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62  ((v, "A-lt-B sub
12bf0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
12c00 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33  drAltB = sqlite3
12c10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12c20 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
12c30 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71   addrOutA);.  sq
12c40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
12c50 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
12c60 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
12c70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12c80 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61  P_If, regEofA, a
12c90 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  ddrEofA);.  sqli
12ca0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12cb0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
12cc0 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47  elCmpr);..  /* G
12cd0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12ce0 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
12cf0 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69  of A==B.  */.  i
12d00 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
12d10 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
12d20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73  addrAltB;.  }els
12d30 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54  e if( op==TK_INT
12d40 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
12d50 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
12d60 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b  B;.    addrAltB+
12d70 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
12d80 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
12d90 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72  (v, "A-eq-B subr
12da0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
12db0 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71  ddrAeqB =.    sq
12dc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
12dd0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
12de0 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69  AddrA);.    sqli
12df0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12e00 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c   OP_If, regEofA,
12e10 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20   addrEofA);.    
12e20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12e30 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
12e40 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d   labelCmpr);.  }
12e50 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
12e60 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
12e70 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20  he case of A>B. 
12e80 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
12e90 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d  mment((v, "A-gt-
12ea0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
12eb0 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71  .  addrAgtB = sq
12ec0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
12ed0 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f  Addr(v);.  if( o
12ee0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
12ef0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
12f00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12f10 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
12f20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
12f30 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  B);.  }.  sqlite
12f40 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12f50 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
12f60 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
12f70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
12f80 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45  , regEofB, addrE
12f90 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
12fa0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12fb0 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
12fc0 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  pr);..  /* This 
12fd0 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74  code runs once t
12fe0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65  o initialize eve
12ff0 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  rything..  */.  
13000 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
13010 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71  ere(v, j1);.  sq
13020 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13030 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
13040 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71  , regEofA);.  sq
13050 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13060 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
13070 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71  , regEofB);.  sq
13080 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13090 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
130a0 41 64 64 72 41 2c 20 61 64 64 72 53 65 6c 65 63  AddrA, addrSelec
130b0 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
130c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
130d0 6f 73 75 62 2c 20 72 65 67 41 64 64 72 42 2c 20  osub, regAddrB, 
130e0 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20  addrSelectB);.  
130f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13100 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
13110 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  ofA, addrEofA);.
13120 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13130 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
13140 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29  gEofB, addrEofB)
13150 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e  ;..  /* Implemen
13160 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65  t the main merge
13170 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
13180 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
13190 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70  abel(v, labelCmp
131a0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
131b0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65  eAddOp4(v, OP_Pe
131c0 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c  rmutation, 0, 0,
131d0 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d   0, (char*)aPerm
131e0 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59  ute, P4_INTARRAY
131f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13200 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
13210 70 61 72 65 2c 20 64 65 73 74 41 2e 69 4d 65 6d  pare, destA.iMem
13220 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c 20 6e 4f  , destB.iMem, nO
13230 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
13240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13250 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67   (char*)pKeyMerg
13260 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  e, P4_KEYINFO_HA
13270 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65  NDOFF);.  sqlite
13280 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
13290 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42  P_Jump, addrAltB
132a0 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72  , addrAeqB, addr
132b0 41 67 74 42 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c  AgtB);..  /* Rel
132c0 65 61 73 65 20 74 65 6d 70 6f 72 61 72 79 20 72  ease temporary r
132d0 65 67 69 73 74 65 72 73 0a 20 20 2a 2f 0a 20 20  egisters.  */.  
132e0 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20  if( regPrev ){. 
132f0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
13300 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
13310 65 2c 20 72 65 67 50 72 65 76 2c 20 6e 4f 72 64  e, regPrev, nOrd
13320 65 72 42 79 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20  erBy+1);.  }..  
13330 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74  /* Jump to the t
13340 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64  his point in ord
13350 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  er to terminate 
13360 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
13370 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
13380 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
13390 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65  elEnd);..  /* Se
133a0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
133b0 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20  output columns. 
133c0 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
133d0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
133e0 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ut ){.    Select
133f0 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f   *pFirst = pPrio
13400 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46  r;.    while( pF
13410 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
13420 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
13430 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65  pPrior;.    gene
13440 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
13450 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
13460 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t->pEList);.  }.
13470 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79  .  /* Reassembly
13480 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
13490 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77  ery so that it w
134a0 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72  ill be freed cor
134b0 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74  rectly.  ** by t
134c0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
134d0 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ion */.  if( p->
134e0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71  pPrior ){.    sq
134f0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
13500 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29  e(db, p->pPrior)
13510 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f  ;.  }.  p->pPrio
13520 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20 20 2f  r = pPrior;..  /
13530 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74  *** TBD:  Insert
13540 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c   subroutine call
13550 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f  s to close curso
13560 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65  rs on incomplete
13570 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69  .  **** subqueri
13580 65 73 20 2a 2a 2a 2a 2f 0a 20 20 72 65 74 75 72  es ****/.  retur
13590 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
135a0 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
135b0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
135c0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
135d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
135e0 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61  T_VIEW)./* Forwa
135f0 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd Declarations 
13600 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
13610 75 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c  ubstExprList(sql
13620 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a  ite3*, ExprList*
13630 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a  , int, ExprList*
13640 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  );.static void s
13650 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74  ubstSelect(sqlit
13660 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69  e3*, Select *, i
13670 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b  nt, ExprList *);
13680 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  ../*.** Scan thr
13690 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
136a0 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
136b0 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
136c0 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
136d0 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
136e0 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
136f0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
13700 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79  lumn-th.** entry
13710 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
13720 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
13730 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
13740 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
13750 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  nged.).**.** Thi
13760 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
13770 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e  t of the flatten
13780 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ing procedure.  
13790 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68  A subquery.** wh
137a0 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  ose result set i
137b0 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c  s defined by pEL
137c0 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65  ist appears as e
137d0 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ntry in the.** F
137e0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
137f0 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74  SELECT such that
13800 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
13810 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61   assigned to tha
13820 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65  t.** FORM clause
13830 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65   entry is iTable
13840 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
13850 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61  make the necessa
13860 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
13870 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
13880 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
13890 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
138a0 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
138b0 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
138c0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
138d0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
138e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
138f0 73 75 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c  substExpr(.  sql
13900 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
13910 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
13920 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73  c errors to this
13930 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
13940 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
13950 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20       /* Expr in 
13960 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69  which substituti
13970 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69  on occurs */.  i
13980 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
13990 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
139a0 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f  e substituted */
139b0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
139c0 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69  ist    /* Substi
139d0 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  tute expressions
139e0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78   */.){.  if( pEx
139f0 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
13a00 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
13a10 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
13a20 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  xpr->iTable==iTa
13a30 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
13a40 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
13a50 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
13a60 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
13a70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
13a80 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
13a90 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
13aa0 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
13ab0 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  lumn<pEList->nEx
13ac0 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pr );.      asse
13ad0 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
13ae0 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
13af0 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72  ight==0 && pExpr
13b00 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  ->pList==0 );.  
13b10 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73      pNew = pELis
13b20 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
13b30 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  umn].pExpr;.    
13b40 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d    assert( pNew!=
13b50 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
13b60 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b  ->op = pNew->op;
13b70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13b80 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29  Expr->pLeft==0 )
13b90 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
13ba0 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
13bb0 70 72 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e  prDup(db, pNew->
13bc0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73  pLeft);.      as
13bd0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
13be0 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
13bf0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
13c00 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
13c10 62 2c 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 29  b, pNew->pRight)
13c20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13c30 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
13c40 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
13c50 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
13c60 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
13c70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  New->pList);.   
13c80 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
13c90 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b   = pNew->iTable;
13ca0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54  .      pExpr->pT
13cb0 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61 62 3b  ab = pNew->pTab;
13cc0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
13cd0 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43  olumn = pNew->iC
13ce0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78  olumn;.      pEx
13cf0 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d  pr->iAgg = pNew-
13d00 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c  >iAgg;.      sql
13d10 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62  ite3TokenCopy(db
13d20 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c  , &pExpr->token,
13d30 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a   &pNew->token);.
13d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
13d50 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45 78 70  enCopy(db, &pExp
13d60 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e  r->span, &pNew->
13d70 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70 45 78  span);.      pEx
13d80 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  pr->pSelect = sq
13d90 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
13da0 62 2c 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74  b, pNew->pSelect
13db0 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
13dc0 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c  flags = pNew->fl
13dd0 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ags;.    }.  }el
13de0 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  se{.    substExp
13df0 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  r(db, pExpr->pLe
13e00 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
13e10 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
13e20 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52  pr(db, pExpr->pR
13e30 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
13e40 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
13e50 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72  Select(db, pExpr
13e60 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  ->pSelect, iTabl
13e70 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
13e80 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
13e90 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20  , pExpr->pList, 
13ea0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
13eb0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
13ec0 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
13ed0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
13ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
13ef0 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
13f00 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c   here */.  ExprL
13f10 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
13f20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20  /* List to scan 
13f30 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20  and in which to 
13f40 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73  make substitutes
13f50 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
13f60 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
13f70 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69  ble to be substi
13f80 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  tuted */.  ExprL
13f90 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
13fa0 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
13fb0 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lues */.){.  int
13fc0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
13fd0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
13fe0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
13ff0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
14000 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
14010 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
14020 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
14030 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
14040 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
14050 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
14060 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
14070 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
14080 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
14090 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
140a0 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
140b0 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
140c0 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
140d0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
140e0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
140f0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70   Table to be rep
14100 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  laced */.  ExprL
14110 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
14120 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
14130 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  lues */.){.  Src
14140 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74  List *pSrc;.  st
14150 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
14160 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
14170 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  i;.  if( !p ) re
14180 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70  turn;.  substExp
14190 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c  rList(db, p->pEL
141a0 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
141b0 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
141c0 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72  rList(db, p->pGr
141d0 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  oupBy, iTable, p
141e0 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
141f0 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
14200 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
14210 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
14220 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61  tExpr(db, p->pHa
14230 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45  ving, iTable, pE
14240 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
14250 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  pr(db, p->pWhere
14260 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
14270 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74  );.  substSelect
14280 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
14290 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
142a0 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
142b0 63 3b 0a 20 20 69 66 28 20 70 53 72 63 20 29 7b  c;.  if( pSrc ){
142c0 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  .    for(i=pSrc-
142d0 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72  >nSrc, pItem=pSr
142e0 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  c->a; i>0; i--, 
142f0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
14300 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
14310 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
14320 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
14330 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
14340 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
14350 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
14360 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
14370 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
14380 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
14390 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
143a0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
143b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
143c0 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
143d0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
143e0 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
143f0 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72  subqueries in or
14400 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20  der to speed.** 
14410 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72  execution.  It r
14420 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
14430 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
14440 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
14450 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  ing.** occurs..*
14460 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
14470 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
14480 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
14490 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
144a0 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
144b0 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
144c0 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
144d0 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
144e0 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
144f0 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
14500 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
14510 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
14520 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
14530 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
14540 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
14550 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
14560 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
14570 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
14580 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
14590 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
145a0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
145b0 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
145c0 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
145d0 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
145e0 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
145f0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
14600 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
14610 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
14620 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
14630 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
14640 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
14650 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
14660 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
14670 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
14680 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
14690 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
146a0 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
146b0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
146c0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
146d0 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
146e0 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
146f0 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
14700 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
14710 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f  his simpificatio
14720 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
14730 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
14740 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
14750 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
14760 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
14770 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
14780 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
14790 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
147a0 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
147b0 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
147c0 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
147d0 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
147e0 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
147f0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14800 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
14810 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
14820 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
14830 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
14840 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
14850 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
14860 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
14870 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
14880 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
14890 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
148a0 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
148b0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
148c0 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
148d0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
148e0 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20  t outer join.** 
148f0 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c         (Original
14900 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20  ly ticket #306. 
14910 20 53 74 72 65 6e 67 68 74 65 6e 65 64 20 62 79   Strenghtened by
14920 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a   ticket #3300).*
14930 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
14940 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
14950 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
14960 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
14970 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
14980 20 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71     (5)  The subq
14990 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
149a0 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
149b0 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
149c0 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
149d0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
149e0 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
149f0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
14a00 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
14a10 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
14a20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
14a30 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
14a40 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
14a50 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
14a60 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
14a70 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (8)  The subquer
14a80 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
14a90 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
14aa0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
14ab0 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
14ac0 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
14ad0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
14ae0 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
14af0 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
14b00 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
14b10 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
14b20 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75   (10)  The subqu
14b30 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
14b40 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
14b50 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
14b60 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
14b70 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a    use LIMIT..**.
14b80 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
14b90 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
14ba0 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
14bb0 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45  t both have ORDE
14bc0 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  R BY clauses..**
14bd0 0a 2a 2a 20 20 28 31 32 29 20 20 4e 6f 74 20 69  .**  (12)  Not i
14be0 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62  mplemented.  Sub
14bf0 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72  sumed into restr
14c00 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73  iction (3).  Was
14c10 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20   previously.**  
14c20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65        a separate
14c30 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72   restriction der
14c40 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65  iving from ticke
14c50 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28  t #350..**.**  (
14c60 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  13)  The subquer
14c70 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72  y and outer quer
14c80 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
14c90 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28  e LIMIT.**.**  (
14ca0 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
14cb0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f  y does not use O
14cc0 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31 35  FFSET.**.**  (15
14cd0 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  )  The outer que
14ce0 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ry is not part o
14cf0 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
14d00 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20  ect or the.**   
14d10 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f       subquery do
14d20 65 73 20 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  es not have both
14d30 20 61 6e 20 4f 52 44 45 52 20 42 59 20 61 6e 64   an ORDER BY and
14d40 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e   a LIMIT clause.
14d50 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
14d60 74 69 63 6b 65 74 20 23 32 33 33 39 29 0a 2a 2a  ticket #2339).**
14d70 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f  .**  (16)  The o
14d80 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
14d90 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
14da0 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 64  r the subquery d
14db0 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f  oes.**        no
14dc0 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  t contain ORDER 
14dd0 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
14de0 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
14df0 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
14e00 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
14e10 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
14e20 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
14e30 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
14e40 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d 71   (17)  The sub-q
14e50 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f  uery is not a co
14e60 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f  mpound select, o
14e70 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20  r it is a UNION 
14e80 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63  ALL .**        c
14e90 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d  ompound clause m
14ea0 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20  ade up entirely 
14eb0 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  of non-aggregate
14ec0 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a   queries, and .*
14ed0 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61 72  *        the par
14ee0 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  ent query:.**.**
14ef0 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
14f00 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f  ot itself part o
14f10 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
14f20 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ect,.**         
14f30 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67   * is not an agg
14f40 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e  regate or DISTIN
14f50 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a  CT query, and.**
14f60 20 20 20 20 20 20 20 20 20 20 2a 20 68 61 73 20            * has 
14f70 6e 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  no other tables 
14f80 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69  or sub-selects i
14f90 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
14fa0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e..**.**        
14fb0 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73  The parent and s
14fc0 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e  ub-query may con
14fd0 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73  tain WHERE claus
14fe0 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a  es. Subject to.*
14ff0 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28  *        rules (
15000 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31  11), (13) and (1
15010 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73  4), they may als
15020 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  o contain ORDER 
15030 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49  BY,.**        LI
15040 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
15050 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
15060 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  18)  If the sub-
15070 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
15080 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
15090 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
150a0 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45  e.**        ORDE
150b0 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74  R by clause of t
150c0 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  he parent must b
150d0 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e  e simple referen
150e0 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  ces to .**      
150f0 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65    columns of the
15100 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a   sub-query..**.*
15110 2a 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62  *  (19)  The sub
15120 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
15130 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
15140 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
15150 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68   not.**        h
15160 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ave a WHERE clau
15170 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  se..**.** In thi
15180 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
15190 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
151a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
151b0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
151c0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
151d0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
151e0 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
151f0 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
15200 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
15210 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
15220 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
15230 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
15240 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
15250 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
15260 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
15270 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
15280 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
15290 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
152a0 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
152b0 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
152c0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
152d0 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
152e0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
152f0 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
15300 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
15310 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
15320 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
15330 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
15340 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
15350 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
15360 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
15370 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15380 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
15390 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
153a0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
153b0 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
153c0 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
153d0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
153e0 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
153f0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
15400 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
15410 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
15420 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c   */.  int isAgg,
15430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
15440 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
15450 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
15460 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
15470 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41   int subqueryIsA
15480 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  gg    /* True if
15490 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
154a0 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
154b0 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63  ctions */.){.  c
154c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
154d0 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
154e0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
154f0 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ext;.  Select *p
15500 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74  Parent;.  Select
15510 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
15520 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
15530 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
15540 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
15550 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  1;      /* Point
15560 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d  er to the rightm
15570 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75  ost select in su
15580 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  b-query */.  Src
15590 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
155a0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
155b0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
155c0 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
155d0 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
155e0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
155f0 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
15600 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ry */.  ExprList
15610 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54   *pList;    /* T
15620 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
15630 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
15640 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
15650 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
15660 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
15670 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
15680 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
15690 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
156a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
156b0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
156c0 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156e0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
156f0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
15700 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
15710 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
15720 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
15730 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
15740 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
15750 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
15760 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
15770 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
15780 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
15790 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
157a0 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
157b0 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
157c0 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
157d0 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
157e0 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
157f0 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  bitem = &pSrc->a
15800 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65  [iFrom];.  iPare
15810 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
15820 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d  Cursor;.  pSub =
15830 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
15840 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
15850 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  ub!=0 );.  if( i
15860 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79  sAgg && subquery
15870 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
15880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15890 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
158a0 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73   (1)  */.  if( s
158b0 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20  ubqueryIsAgg && 
158c0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
158d0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
158e0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
158f0 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53   (2)  */.  pSubS
15900 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
15910 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
15920 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72  rc );.  /* Prior
15930 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e   to version 3.1.
15940 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  2, when LIMIT an
15950 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20  d OFFSET had to 
15960 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61  be simple consta
15970 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72  nts,.  ** not ar
15980 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73  bitrary expresss
15990 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
159a0 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
159b0 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
159c0 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
159d0 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
159e0 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
159f0 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
15a00 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
15a10 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
15a20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
15a30 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
15a40 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
15a50 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
15a60 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
15a70 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
15a80 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
15a90 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
15aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
15ab0 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
15ac0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
15ad0 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
15b00 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
15b10 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74  .  if( p->pRight
15b20 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c  most && pSub->pL
15b30 69 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70 4f  imit && pSub->pO
15b40 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65  rderBy ){.    re
15b50 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b80 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
15b90 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (15) */.  }.  
15ba0 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
15bb0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bd0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
15be0 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20  ction (7)  */.  
15bf0 69 66 28 20 28 28 70 53 75 62 2d 3e 73 65 6c 46  if( ((pSub->selF
15c00 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
15c10 63 74 29 21 3d 30 20 7c 7c 20 70 53 75 62 2d 3e  ct)!=0 || pSub->
15c20 70 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20  pLimit) .       
15c30 20 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63    && (pSrc->nSrc
15c40 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 20  >1 || isAgg) ){ 
15c50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
15c60 72 69 63 74 69 6f 6e 73 20 28 34 29 28 35 29 28  rictions (4)(5)(
15c70 38 29 28 39 29 20 2a 2f 0a 20 20 20 20 20 72 65  8)(9) */.     re
15c80 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 0a 20  turn 0;       . 
15c90 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
15ca0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
15cb0 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75  nct)!=0 && subqu
15cc0 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
15cd0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
15ce0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
15cf0 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20  n (6)  */.  }.  
15d00 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
15d10 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
15d20 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
15d30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15d60 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
15d70 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
15d80 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
15d90 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
15da0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
15db0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
15dc0 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
15dd0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
15de0 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
15df0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
15e00 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
15e10 20 28 31 39 29 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   (19) */..  /* O
15e20 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20  BSOLETE COMMENT 
15e30 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74  1:.  ** Restrict
15e40 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73  ion 3:  If the s
15e50 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69  ubquery is a joi
15e60 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
15e70 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20   subquery is .  
15e80 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74  ** not used as t
15e90 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
15ea0 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69   of an outer joi
15eb0 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  n.  Examples of 
15ec0 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73  why this.  ** is
15ed0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
15ee0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
15ef0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
15f00 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a  IN (t2 JOIN t3).
15f10 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
15f20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
15f30 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
15f40 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
15f50 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
15f60 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74   JOIN t2) JOIN t
15f70 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63  3.  **.  ** whic
15f80 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  h is not at all 
15f90 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a  the same thing..
15fa0 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45    **.  ** OBSOLE
15fb0 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20  TE COMMENT 2:.  
15fc0 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  ** Restriction 1
15fd0 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  2:  If the subqu
15fe0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
15ff0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
16000 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f  ft outer.  ** jo
16010 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
16020 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e  e subquery has n
16030 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  o WHERE clause..
16040 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73    ** An examples
16050 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20   of why this is 
16060 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
16070 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
16080 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
16090 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
160a0 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30   t2 WHERE t2.x>0
160b0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
160c0 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
160d0 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
160e0 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
160f0 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
16100 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52  ER JOIN t2) WHER
16110 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20  E t2.x>0.  **.  
16120 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e  ** But the t2.x>
16130 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61  0 test will alwa
16140 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c  ys fail on a NUL
16150 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69  L row of t2, whi
16160 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76  ch.  ** effectiv
16170 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65  ely converts the
16180 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f   OUTER JOIN into
16190 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a   an INNER JOIN..
161a0 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f    **.  ** THIS O
161b0 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54  VERRIDES OBSOLET
161c0 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44  E COMMENTS 1 AND
161d0 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54   2 ABOVE:.  ** T
161e0 69 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77  icket #3300 show
161f0 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e  s that flattenin
16200 67 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  g the right term
16210 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a   of a LEFT JOIN.
16220 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20    ** is fraught 
16230 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65  with danger.  Be
16240 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20  st to avoid the 
16250 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66  whole thing.  If
16260 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
16270 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
16280 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a  term of a LEFT J
16290 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  OIN, then do not
162a0 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   flatten..  */. 
162b0 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e   if( (pSubitem->
162c0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
162d0 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  TER)!=0 ){.    r
162e0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
162f0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
16300 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  7: If the sub-qu
16310 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
16320 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69  d SELECT, then i
16330 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  t must.  ** use 
16340 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41  only the UNION A
16350 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64  LL operator. And
16360 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d   none of the sim
16370 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69  ple select queri
16380 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b  es.  ** that mak
16390 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e  e up the compoun
163a0 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c  d SELECT are all
163b0 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65  owed to be aggre
163c0 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74  gate or distinct
163d0 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
163e0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
163f0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
16400 28 20 70 2d 3e 70 50 72 69 6f 72 20 7c 7c 20 69  ( p->pPrior || i
16410 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46  sAgg || (p->selF
16420 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
16430 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e  ct)!=0 || pSrc->
16440 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  nSrc!=1 ){.     
16450 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
16460 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70  .    for(pSub1=p
16470 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62  Sub; pSub1; pSub
16480 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29  1=pSub1->pPrior)
16490 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75  {.      if( (pSu
164a0 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
164b0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
164c0 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20  ggregate))!=0.  
164d0 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e       || (pSub1->
164e0 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d  pPrior && pSub1-
164f0 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20  >op!=TK_ALL) .  
16500 20 20 20 20 20 7c 7c 20 21 70 53 75 62 31 2d 3e       || !pSub1->
16510 70 53 72 63 20 7c 7c 20 70 53 75 62 31 2d 3e 70  pSrc || pSub1->p
16520 53 72 63 2d 3e 6e 53 72 63 21 3d 31 0a 20 20 20  Src->nSrc!=1.   
16530 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
16540 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
16550 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
16560 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f  striction 18. */
16570 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  .    if( p->pOrd
16580 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  erBy ){.      in
16590 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  t ii;.      for(
165a0 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64  ii=0; ii<p->pOrd
165b0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  erBy->nExpr; ii+
165c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
165d0 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  p->pOrderBy->a[i
165e0 69 5d 2e 69 43 6f 6c 3d 3d 30 20 29 20 72 65 74  i].iCol==0 ) ret
165f0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
16600 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a     }.  }..  /***
16610 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  ** If we reach t
16620 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74  his point, flatt
16630 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
16640 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a  ed. *****/..  /*
16650 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73   Authorize the s
16660 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61  ubquery */.  pPa
16670 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
16680 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  t = pSubitem->zN
16690 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 41 75  ame;.  sqlite3Au
166a0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
166b0 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
166c0 2c 20 30 2c 20 30 29 3b 0a 20 20 70 50 61 72 73  , 0, 0);.  pPars
166d0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
166e0 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
166f0 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ext;..  /* If th
16700 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
16710 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
16720 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
16730 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e   (by restriction
16740 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38  s.  ** 17 and 18
16750 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20   above) it must 
16760 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61  be a UNION ALL a
16770 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  nd the parent qu
16780 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62  ery must .  ** b
16790 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  e of the form:. 
167a0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
167b0 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20  ECT <expr-list> 
167c0 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79  FROM (<sub-query
167d0 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65  >) <where-clause
167e0 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c  > .  **.  ** fol
167f0 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44  lowed by any ORD
16800 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64  ER BY, LIMIT and
16810 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73  /or OFFSET claus
16820 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20  es. This block. 
16830 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 20 63 6f   ** creates N co
16840 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65  pies of the pare
16850 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74  nt query without
16860 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
16870 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46  IMIT or .  ** OF
16880 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64  FSET clauses and
16890 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74   joins them to t
168a0 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64  he left-hand-sid
168b0 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
168c0 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49  l.  ** using UNI
168d0 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73  ON ALL operators
168e0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e  . In this case N
168f0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
16900 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65  f simple.  ** se
16910 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20  lect statements 
16920 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  in the compound 
16930 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  sub-query..  */.
16940 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d    for(pSub=pSub-
16950 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70  >pPrior; pSub; p
16960 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
16970 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
16980 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  New;.    ExprLis
16990 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
169a0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45  >pOrderBy;.    E
169b0 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d  xpr *pLimit = p-
169c0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70  >pLimit;.    Exp
169d0 72 20 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r *pOffset = p->
169e0 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c  pOffset;.    Sel
169f0 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d  ect *pPrior = p-
16a00 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e  >pPrior;.    p->
16a10 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
16a20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20    p->pSrc = 0;. 
16a30 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
16a40 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
16a50 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 0;.    pNew = 
16a60 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
16a70 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70 4e 65  (db, p);.    pNe
16a80 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  w->pPrior = pPri
16a90 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  or;.    p->pPrio
16aa0 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 2d  r = pNew;.    p-
16ab0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
16ac0 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  erBy;.    p->op 
16ad0 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d  = TK_ALL;.    p-
16ae0 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
16af0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
16b00 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 66  imit;.    p->pOf
16b10 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
16b20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
16b30 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  t = 0;.    pNew-
16b40 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b  >pRightmost = 0;
16b50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
16b60 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
16b70 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
16b80 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
16b90 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  e .  ** in the o
16ba0 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
16bb0 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20  .  pSub = pSub1 
16bc0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
16bd0 65 63 74 3b 0a 20 20 66 6f 72 28 70 50 61 72 65  ect;.  for(pPare
16be0 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70  nt=p; pParent; p
16bf0 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e  Parent=pParent->
16c00 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75  pPrior, pSub=pSu
16c10 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
16c20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53  int nSubSrc = pS
16c30 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20  ubSrc->nSrc;.   
16c40 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
16c50 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d  0;.    pSubSrc =
16c60 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 20   pSub->pSrc;.   
16c70 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
16c80 3e 70 53 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 4d  >pSrc;..    /* M
16c90 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46  ove all of the F
16ca0 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ROM elements of 
16cb0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
16cc0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65  o the.    ** the
16cd0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
16ce0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
16cf0 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
16d00 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
16d10 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
16d20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f  number for the o
16d30 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75  riginal outer qu
16d40 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  ery FROM element
16d50 20 69 6e 0a 20 20 20 20 2a 2a 20 69 50 61 72 65   in.    ** iPare
16d60 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
16d70 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
16d80 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
16d90 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 20  sequent code.   
16da0 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78   ** will scan ex
16db0 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e  pressions lookin
16dc0 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65  g for iParent re
16dd0 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70  ferences and rep
16de0 6c 61 63 65 0a 20 20 20 20 2a 2a 20 74 68 6f 73  lace.    ** thos
16df0 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
16e00 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
16e10 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
16e20 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
16e30 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20      ** elements 
16e40 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
16e50 6e 67 20 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ng in..    */.  
16e60 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20    if( pSrc ){.  
16e70 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54      Table *pTabT
16e80 6f 44 65 6c 3b 0a 20 20 20 20 20 20 70 53 75 62  oDel;.      pSub
16e90 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  item = &pSrc->a[
16ea0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 6e 53  iFrom];.      nS
16eb0 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
16ec0 3e 6e 53 72 63 3b 0a 20 20 20 20 20 20 6a 6f 69  >nSrc;.      joi
16ed0 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d  ntype = pSubitem
16ee0 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
16ef0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16f00 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  db, pSubitem->zD
16f10 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20  atabase);.      
16f20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16f30 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  , pSubitem->zNam
16f40 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
16f50 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
16f60 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
16f70 20 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a       pSubitem->z
16f80 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
16f90 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e      pSubitem->zN
16fa0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ame = 0;.      p
16fb0 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
16fc0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  = 0;..      /* I
16fd0 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
16fe0 6e 74 20 69 73 20 61 20 73 75 62 71 75 65 72 79  nt is a subquery
16ff0 2c 20 64 65 66 65 72 20 64 65 6c 65 74 69 6e 67  , defer deleting
17000 20 74 68 65 20 54 61 62 6c 65 0a 20 20 20 20 20   the Table.     
17010 20 2a 2a 20 6f 62 6a 65 63 74 20 61 73 73 6f 63   ** object assoc
17020 69 61 74 65 64 20 77 69 74 68 20 74 68 61 74 20  iated with that 
17030 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63  subquery until c
17040 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69  ode generation i
17050 73 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c  s.      ** compl
17060 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
17070 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
17080 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 69 72   Expr.pTab entir
17090 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  es that.      **
170a0 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75   refer to the su
170b0 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65  bquery even afte
170c0 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54  r flattening.  T
170d0 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 20  icket #3346..   
170e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
170f0 28 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75  (pTabToDel = pSu
17100 62 69 74 65 6d 2d 3e 70 54 61 62 29 21 3d 30 20  bitem->pTab)!=0 
17110 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
17120 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d  TabToDel->nRef==
17130 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  1 ){.          p
17140 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a  TabToDel->pNextZ
17150 6f 6d 62 69 65 20 3d 20 70 50 61 72 73 65 2d 3e  ombie = pParse->
17160 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20  pZombieTab;.    
17170 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 5a        pParse->pZ
17180 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54  ombieTab = pTabT
17190 6f 44 65 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  oDel;.        }e
171a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
171b0 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d  TabToDel->nRef--
171c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
171d0 20 20 7d 0a 20 20 20 20 20 20 70 53 75 62 69 74    }.      pSubit
171e0 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  em->pTab = 0;.  
171f0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 75 62    }.    if( nSub
17200 53 72 63 21 3d 31 20 7c 7c 20 21 70 53 72 63 20  Src!=1 || !pSrc 
17210 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 74  ){.      int ext
17220 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20 31  ra = nSubSrc - 1
17230 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 28 70  ;.      for(i=(p
17240 53 72 63 3f 31 3a 30 29 3b 20 69 3c 6e 53 75 62  Src?1:0); i<nSub
17250 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
17260 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65     pSrc = sqlite
17270 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64  3SrcListAppend(d
17280 62 2c 20 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a  b, pSrc, 0, 0);.
17290 20 20 20 20 20 20 20 20 69 66 28 20 70 53 72 63          if( pSrc
172a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
172b0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
172c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   0;.          re
172d0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
172e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
172f0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
17300 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28  pSrc;.      for(
17310 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
17320 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20  i-extra>=iFrom; 
17330 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i--){.        pS
17340 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d  rc->a[i] = pSrc-
17350 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20  >a[i-extra];.   
17360 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
17370 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
17380 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  c; i++){.      p
17390 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
173a0 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
173b0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
173c0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c  SubSrc->a[i], 0,
173d0 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d   sizeof(pSubSrc-
173e0 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  >a[i]));.    }. 
173f0 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d     pSrc->a[iFrom
17400 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  ].jointype = joi
17410 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
17420 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
17430 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
17440 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
17450 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
17460 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
17470 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
17480 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17490 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
174a0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
174b0 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
174c0 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
174d0 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
174e0 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
174f0 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
17500 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
17520 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
17530 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
17540 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
17550 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
17560 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
17570 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
17580 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
17590 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
175a0 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
175b0 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
175c0 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
175d0 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
175e0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
175f0 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
17600 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
17610 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
17620 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
17630 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
17640 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20     */.    pList 
17650 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  = pParent->pELis
17660 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
17670 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
17680 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
17690 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69   *pExpr;.      i
176a0 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
176b0 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70  Name==0 && (pExp
176c0 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
176d0 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d  pExpr)->span.z!=
176e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  0 ){.        pLi
176f0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
17700 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17710 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
17720 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 45 78  p(db, (char*)pEx
17730 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70  pr->span.z, pExp
17740 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  r->span.n);.    
17750 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75    }.    }.    su
17760 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
17770 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c  pParent->pEList,
17780 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
17790 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
177a0 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20   isAgg ){.      
177b0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
177c0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75  , pParent->pGrou
177d0 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  pBy, iParent, pS
177e0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
177f0 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
17800 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
17810 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
17820 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
17830 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
17840 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
17850 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
17860 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
17870 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
17880 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
17890 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
178a0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
178b0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
178c0 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  f( pParent->pOrd
178d0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 75  erBy ){.      su
178e0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
178f0 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
17900 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
17910 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
17920 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
17930 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70  Where ){.      p
17940 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
17950 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
17960 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65  >pWhere);.    }e
17970 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72  lse{.      pWher
17980 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
17990 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
179a0 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gg ){.      asse
179b0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  rt( pParent->pHa
179c0 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ving==0 );.     
179d0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
179e0 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  g = pParent->pWh
179f0 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
17a00 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  nt->pWhere = pWh
17a10 65 72 65 3b 0a 20 20 20 20 20 20 73 75 62 73 74  ere;.      subst
17a20 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
17a30 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
17a40 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
17a50 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
17a60 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
17a70 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
17a80 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
17a90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ab0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
17ac0 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61  up(db, pSub->pHa
17ad0 76 69 6e 67 29 29 3b 0a 20 20 20 20 20 20 61 73  ving));.      as
17ae0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
17af0 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
17b00 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72      pParent->pGr
17b10 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
17b20 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
17b30 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  Sub->pGroupBy);.
17b40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17b50 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
17b60 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20  Parent->pWhere, 
17b70 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
17b80 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  EList);.      pP
17b90 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
17ba0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
17bb0 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  b, pParent->pWhe
17bc0 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20  re, pWhere);.   
17bd0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65   }.  .    /* The
17be0 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
17bf0 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
17c00 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
17c10 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
17c20 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
17c30 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a  stinct. .    */.
17c40 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c      pParent->sel
17c50 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73  Flags |= pSub->s
17c60 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
17c70 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a  tinct;.  .    /*
17c80 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e  .    ** SELECT .
17c90 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  .. FROM (SELECT 
17ca0 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53  ... LIMIT a OFFS
17cb0 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46  ET b) LIMIT x OF
17cc0 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20  FSET y;.    **. 
17cd0 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d     ** One is tem
17ce0 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61  pted to try to a
17cf0 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f  dd a and b to co
17d00 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73  mbine the limits
17d10 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20  .  But this.    
17d20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ** does not work
17d30 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74   if either limit
17d40 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20   is negative..  
17d50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
17d60 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
17d70 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d     pParent->pLim
17d80 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69  it = pSub->pLimi
17d90 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  t;.      pSub->p
17da0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d  Limit = 0;.    }
17db0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61  .  }..  /* Finia
17dc0 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74  lly, delete what
17dd0 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20   is left of the 
17de0 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74  subquery and ret
17df0 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  urn.  ** success
17e00 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
17e10 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
17e20 20 70 53 75 62 31 29 3b 0a 0a 20 20 72 65 74 75   pSub1);..  retu
17e30 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
17e40 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
17e50 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
17e60 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
17e70 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
17e80 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  /../*.** Analyze
17e90 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
17ea0 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
17eb0 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  an argument to s
17ec0 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61  ee if it.** is a
17ed0 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
17ee0 71 75 65 72 79 2e 20 52 65 74 75 72 6e 20 57 48  query. Return WH
17ef0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
17f00 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
17f10 5f 4d 41 58 20 69 66 20 0a 2a 2a 20 69 74 20 69  _MAX if .** it i
17f20 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73  s, or 0 otherwis
17f30 65 2e 20 41 74 20 70 72 65 73 65 6e 74 2c 20 61  e. At present, a
17f40 20 71 75 65 72 79 20 69 73 20 63 6f 6e 73 69 64   query is consid
17f50 65 72 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20  ered to be.** a 
17f60 6d 69 6e 28 29 2f 6d 61 78 28 29 20 71 75 65 72  min()/max() quer
17f70 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  y if:.**.**   1.
17f80 20 54 68 65 72 65 20 69 73 20 61 20 73 69 6e 67   There is a sing
17f90 6c 65 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  le object in the
17fa0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
17fb0 0a 2a 2a 20 20 20 32 2e 20 54 68 65 72 65 20 69  .**   2. There i
17fc0 73 20 61 20 73 69 6e 67 6c 65 20 65 78 70 72 65  s a single expre
17fd0 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73  ssion in the res
17fe0 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 69 74 20  ult set, and it 
17ff0 69 73 0a 2a 2a 20 20 20 20 20 20 65 69 74 68 65  is.**      eithe
18000 72 20 6d 69 6e 28 78 29 20 6f 72 20 6d 61 78 28  r min(x) or max(
18010 78 29 2c 20 77 68 65 72 65 20 78 20 69 73 20 61  x), where x is a
18020 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63   column referenc
18030 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
18040 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72   minMaxQuery(Par
18050 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
18060 63 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a  ct *p){.  Expr *
18070 70 45 78 70 72 3b 0a 20 20 45 78 70 72 4c 69 73  pExpr;.  ExprLis
18080 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  t *pEList = p->p
18090 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  EList;..  if( pE
180a0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
180b0 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   return WHERE_OR
180c0 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
180d0 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  pExpr = pEList->
180e0 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 70 45  a[0].pExpr;.  pE
180f0 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
18100 69 73 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ist;.  if( pExpr
18110 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
18120 43 54 49 4f 4e 20 7c 7c 20 70 45 4c 69 73 74 3d  CTION || pEList=
18130 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45  =0 || pEList->nE
18140 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
18150 30 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  0;.  if( pEList-
18160 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21  >a[0].pExpr->op!
18170 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
18180 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   return WHERE_OR
18190 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
181a0 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
181b0 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20 57  .n!=3 ) return W
181c0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
181d0 4d 41 4c 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  MAL;.  if( sqlit
181e0 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
181f0 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
18200 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"min",3)==0 ){.
18210 20 20 20 20 72 65 74 75 72 6e 20 57 48 45 52 45      return WHERE
18220 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20  _ORDERBY_MIN;.  
18230 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
18240 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
18250 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
18260 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "max",3)==0 ){. 
18270 20 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f     return WHERE_
18280 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d  ORDERBY_MAX;.  }
18290 0a 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f  .  return WHERE_
182a0 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
182b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
182c0 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65  utine is a Walke
182d0 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22  r callback for "
182e0 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c  expanding" a SEL
182f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
18300 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65  * "Expanding" me
18310 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f  ans to do the fo
18320 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
18330 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
18340 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
18350 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
18360 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
18370 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
18380 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
18390 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
183a0 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
183b0 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
183c0 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
183d0 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
183e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
183f0 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
18400 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
18410 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
18420 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
18430 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
18440 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
18450 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
18460 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18470 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
18480 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
18490 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
184a0 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
184b0 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
184c0 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
184d0 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
184e0 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
184f0 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
18500 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
18510 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
18520 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
18530 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65   up the presiste
18540 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
18550 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
18560 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
18570 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
18580 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
18590 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64  lause to accomod
185a0 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
185b0 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
185c0 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
185d0 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
185e0 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
185f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
18600 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
18610 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
18620 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
18630 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
18640 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
18650 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
18660 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
18670 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
18680 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
18690 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
186a0 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
186b0 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
186c0 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
186d0 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
186e0 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
186f0 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
18700 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
18710 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c  lectExpander(Wal
18720 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
18730 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
18740 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
18750 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
18760 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72  nt i, j, k;.  Sr
18770 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
18780 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
18790 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
187a0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
187b0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
187c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
187d0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
187e0 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72  Failed  ){.    r
187f0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
18800 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 53  .  }.  if( p->pS
18810 72 63 3d 3d 30 20 7c 7c 20 28 70 2d 3e 73 65 6c  rc==0 || (p->sel
18820 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e  Flags & SF_Expan
18830 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ded)!=0 ){.    r
18840 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
18850 0a 20 20 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  .  }.  p->selFla
18860 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65  gs |= SF_Expande
18870 64 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  d;.  pTabList = 
18880 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
18890 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
188a0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63    /* Make sure c
188b0 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
188c0 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
188d0 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   to all entries 
188e0 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  in.  ** the FROM
188f0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53   clause of the S
18900 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
18910 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
18920 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
18930 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ors(pParse, pTab
18940 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  List);..  /* Loo
18950 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
18960 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
18970 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
18980 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
18990 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
189a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
189b0 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
189c0 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
189d0 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
189e0 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
189f0 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
18a00 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
18a10 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
18a20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
18a30 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
18a40 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
18a50 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
18a60 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
18a70 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  ab;.    if( pFro
18a80 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20  m->pTab!=0 ){.  
18a90 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74      /* This stat
18aa0 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64  ement has alread
18ab0 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e  y been prepared.
18ac0 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
18ad0 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67  ed.      ** to g
18ae0 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  o further. */.  
18af0 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30      assert( i==0
18b00 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
18b10 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
18b20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  }.    if( pFrom-
18b30 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
18b40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18b50 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
18b60 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
18b70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
18b80 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
18b90 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
18ba0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
18bb0 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
18bc0 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20  rt( pSel!=0 );. 
18bd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
18be0 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
18bf0 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
18c00 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
18c10 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 70 46 72  pSel);.      pFr
18c20 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
18c30 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
18c40 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
18c50 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  (Table));.      
18c60 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
18c70 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
18c80 20 20 20 20 20 20 70 54 61 62 2d 3e 64 62 20 3d        pTab->db =
18c90 20 64 62 3b 0a 20 20 20 20 20 20 70 54 61 62 2d   db;.      pTab-
18ca0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
18cb0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
18cc0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
18cd0 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65  , "sqlite_subque
18ce0 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29  ry_%p_", (void*)
18cf0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69  pTab);.      whi
18d00 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
18d10 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
18d20 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20  >pPrior; }.     
18d30 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
18d40 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
18d50 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c  e, pSel->pEList,
18d60 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
18d70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
18d80 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
18d90 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  -1;.      pTab->
18da0 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
18db0 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
18dc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18dd0 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
18de0 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
18df0 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
18e00 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
18e10 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
18e20 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
18e30 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
18e40 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71  ab = .        sq
18e50 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
18e60 28 70 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d  (pParse,0,pFrom-
18e70 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44  >zName,pFrom->zD
18e80 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20  atabase);.      
18e90 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
18ea0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
18eb0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
18ec0 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ++;.#if !defined
18ed0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
18ee0 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28  W) || !defined (
18ef0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
18f00 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20  UALTABLE).      
18f10 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
18f20 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70  t || IsVirtual(p
18f30 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
18f40 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65  /* We reach here
18f50 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
18f60 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20  ble is a really 
18f70 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  a view */.      
18f80 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
18f90 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
18fa0 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20  pParse, pTab) ) 
18fb0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
18fc0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;..        /* If
18fd0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21   pFrom->pSelect!
18fe0 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  =0 it means we a
18ff0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
19000 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65  a.        ** vie
19010 77 20 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e  w within a view.
19020 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 72    The SELECT str
19030 75 63 74 75 72 65 20 68 61 73 20 61 6c 72 65 61  ucture has alrea
19040 64 79 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  dy been.        
19050 2a 2a 20 63 6f 70 69 65 64 20 62 79 20 74 68 65  ** copied by the
19060 20 6f 75 74 65 72 20 76 69 65 77 20 73 6f 20 77   outer view so w
19070 65 20 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63  e can skip the c
19080 6f 70 79 20 73 74 65 70 20 68 65 72 65 0a 20 20  opy step here.  
19090 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
190a0 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20  inner view..    
190b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
190c0 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  f( pFrom->pSelec
190d0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
190e0 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
190f0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
19100 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  Dup(db, pTab->pS
19110 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
19120 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
19130 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72  ect(pWalker, pFr
19140 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
19150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19160 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
19170 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
19180 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74  index named by t
19190 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  he INDEXED BY cl
191a0 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ause, if any. */
191b0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
191c0 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  zIndex ){.      
191d0 63 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70  char *zIndex = p
191e0 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20  From->zIndex;.  
191f0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
19200 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
19210 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20  pTab->pIndex; . 
19220 20 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26           pIdx &&
19230 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
19240 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e  pIdx->zName, zIn
19250 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20 20  dex); .         
19260 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
19270 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  t.      );.     
19280 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20   if( !pIdx ){.  
19290 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
192a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
192b0 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73  o such index: %s
192c0 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20  ", zIndex, 0);. 
192d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
192e0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
192f0 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49  .      pFrom->pI
19300 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20  ndex = pIdx;.   
19310 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
19320 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79  cess NATURAL key
19330 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e  words, and ON an
19340 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
19350 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20  of joins..  */. 
19360 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
19370 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50  ailed || sqliteP
19380 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73  rocessJoin(pPars
19390 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74  e, p) ){.    ret
193a0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
193b0 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65   }..  /* For eve
193c0 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75  ry "*" that occu
193d0 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rs in the column
193e0 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68   list, insert th
193f0 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20  e names of.  ** 
19400 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
19410 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20  ll tables.  And 
19420 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e  for every TABLE.
19430 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  * insert the nam
19440 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63  es.  ** of all c
19450 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e  olumns in TABLE.
19460 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73    The parser ins
19470 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20  erted a special 
19480 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
19490 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20  with the TK_ALL 
194a0 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63  operator for eac
194b0 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f  h "*" that it fo
194c0 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  und in the colum
194d0 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65  n list..  ** The
194e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
194f0 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61  just has to loca
19500 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78  te the TK_ALL ex
19510 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78  pressions and ex
19520 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f  pand.  ** each o
19530 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ne to the list o
19540 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
19550 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a   all tables..  *
19560 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
19570 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b   loop just check
19580 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  s to see if ther
19590 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70  e are any "*" op
195a0 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61  erators.  ** tha
195b0 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67  t need expanding
195c0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30  ..  */.  for(k=0
195d0 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
195e0 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; k++){.    Exp
195f0 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e  r *pE = pEList->
19600 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
19610 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
19620 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  LL ) break;.    
19630 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
19640 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  OT && pE->pRight
19650 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   && pE->pRight->
19660 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20  op==TK_ALL.     
19670 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74      && pE->pLeft
19680 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f   && pE->pLeft->o
19690 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b  p==TK_ID ) break
196a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45  ;.  }.  if( k<pE
196b0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
196c0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
196d0 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
196e0 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
196f0 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
19700 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
19710 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
19720 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
19730 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
19740 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
19750 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
19760 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
19770 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
19780 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
19790 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
197a0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
197b0 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
197c0 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
197d0 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
197e0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
197f0 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
19800 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
19810 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
19820 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20  lNames)!=0.     
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19840 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
19850 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
19860 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28  s)==0;..    for(
19870 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
19880 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
19890 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b    Expr *pE = a[k
198a0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
198b0 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  f( pE->op!=TK_AL
198c0 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  L &&.           
198d0 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20  (pE->op!=TK_DOT 
198e0 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30  || pE->pRight==0
198f0 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   || pE->pRight->
19900 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20  op!=TK_ALL) ){. 
19910 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
19920 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
19930 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
19940 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
19950 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
19960 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
19970 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
19980 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
19990 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b   a[k].pExpr, 0);
199a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
199b0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
199c0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
199d0 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b  pr-1].zName = a[
199e0 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  k].zName;.      
199f0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
19a00 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
19a10 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
19a20 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
19a30 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
19a40 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
19a50 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
19a60 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
19a70 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
19a80 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
19a90 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
19aa0 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
19ab0 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
19ac0 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
19ad0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
19ae0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
19af0 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
19b00 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
19b10 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
19b20 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65  K_DOT && pE->pLe
19b30 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
19b40 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  zTName = sqlite3
19b50 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
19b60 2c 20 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f  , &pE->pLeft->to
19b70 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ken);.        }e
19b80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
19b90 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  TName = 0;.     
19ba0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
19bb0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
19bc0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
19bd0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
19be0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
19bf0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
19c00 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
19c10 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
19c20 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
19c30 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
19c40 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
19c50 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
19c60 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  ]==0 ){ .       
19c70 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
19c80 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
19c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19ca0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
19cb0 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
19cc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
19cd0 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  TName && sqlite3
19ce0 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
19cf0 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  zTabName)!=0 ){.
19d00 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
19d10 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
19d20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c  }.          tabl
19d30 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  eSeen = 1;.     
19d40 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
19d50 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
19d60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
19d70 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67  pr *pExpr, *pRig
19d80 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
19d90 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
19da0 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
19db0 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
19dc0 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69  /* If a column i
19dd0 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64  s marked as 'hid
19de0 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20  den' (currently 
19df0 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20  only possible.  
19e00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72            ** for
19e10 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29   virtual tables)
19e20 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65  , do not include
19e30 20 69 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e   it in the expan
19e40 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ded.            
19e50 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69  ** result-set li
19e60 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
19e70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
19e80 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d  f( IsHiddenColum
19e90 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  n(&pTab->aCol[j]
19ea0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
19eb0 20 20 20 61 73 73 65 72 74 28 49 73 56 69 72 74     assert(IsVirt
19ec0 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20  ual(pTab));.    
19ed0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
19ee0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
19ef0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  }..            i
19f00 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
19f10 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
19f20 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
19f30 66 74 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  ft = &pTabList->
19f40 61 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  a[i-1];.        
19f50 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 66 74        if( (pLeft
19f60 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  [1].jointype & J
19f70 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26  T_NATURAL)!=0 &&
19f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19f90 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49           columnI
19fa0 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 54 61 62  ndex(pLeft->pTab
19fb0 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
19fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19fd0 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
19fe0 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
19ff0 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
1a000 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
1a010 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e       ** table on
1a020 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
1a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
1a040 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1a050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a060 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1a070 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 4c 65  3IdListIndex(pLe
1a080 66 74 5b 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e  ft[1].pUsing, zN
1a090 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
1a0a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1a0b0 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
1a0c0 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
1a0d0 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
1a0e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a0f0 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
1a100 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
1a110 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
1a120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a130 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1a140 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a150 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a160 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
1a170 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1a180 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  e, TK_ID, 0, 0, 
1a190 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
1a1a0 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 20  if( pRight==0 ) 
1a1b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1a1c0 20 20 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65     setQuotedToke
1a1d0 6e 28 70 50 61 72 73 65 2c 20 26 70 52 69 67 68  n(pParse, &pRigh
1a1e0 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29  t->token, zName)
1a1f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1a200 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70  ( longNames || p
1a210 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20  TabList->nSrc>1 
1a220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1a230 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73   Expr *pLeft = s
1a240 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1a250 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  se, TK_ID, 0, 0,
1a260 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
1a270 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
1a280 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
1a290 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
1a2a0 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
1a2b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
1a2c0 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  pr==0 ) break;. 
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
1a2e0 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61 72  QuotedToken(pPar
1a2f0 73 65 2c 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65  se, &pLeft->toke
1a300 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20  n, zTabName);.  
1a310 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54              setT
1a320 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73 70 61  oken(&pExpr->spa
1a330 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  n, .            
1a340 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
1a350 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
1a360 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d  , zTabName, zNam
1a370 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
1a380 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64     pExpr->span.d
1a390 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  yn = 1;.        
1a3a0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
1a3b0 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  en.z = 0;.      
1a3c0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
1a3d0 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  oken.n = 0;.    
1a3e0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1a3f0 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a  >token.dyn = 0;.
1a400 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1a410 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
1a420 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
1a430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1a440 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78  Expr->span = pEx
1a450 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  pr->token;.     
1a460 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1a470 73 70 61 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20  span.dyn = 0;.  
1a480 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a490 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
1a4a0 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
1a4b0 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
1a4c0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
1a4d0 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
1a4e0 2c 20 70 45 78 70 72 2c 20 26 70 45 78 70 72 2d  , pExpr, &pExpr-
1a4f0 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  >span);.        
1a500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a510 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
1a520 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1a530 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
1a540 65 77 2c 20 70 45 78 70 72 2c 20 26 70 52 69 67  ew, pExpr, &pRig
1a550 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ht->token);.    
1a560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a570 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1a580 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
1a590 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
1a5a0 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
1a5b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1a5c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1a5d0 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
1a5e0 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
1a5f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
1a600 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1a610 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a620 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
1a630 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
1a640 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1a650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1a660 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a670 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20   zTName);.      
1a680 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1a690 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
1a6a0 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20  e(db, pEList);. 
1a6b0 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
1a6c0 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  New;.  }.#if SQL
1a6d0 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20  ITE_MAX_COLUMN. 
1a6e0 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26   if( p->pEList &
1a6f0 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  & p->pEList->nEx
1a700 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  pr>db->aLimit[SQ
1a710 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
1a720 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
1a730 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a740 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
1a750 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
1a760 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t");.  }.#endif.
1a770 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1a780 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
1a790 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
1a7a0 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
1a7b0 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   walker..**.** W
1a7c0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1a7d0 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78   is the Walker.x
1a7e0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
1a7f0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
1a800 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64  es.** are walked
1a810 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74   without any act
1a820 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e  ions being taken
1a830 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20   at each node.  
1a840 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77  Presumably,.** w
1a850 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1a860 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c   is used for Wal
1a870 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
1a880 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65  k then .** Walke
1a890 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
1a8a0 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73  k is set to do s
1a8b0 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20  omething useful 
1a8c0 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75  for every .** su
1a8d0 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
1a8e0 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74  rser tree..*/.st
1a8f0 61 74 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c  atic int exprWal
1a900 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 70 57  kNoop(Walker *pW
1a910 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
1a920 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 57 52  pr){.  return WR
1a930 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
1a940 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1a950 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45  e "expands" a SE
1a960 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61  LECT statement a
1a970 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75  nd all of its su
1a980 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72  bqueries..** For
1a990 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1a9a0 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20  rmation on what 
1a9b0 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70  it means to "exp
1a9c0 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a  and" a SELECT.**
1a9d0 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20   statement, see 
1a9e0 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
1a9f0 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20  he selectExpand 
1aa00 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  worker callback 
1aa10 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70  above..**.** Exp
1aa20 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20  anding a SELECT 
1aa30 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65  statement is the
1aa40 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70   first step in p
1aa50 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53  rocessing a.** S
1aa60 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1aa70 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61    The SELECT sta
1aa80 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65  tement must be e
1aa90 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a  xpanded before.*
1aaa0 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  * name resolutio
1aab0 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a  n is performed..
1aac0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e  **.** If anythin
1aad0 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e  g goes wrong, an
1aae0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1aaf0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70  s written into p
1ab00 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61  Parse..** The ca
1ab10 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  lling function c
1ab20 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72  an detect the pr
1ab30 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67  oblem by looking
1ab40 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   at pParse->nErr
1ab50 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73  .** and/or pPars
1ab60 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1ab70 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
1ab80 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
1ab90 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70  tExpand(Parse *p
1aba0 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
1abb0 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65  Select){.  Walke
1abc0 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  r w;.  w.xSelect
1abd0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
1abe0 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78  tExpander;.  w.x
1abf0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
1ac00 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
1ac10 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
1ac20 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
1ac30 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
1ac40 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  t);.}...#ifndef 
1ac50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1ac60 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  UERY./*.** This 
1ac70 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c  is a Walker.xSel
1ac80 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c  ectCallback call
1ac90 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c  back for the sql
1aca0 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e  ite3SelectTypeIn
1acb0 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  fo().** interfac
1acc0 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63  e..**.** For eac
1acd0 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  h FROM-clause su
1ace0 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75  bquery, add Colu
1acf0 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c  mn.zType and Col
1ad00 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66  umn.zColl.** inf
1ad10 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  ormation to the 
1ad20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
1ad30 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
1ad40 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a  the result set.*
1ad50 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65  * of that subque
1ad60 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61  ry..**.** The Ta
1ad70 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
1ad80 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
1ad90 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73  e result set was
1ada0 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20   constructed.** 
1adb0 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  by selectExpande
1adc0 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65  r() but the type
1add0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
1ade0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f  nformation was o
1adf0 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61  mitted.** at tha
1ae00 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20  t point because 
1ae10 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20  identifiers had 
1ae20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73  not yet been res
1ae30 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20  olved.  This.** 
1ae40 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1ae50 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69  d after identifi
1ae60 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  er resolution..*
1ae70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
1ae80 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
1ae90 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70  peInfo(Walker *p
1aea0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
1aeb0 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
1aec0 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rse;.  int i;.  
1aed0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
1aee0 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
1aef0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
1af00 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ..  assert( p->s
1af10 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
1af20 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 28  olved );.  if( (
1af30 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1af40 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
1af50 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   ){.    p->selFl
1af60 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70  ags |= SF_HasTyp
1af70 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72 73  eInfo;.    pPars
1af80 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
1af90 72 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  rse;.    pTabLis
1afa0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
1afb0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
1afc0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
1afd0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1afe0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
1aff0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
1b000 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
1b010 20 20 20 20 20 69 66 28 20 70 54 61 62 20 26 26       if( pTab &&
1b020 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
1b030 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
1b040 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
1b050 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
1b060 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1b070 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
1b080 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
1b090 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
1b0a0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 61  elect;.        a
1b0b0 73 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20  ssert( pSel );. 
1b0c0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
1b0d0 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
1b0e0 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
1b0f0 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
1b100 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
1b110 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
1b120 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54  , pTab->nCol, pT
1b130 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 29 3b  ab->aCol, pSel);
1b140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b150 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
1b160 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64  Continue;.}.#end
1b170 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
1b180 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74  routine adds dat
1b190 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74  atype and collat
1b1a0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66  ing sequence inf
1b1b0 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74  ormation to.** t
1b1c0 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
1b1d0 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d  res of all FROM-
1b1e0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
1b1f0 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54  s in a.** SELECT
1b200 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
1b210 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69  * Use this routi
1b220 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65  ne after name re
1b230 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
1b240 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
1b250 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
1b260 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
1b270 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
1b280 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1b290 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1b2a0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
1b2b0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1b2c0 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  = selectAddSubqu
1b2d0 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77  eryTypeInfo;.  w
1b2e0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
1b2f0 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20   exprWalkNoop;. 
1b300 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
1b310 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
1b320 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
1b330 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ect);.#endif.}..
1b340 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1b350 69 6e 65 20 73 65 74 73 20 6f 66 20 61 20 53 45  ine sets of a SE
1b360 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
1b370 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  or processing.  
1b380 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
1b390 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
1b3a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56  :.**.**     *  V
1b3b0 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65  DBE Cursor numbe
1b3c0 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  rs are assigned 
1b3d0 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  to all FROM-clau
1b3e0 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20  se terms..**    
1b3f0 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61   *  Ephemeral Ta
1b400 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ble objects are 
1b410 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
1b420 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
1b430 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a  ueries..**     *
1b440 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63    ON and USING c
1b450 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74  lauses are shift
1b460 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74  ed into WHERE st
1b470 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  atements.**     
1b480 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22  *  Wildcards "*"
1b490 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69   and "TABLE.*" i
1b4a0 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72  n result sets ar
1b4b0 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20  e expanded..**  
1b4c0 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72     *  Identifier
1b4d0 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s in expression 
1b4e0 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74  are matched to t
1b4f0 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ables..**.** Thi
1b500 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72  s routine acts r
1b510 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c  ecursively on al
1b520 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74  l subqueries wit
1b530 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a  hin the SELECT..
1b540 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1b550 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72  electPrep(.  Par
1b560 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1b570 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
1b580 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
1b590 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1b5a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
1b5b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
1b5c0 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
1b5d0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
1b5e0 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63  terNC  /* Name c
1b5f0 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61  ontext for conta
1b600 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  iner */.){.  sql
1b610 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
1b620 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
1b630 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1b640 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  ;.  if( p->selFl
1b650 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
1b660 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20  Info ) return;. 
1b670 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1b680 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1b690 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
1b6a0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45    sqlite3SelectE
1b6b0 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29  xpand(pParse, p)
1b6c0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1b6d0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
1b6e0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1b6f0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  n;.  sqlite3Reso
1b700 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70  lveSelectNames(p
1b710 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72  Parse, p, pOuter
1b720 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  NC);.  if( pPars
1b730 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
1b740 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
1b750 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
1b760 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
1b770 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a  (pParse, p);.}..
1b780 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
1b790 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
1b7a0 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lator..**.** The
1b7b0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
1b7c0 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20  ulator is a set 
1b7d0 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  of memory cells 
1b7e0 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74  that hold.** int
1b7f0 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
1b800 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74  s while calculat
1b810 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65  ing an aggregate
1b820 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
1b830 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73  ne simply stores
1b840 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66   NULLs in all of
1b850 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65   those memory ce
1b860 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lls..*/.static v
1b870 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c  oid resetAccumul
1b880 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
1b890 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
1b8a0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
1b8b0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1b8c0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1b8d0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
1b8e0 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20  c *pFunc;.  if( 
1b8f0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b  pAggInfo->nFunc+
1b900 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
1b910 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  n==0 ){.    retu
1b920 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  rn;.  }.  for(i=
1b930 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
1b940 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
1b950 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b960 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1b970 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  0, pAggInfo->aCo
1b980 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a  l[i].iMem);.  }.
1b990 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67    for(pFunc=pAgg
1b9a0 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30  Info->aFunc, i=0
1b9b0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
1b9c0 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b  unc; i++, pFunc+
1b9d0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
1b9e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b9f0 4e 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e  Null, 0, pFunc->
1ba00 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  iMem);.    if( p
1ba10 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e  Func->iDistinct>
1ba20 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
1ba30 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45   *pE = pFunc->pE
1ba40 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
1ba50 45 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  E->pList==0 || p
1ba60 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  E->pList->nExpr!
1ba70 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
1ba80 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1ba90 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
1baa0 69 6e 20 61 67 67 72 65 67 61 74 65 20 6d 75 73  in aggregate mus
1bab0 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a  t be followed ".
1bac0 20 20 20 20 20 20 20 20 20 20 20 22 62 79 20 61             "by a
1bad0 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
1bae0 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69          pFunc->i
1baf0 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
1bb00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1bb10 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
1bb20 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
1bb30 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
1bb40 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a  se, pE->pList);.
1bb50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1bb60 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1bb70 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
1bb80 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
1bb90 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbb0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
1bbc0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
1bbd0 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  DOFF);.      }. 
1bbe0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1bbf0 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f  * Invoke the OP_
1bc00 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f  AggFinalize opco
1bc10 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67  de for every agg
1bc20 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
1bc30 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66  ** in the AggInf
1bc40 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  o structure..*/.
1bc50 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61  static void fina
1bc60 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
1bc70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1bc80 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1bc90 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
1bca0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1bcb0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1bcc0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
1bcd0 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  F;.  for(i=0, pF
1bce0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
1bcf0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
1bd00 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
1bd10 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1bd20 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
1bd30 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c  ->pList;.    sql
1bd40 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1bd50 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
1bd60 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f  F->iMem, pList ?
1bd70 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
1bd80 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
1bd90 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1bda0 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  d*)pF->pFunc, P4
1bdb0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
1bdc0 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
1bdd0 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d  he accumulator m
1bde0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
1bdf0 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73  an aggregate bas
1be00 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  ed on.** the cur
1be10 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
1be20 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1be30 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d  void updateAccum
1be40 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
1be50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
1be60 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
1be70 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1be80 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
1be90 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
1bea0 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63  unc *pF;.  struc
1beb0 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
1bec0 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e  C;..  pAggInfo->
1bed0 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
1bee0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
1bef0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
1bf00 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
1bf10 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
1bf20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
1bf30 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30  int addrNext = 0
1bf40 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67  ;.    int regAgg
1bf50 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
1bf60 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
1bf70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 66  r->pList;.    if
1bf80 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
1bf90 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
1bfa0 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41  Expr;.      regA
1bfb0 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  gg = sqlite3GetT
1bfc0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1bfd0 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71   nArg);.      sq
1bfe0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
1bff0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
1c000 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30 29 3b  ist, regAgg, 0);
1c010 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c020 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20    nArg = 0;.    
1c030 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20    regAgg = 0;.  
1c040 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
1c050 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
1c060 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d        addrNext =
1c070 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1c080 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1c090 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
1c0a0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73  );.      codeDis
1c0b0 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46  tinct(pParse, pF
1c0c0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
1c0d0 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67  rNext, 1, regAgg
1c0e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1c0f0 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64   pF->pFunc->need
1c100 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20  CollSeq ){.     
1c110 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
1c120 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63  = 0;.      struc
1c130 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1c140 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e  *pItem;.      in
1c150 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
1c160 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20  t( pList!=0 );  
1c170 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70  /* pList!=0 if p
1c180 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f  F->pFunc->needCo
1c190 6c 6c 53 65 71 20 69 73 20 74 72 75 65 20 2a 2f  llSeq is true */
1c1a0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
1c1b0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
1c1c0 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67  !pColl && j<nArg
1c1d0 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
1c1e0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
1c1f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1c200 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
1c210 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
1c220 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
1c230 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
1c240 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
1c250 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1c260 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1c270 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1c280 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
1c290 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
1c2a0 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
1c2b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1c2c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1c2d0 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20   OP_AggStep, 0, 
1c2e0 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d  regAgg, pF->iMem
1c2f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c300 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
1c310 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
1c320 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74  CDEF);.    sqlit
1c330 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1c340 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  , nArg);.    sql
1c350 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1c360 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
1c370 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
1c380 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1c390 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1c3a0 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
1c3b0 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64  Arg);.    if( ad
1c3c0 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  drNext ){.      
1c3d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1c3e0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e  veLabel(v, addrN
1c3f0 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ext);.    }.  }.
1c400 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41    for(i=0, pC=pA
1c410 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c  ggInfo->aCol; i<
1c420 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
1c430 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b  ulator; i++, pC+
1c440 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
1c450 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1c460 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69  pC->pExpr, pC->i
1c470 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67  Mem);.  }.  pAgg
1c480 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
1c490 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = 0;.}../*.** G
1c4a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1c4b0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1c4c0 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
1c4d0 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
1c4e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
1c4f0 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
1c500 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
1c510 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
1c520 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1c530 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  of the SelectDes
1c540 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  t structure poin
1c550 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65  ted to by argume
1c560 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66  nt pDest.** as f
1c570 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1c580 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 20    pDest->eDest  
1c590 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20    Result.**     
1c5a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
1c5b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c5c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c5d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
1c5e0 20 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20 20     SRT_Output   
1c5f0 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 72 6f     Generate a ro
1c600 77 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73 69  w of output (usi
1c610 6e 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74  ng the OP_Result
1c620 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  Row.**          
1c630 20 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f 64             opcod
1c640 65 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  e) for each row 
1c650 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1c660 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
1c670 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e 6c  _Mem         Onl
1c680 79 20 76 61 6c 69 64 20 69 66 20 74 68 65 20 72  y valid if the r
1c690 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67 6c  esult is a singl
1c6a0 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20  e column..**    
1c6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6c0 20 53 74 6f 72 65 20 74 68 65 20 66 69 72 73 74   Store the first
1c6d0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
1c6e0 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77 0a  irst result row.
1c6f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1c700 20 20 20 20 20 20 20 69 6e 20 72 65 67 69 73 74         in regist
1c710 65 72 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  er pDest->iParm 
1c720 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74 68 65  then abandon the
1c730 20 72 65 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   rest.**        
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
1c750 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73  the query.  This
1c760 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 6d 70   destination imp
1c770 6c 69 65 73 20 22 4c 49 4d 49 54 20 31 22 2e 0a  lies "LIMIT 1"..
1c780 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
1c790 74 20 20 20 20 20 20 20 20 20 54 68 65 20 72 65  t         The re
1c7a0 73 75 6c 74 20 6d 75 73 74 20 62 65 20 61 20 73  sult must be a s
1c7b0 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 53  ingle column.  S
1c7c0 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20 20 20  tore each.**    
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7e0 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 20 61   row of result a
1c7f0 73 20 74 68 65 20 6b 65 79 20 69 6e 20 74 61 62  s the key in tab
1c800 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e  le pDest->iParm.
1c810 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
1c820 20 20 20 20 20 20 20 20 20 41 70 70 6c 79 20 74           Apply t
1c830 68 65 20 61 66 66 69 6e 69 74 79 20 70 44 65 73  he affinity pDes
1c840 74 2d 3e 61 66 66 69 6e 69 74 79 20 62 65 66 6f  t->affinity befo
1c850 72 65 20 73 74 6f 72 69 6e 67 0a 2a 2a 20 20 20  re storing.**   
1c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c870 20 20 72 65 73 75 6c 74 73 2e 20 20 55 73 65 64    results.  Used
1c880 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 49   to implement "I
1c890 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e  N (SELECT ...)".
1c8a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55  .**.**     SRT_U
1c8b0 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65  nion       Store
1c8c0 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65   results as a ke
1c8d0 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  y in a temporary
1c8e0 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
1c8f0 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
1c900 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52  RT_Except      R
1c910 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72  emove results fr
1c920 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  om the temporary
1c930 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
1c940 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
1c950 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53  RT_Table       S
1c960 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
1c970 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1c980 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
1c990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9a0 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b       This is lik
1c9b0 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 65  e SRT_EphemTab e
1c9c0 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74  xcept that the t
1c9d0 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 61              is a
1c9f0 73 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61 64  ssumed to alread
1ca00 79 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a  y be open..**.**
1ca10 20 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61       SRT_EphemTa
1ca20 62 20 20 20 20 43 72 65 61 74 65 20 61 6e 20 74  b    Create an t
1ca30 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70  emporary table p
1ca40 44 65 73 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20  Dest->iParm and 
1ca50 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  store.**        
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
1ca70 20 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20 54   result there. T
1ca80 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1ca90 74 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20  t open after.** 
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cab0 20 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 20 20      returning.  
1cac0 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54  This is like SRT
1cad0 5f 54 61 62 6c 65 20 65 78 63 65 70 74 20 74 68  _Table except th
1cae0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
1caf0 20 20 20 20 20 20 20 20 20 20 74 68 69 73 20 64            this d
1cb00 65 73 74 69 6e 61 74 69 6f 6e 20 75 73 65 73 20  estination uses 
1cb10 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1cb20 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 20 20   to create.**   
1cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb40 20 20 74 68 65 20 74 61 62 6c 65 20 66 69 72 73    the table firs
1cb50 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
1cb60 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 47 65 6e  _Coroutine   Gen
1cb70 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74 69  erate a co-routi
1cb80 6e 65 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ne that returns 
1cb90 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a 2a 20  a new row of.** 
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbb0 20 20 20 20 72 65 73 75 6c 74 73 20 65 61 63 68      results each
1cbc0 20 74 69 6d 65 20 69 74 20 69 73 20 69 6e 76 6f   time it is invo
1cbd0 6b 65 64 2e 20 20 54 68 65 20 65 6e 74 72 79 20  ked.  The entry 
1cbe0 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  point.**        
1cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
1cc00 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69  the co-routine i
1cc10 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
1cc20 73 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61 72  ster pDest->iPar
1cc30 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
1cc40 5f 45 78 69 73 74 73 20 20 20 20 20 20 53 74 6f  _Exists      Sto
1cc50 72 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79  re a 1 in memory
1cc60 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61   cell pDest->iPa
1cc70 72 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  rm if the result
1cc80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1cc90 20 20 20 20 20 20 20 20 73 65 74 20 69 73 20 6e          set is n
1cca0 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  ot empty..**.** 
1ccb0 20 20 20 20 53 52 54 5f 44 69 73 63 61 72 64 20      SRT_Discard 
1ccc0 20 20 20 20 54 68 72 6f 77 20 74 68 65 20 72 65      Throw the re
1ccd0 73 75 6c 74 73 20 61 77 61 79 2e 20 20 54 68 69  sults away.  Thi
1cce0 73 20 69 73 20 75 73 65 64 20 62 79 20 53 45 4c  s is used by SEL
1ccf0 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
1cd00 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
1cd10 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69  ments within tri
1cd20 67 67 65 72 73 20 77 68 6f 73 65 20 6f 6e 6c 79  ggers whose only
1cd30 20 70 75 72 70 6f 73 65 20 69 73 0a 2a 2a 20 20   purpose is.**  
1cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd50 20 20 20 74 68 65 20 73 69 64 65 2d 65 66 66 65     the side-effe
1cd60 63 74 73 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73  cts of functions
1cd70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1cd80 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
1cd90 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
1cda0 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
1cdb0 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
1cdc0 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
1cdd0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
1cde0 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
1cdf0 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
1ce00 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
1ce10 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
1ce20 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
1ce30 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
1ce40 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
1ce50 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1ce60 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
1ce70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1ce80 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
1ce90 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1cea0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
1ceb0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1cec0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1ced0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
1cee0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
1cef0 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65  g coded. */.  Se
1cf00 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
1cf10 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
1cf20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72  do with the quer
1cf30 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
1cf40 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
1cf50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1cf60 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
1cf70 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1cf80 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
1cf90 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72  from sqlite3Wher
1cfa0 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64  eBegin() */.  Vd
1cfb0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
1cfc0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
1cfd0 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
1cfe0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1cff0 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  /.  int isAgg;  
1d000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d010 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
1d020 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
1d030 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
1d040 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
1d050 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
1d060 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
1d070 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
1d080 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
1d090 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
1d0a0 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
1d0b0 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
1d0c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1d0d0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
1d0e0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
1d0f0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1d100 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  y;    /* The ORD
1d110 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  ER BY clause.  M
1d120 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1d130 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
1d140 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
1d150 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
1d160 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1d170 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
1d180 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
1d190 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
1d1a0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1d1b0 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20  int isDistinct; 
1d1c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1d1d0 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
1d1e0 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
1d1f0 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  t */.  int disti
1d200 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nct;          /*
1d210 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f   Table to use fo
1d220 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
1d230 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  et */.  int rc =
1d240 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
1d250 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
1d260 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
1d270 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
1d280 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
1d290 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
1d2a0 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  n OP_OpenEphemer
1d2b0 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  al instruction *
1d2c0 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67  /.  AggInfo sAgg
1d2d0 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Info;      /* In
1d2e0 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62  formation used b
1d2f0 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  y aggregate quer
1d300 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  ies */.  int iEn
1d310 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1d320 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1d330 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65  e end of the que
1d340 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
1d350 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
1d360 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
1d370 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
1d380 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1d390 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
1d3a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1d3b0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
1d3c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1d3d0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1d3e0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1d3f0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
1d400 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
1d410 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
1d420 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
1d430 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
1d440 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  ;..  pOrderBy = 
1d450 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
1d460 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
1d470 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
1d480 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1d490 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68  0;..    /* In th
1d4a0 65 73 65 20 63 61 73 65 73 20 74 68 65 20 44 49  ese cases the DI
1d4b0 53 54 49 4e 43 54 20 6f 70 65 72 61 74 6f 72 20  STINCT operator 
1d4c0 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65  makes no differe
1d4d0 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  nce to the.    *
1d4e0 2a 20 72 65 73 75 6c 74 73 2c 20 73 6f 20 72 65  * results, so re
1d4f0 6d 6f 76 65 20 69 74 20 69 66 20 69 74 20 77 65  move it if it we
1d500 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20  re specified..  
1d510 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1d520 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1d530 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
1d540 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
1d550 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
1d560 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
1d570 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
1d580 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1d590 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20 70  _Discard);.    p
1d5a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
1d5b0 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
1d5c0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
1d5d0 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
1d5e0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
1d5f0 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 67 6f 74  >nErr ){.    got
1d600 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1d610 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  }.  p->pOrderBy 
1d620 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 0a 20 20  = pOrderBy;...  
1d630 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f  /* Make local co
1d640 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61  pies of the para
1d650 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20  meters for this 
1d660 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54  query..  */.  pT
1d670 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
1d680 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e  ;.  isAgg = (p->
1d690 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
1d6a0 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 70  gregate)!=0;.  p
1d6b0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
1d6c0 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  t;.  if( pEList=
1d6d0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
1d6e0 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  _end;..  /* .  *
1d6f0 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74  * Do not even at
1d700 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74  tempt to generat
1d710 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65  e any code if we
1d720 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65   have already se
1d730 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62  en.  ** errors b
1d740 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
1d750 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a  ne starts..  */.
1d760 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1d770 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  rr>0 ) goto sele
1d780 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 4f 52  ct_end;..  /* OR
1d790 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65  DER BY is ignore
1d7a0 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69  d for some desti
1d7b0 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nations..  */.  
1d7c0 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64  if( IgnorableOrd
1d7d0 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
1d7e0 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
1d7f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
1d800 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   generating code
1d810 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
1d820 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1d830 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
1d840 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1d850 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  d;..  /* Generat
1d860 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73  e code for all s
1d870 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68  ub-queries in th
1d880 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
1d890 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1d8a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1d8b0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1d8c0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1d8d0 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21  EW).  for(i=0; !
1d8e0 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70  p->pPrior && i<p
1d8f0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1d900 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
1d910 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1d920 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
1d930 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
1d940 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
1d950 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
1d960 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
1d970 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b     int isAggSub;
1d980 0a 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  ..    if( pSub==
1d990 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f  0 || pItem->isPo
1d9a0 70 75 6c 61 74 65 64 20 29 20 63 6f 6e 74 69 6e  pulated ) contin
1d9b0 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72  ue;..    /* Incr
1d9c0 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
1d9d0 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
1d9e0 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
1d9f0 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
1da00 2a 2a 20 74 72 65 65 20 72 65 66 65 72 65 64 20  ** tree refered 
1da10 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
1da20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
1da30 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
1da40 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
1da50 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
1da60 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
1da70 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
1da80 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
1da90 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
1daa0 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
1dab0 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
1dac0 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
1dad0 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
1dae0 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
1daf0 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
1db00 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
1db10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
1db20 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
1db30 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
1db40 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
1db50 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1db60 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1db70 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
1db80 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e  into the parent.
1db90 20 2a 2f 0a 20 20 20 20 69 73 41 67 67 53 75 62   */.    isAggSub
1dba0 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61   = (pSub->selFla
1dbb0 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
1dbc0 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66  e)!=0;.    if( f
1dbd0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
1dbe0 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41  Parse, p, i, isA
1dbf0 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b  gg, isAggSub) ){
1dc00 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67  .      if( isAgg
1dc10 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Sub ){.        i
1dc20 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
1dc30 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
1dc40 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
1dc50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
1dc60 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
1dc70 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
1dc80 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
1dc90 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
1dca0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
1dcb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1dcc0 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74  pItem->isPopulat
1dcd0 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ed==0 );.      s
1dce0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1dcf0 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
1dd00 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
1dd10 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b  isPopulated = 1;
1dd20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1dd30 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
1dd40 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1dd50 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
1dd60 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
1dd70 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
1dd80 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65  ght -= sqlite3Se
1dd90 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
1dda0 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20  );.    pTabList 
1ddb0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
1ddc0 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64  f( !IgnorableOrd
1ddd0 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
1dde0 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
1ddf0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
1de00 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
1de10 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e  = p->pEList;.#en
1de20 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70  dif.  pWhere = p
1de30 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
1de40 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1de50 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
1de60 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
1de70 44 69 73 74 69 6e 63 74 20 3d 20 28 70 2d 3e 73  Distinct = (p->s
1de80 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1de90 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e  tinct)!=0;..#ifn
1dea0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1deb0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
1dec0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1ded0 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20   are a sequence 
1dee0 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74  of queries, do t
1def0 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20  he earlier ones 
1df00 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  first..  */.  if
1df10 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
1df20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74     if( p->pRight
1df30 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  most==0 ){.     
1df40 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20   Select *pLoop, 
1df50 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  *pRight = 0;.   
1df60 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
1df70 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65        int mxSele
1df80 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c  ct;.      for(pL
1df90 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
1dfa0 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
1dfb0 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20  r, cnt++){.     
1dfc0 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74     pLoop->pRight
1dfd0 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  most = p;.      
1dfe0 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d    pLoop->pNext =
1dff0 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
1e000 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b   pRight = pLoop;
1e010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
1e020 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c  xSelect = db->aL
1e030 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
1e040 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
1e050 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  T];.      if( mx
1e060 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d 78  Select && cnt>mx
1e070 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
1e080 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1e090 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
1e0a0 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d  any terms in com
1e0b0 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a  pound SELECT");.
1e0c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
1e0d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e0e0 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
1e0f0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
1e100 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 23 65  , pDest);.  }.#e
1e110 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 72  ndif..  /* If wr
1e120 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
1e130 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
1e140 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
1e150 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
1e160 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
1e170 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1e180 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1e190 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
1e1a0 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
1e1b0 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
1e1c0 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
1e1d0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
1e1e0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
1e1f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f  ndif..  /* If po
1e200 73 73 69 62 6c 65 2c 20 72 65 77 72 69 74 65 20  ssible, rewrite 
1e210 74 68 65 20 71 75 65 72 79 20 74 6f 20 75 73 65  the query to use
1e220 20 47 52 4f 55 50 20 42 59 20 69 6e 73 74 65 61   GROUP BY instea
1e230 64 20 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a 20  d of DISTINCT.. 
1e240 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d 69 67   ** GROUP BY mig
1e250 68 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2c  ht use an index,
1e260 20 44 49 53 54 49 4e 43 54 20 6e 65 76 65 72 20   DISTINCT never 
1e270 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  does..  */.  if(
1e280 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1e290 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1e2a0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
1e2b0 44 69 73 74 69 6e 63 74 20 26 26 20 21 70 2d 3e  Distinct && !p->
1e2c0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
1e2d0 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
1e2e0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1e2f0 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  (db, p->pEList);
1e300 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
1e310 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
1e320 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
1e330 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
1e340 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30    isDistinct = 0
1e350 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1e360 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
1e370 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
1e380 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20   this sorting.  
1e390 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65  ** index might e
1e3a0 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73  nd up being unus
1e3b0 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63  ed if the data c
1e3c0 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72  an be .  ** extr
1e3d0 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72  acted in pre-sor
1e3e0 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74  ted order.  If t
1e3f0 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c  hat is the case,
1e400 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f   then the.  ** O
1e410 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
1e420 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c  instruction will
1e430 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
1e440 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20  n OP_Noop once. 
1e450 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75   ** we figure ou
1e460 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69  t that the sorti
1e470 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ng index is not 
1e480 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64  needed.  The add
1e490 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20  rSortIndex.  ** 
1e4a0 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
1e4b0 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
1e4c0 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f  hat change..  */
1e4d0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
1e4e0 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
1e4f0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b  pKeyInfo;.    pK
1e500 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
1e510 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
1e520 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  rse, pOrderBy);.
1e530 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45      pOrderBy->iE
1e540 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
1e550 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e  >nTab++;.    p->
1e560 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
1e570 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  = addrSortIndex 
1e580 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  =.      sqlite3V
1e590 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1e5a0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
1e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5c0 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
1e5d0 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f  By->iECursor, pO
1e5e0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
1e5f0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1e610 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
1e620 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
1e630 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FF);.  }else{.  
1e640 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20    addrSortIndex 
1e650 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
1e660 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
1e670 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
1e680 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
1e690 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
1e6a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
1e6b0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
1e6c0 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
1e6d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e6e0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
1e6f0 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61  eral, pDest->iPa
1e700 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
1e710 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  r);.  }..  /* Se
1e720 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
1e730 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
1e740 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1e750 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
1e760 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
1e770 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
1e780 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72  .  /* Open a vir
1e790 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73  tual index to us
1e7a0 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
1e7b0 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
1e7c0 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b  f( isDistinct ){
1e7d0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
1e7e0 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65  eyInfo;.    asse
1e7f0 72 74 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72  rt( isAgg || pGr
1e800 6f 75 70 42 79 20 29 3b 0a 20 20 20 20 64 69 73  oupBy );.    dis
1e810 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
1e820 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79  nTab++;.    pKey
1e830 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
1e840 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
1e850 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  e, p->pEList);. 
1e860 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e870 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
1e880 70 68 65 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e  phemeral, distin
1e890 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8b0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
1e8c0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
1e8d0 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b  NDOFF);.  }else{
1e8e0 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
1e8f0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67  -1;.  }..  /* Ag
1e900 67 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d  gregate and non-
1e910 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
1e920 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69  s are handled di
1e930 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69  fferently */.  i
1e940 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72  f( !isAgg && pGr
1e950 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
1e960 2f 2a 20 54 68 69 73 20 63 61 73 65 20 69 73 20  /* This case is 
1e970 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  for non-aggregat
1e980 65 20 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2a  e queries.    **
1e990 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
1e9a0 61 73 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a  ase scan.    */.
1e9b0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
1e9c0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
1e9d0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
1e9e0 20 70 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72   pWhere, &pOrder
1e9f0 42 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  By, 0);.    if( 
1ea00 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
1ea10 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
1ea20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
1ea30 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
1ea40 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
1ea50 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  r OP_OpenEphemer
1ea60 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  al .    ** instr
1ea70 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20  uction ended up 
1ea80 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64  not being needed
1ea90 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  , then change th
1eaa0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
1eab0 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
1eac0 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
1ead0 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f  /.    if( addrSo
1eae0 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f  rtIndex>=0 && pO
1eaf0 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
1eb00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1eb10 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
1eb20 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 31 29 3b  drSortIndex, 1);
1eb30 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
1eb40 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a  enEphm[2] = -1;.
1eb50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
1eb60 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
1eb70 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f  nner loop.    */
1eb80 0a 20 20 20 20 61 73 73 65 72 74 28 21 69 73 44  .    assert(!isD
1eb90 69 73 74 69 6e 63 74 29 3b 0a 20 20 20 20 73 65  istinct);.    se
1eba0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
1ebb0 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
1ebc0 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
1ebd0 20 2d 31 2c 20 70 44 65 73 74 2c 0a 20 20 20 20   -1, pDest,.    
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebf0 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
1ec00 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
1ec10 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  k);..    /* End 
1ec20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
1ec30 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
1ec40 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1ec50 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
1ec60 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
1ec70 20 69 73 20 74 68 65 20 70 72 6f 63 65 73 73 69   is the processi
1ec80 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
1ec90 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20   queries */.    
1eca0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
1ecb0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
1ecc0 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ext for processi
1ecd0 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66  ng aggregate inf
1ece0 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
1ecf0 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20  int iAMem;      
1ed00 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
1ed10 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f   address for sto
1ed20 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f  ring current GRO
1ed30 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
1ed40 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iBMem;         
1ed50 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
1ed60 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f  dress for previo
1ed70 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  us GROUP BY */. 
1ed80 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b     int iUseFlag;
1ed90 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64         /* Mem ad
1eda0 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c  dress holding fl
1edb0 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ag indicating th
1edc0 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20  at at least.    
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ede0 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f      ** one row o
1edf0 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74  f the input to t
1ee00 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61  he aggregator ha
1ee10 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20  s been.         
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1ee30 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  * processed */. 
1ee40 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61     int iAbortFla
1ee50 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64  g;     /* Mem ad
1ee60 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73  dress which caus
1ee70 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69  es query abort i
1ee80 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20  f positive */.  
1ee90 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72    int groupBySor
1eea0 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f  t;    /* Rows co
1eeb0 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69  me from source i
1eec0 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
1eed0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
1eee0 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  End;        /* E
1eef0 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67  nd of processing
1ef00 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
1ef10 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f   */..    /* Remo
1ef20 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61  ve any and all a
1ef30 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20 74  liases between t
1ef40 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
1ef50 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f  d the.    ** GRO
1ef60 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  UP BY clause..  
1ef70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
1ef80 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69  oupBy ){.      i
1ef90 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1efb0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1efc0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
1efd0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1efe0 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  m;  /* For loopi
1eff0 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73 69  ng over expressi
1f000 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a  on in a list */.
1f010 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e  .      for(i=p->
1f020 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
1f030 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Item=p->pEList->
1f040 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
1f050 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
1f060 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30  Item->iAlias = 0
1f070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f080 66 6f 72 28 69 3d 70 47 72 6f 75 70 42 79 2d 3e  for(i=pGroupBy->
1f090 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72  nExpr, pItem=pGr
1f0a0 6f 75 70 42 79 2d 3e 61 3b 20 69 3e 30 3b 20 69  oupBy->a; i>0; i
1f0b0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
1f0c0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c        pItem->iAl
1f0d0 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
1f0e0 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a  .    }.. .    /*
1f0f0 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20   Create a label 
1f100 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20  to jump to when 
1f110 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74  we want to abort
1f120 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
1f130 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69    addrEnd = sqli
1f140 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1f150 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  (v);..    /* Con
1f160 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  vert TK_COLUMN n
1f170 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47  odes into TK_AGG
1f180 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65  _COLUMN and make
1f190 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20   entries in.    
1f1a0 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20  ** sAggInfo for 
1f1b0 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  all TK_AGG_FUNCT
1f1c0 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70  ION nodes in exp
1f1d0 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ressions of the.
1f1e0 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74      ** SELECT st
1f1f0 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a  atement..    */.
1f200 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
1f210 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
1f220 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
1f230 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
1f240 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
1f250 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e  abList;.    sNC.
1f260 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67  pAggInfo = &sAgg
1f270 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e  Info;.    sAggIn
1f280 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
1f290 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
1f2a0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31  GroupBy->nExpr+1
1f2b0 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
1f2c0 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
1f2d0 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69  roupBy;.    sqli
1f2e0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1f2f0 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
1f300 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
1f310 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
1f320 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42  st(&sNC, pOrderB
1f330 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76  y);.    if( pHav
1f340 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
1f350 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1f360 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
1f370 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a  pHaving);.    }.
1f380 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63      sAggInfo.nAc
1f390 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67  cumulator = sAgg
1f3a0 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Info.nColumn;.  
1f3b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
1f3c0 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b  gInfo.nFunc; i++
1f3d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f3e0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
1f3f0 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
1f400 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
1f410 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  ->pList);.    }.
1f420 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
1f430 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
1f440 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20  select_end;..   
1f450 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66   /* Processing f
1f460 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69  or aggregates wi
1f470 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76  th GROUP BY is v
1f480 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e  ery different an
1f490 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f  d.    ** much mo
1f4a0 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20  re complex than 
1f4b0 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f  aggregates witho
1f4c0 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20  ut a GROUP BY.. 
1f4d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
1f4e0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
1f4f0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1f500 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e  o;  /* Keying in
1f510 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
1f520 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73  e group by claus
1f530 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  e */.      int j
1f540 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
1f550 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69  * A-vs-B compari
1f560 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20  sion jump */.   
1f570 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75     int addrOutpu
1f580 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20  tRow;  /* Start 
1f590 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  of subroutine th
1f5a0 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73  at outputs a res
1f5b0 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ult row */.     
1f5c0 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f   int regOutputRo
1f5d0 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  w;   /* Return a
1f5e0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
1f5f0 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f  for output subro
1f600 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69  utine */.      i
1f610 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b  nt addrSetAbort;
1f620 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62     /* Set the ab
1f630 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74  ort flag and ret
1f640 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  urn */.      int
1f650 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20   addrTopOfLoop; 
1f660 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
1f670 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
1f680 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69     int addrSorti
1f690 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50  ngIdx; /* The OP
1f6a0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66  _OpenEphemeral f
1f6b0 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  or the sorting i
1f6c0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
1f6d0 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
1f6e0 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
1f6f0 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68  for resetting th
1f700 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f  e accumulator */
1f710 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
1f720 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  set;       /* Re
1f730 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
1f740 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20  ister for reset 
1f750 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  subroutine */.. 
1f760 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
1f770 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63   is a GROUP BY c
1f780 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  lause we might n
1f790 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  eed a sorting in
1f7a0 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  dex to.      ** 
1f7b0 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41  implement it.  A
1f7c0 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72  llocate that sor
1f7d0 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20  ting index now. 
1f7e0 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74   If it turns out
1f7f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
1f800 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74  e do not need it
1f810 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20   after all, the 
1f820 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
1f830 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20  struction.      
1f840 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  ** will be conve
1f850 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70  rted into a Noop
1f860 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  .  .      */.   
1f870 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
1f880 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d  ingIdx = pParse-
1f890 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
1f8a0 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
1f8b0 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
1f8c0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b  arse, pGroupBy);
1f8d0 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
1f8e0 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56  ngIdx = sqlite3V
1f8f0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1f900 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a  OpenEphemeral, .
1f910 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
1f920 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
1f930 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
1f940 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20  Column, .       
1f950 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65     0, (char*)pKe
1f960 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
1f970 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20  O_HANDOFF);..   
1f980 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
1f990 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
1f9a0 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
1f9b0 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
1f9c0 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
1f9d0 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
1f9e0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1f9f0 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
1fa00 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
1fa10 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75  Mem;.      regOu
1fa20 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72  tputRow = ++pPar
1fa30 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1fa40 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
1fa50 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1fa60 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72  abel(v);.      r
1fa70 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72  egReset = ++pPar
1fa80 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1fa90 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
1faa0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1fab0 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  (v);.      iAMem
1fac0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
1fad0 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
1fae0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
1faf0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
1fb00 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
1fb10 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
1fb20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1fb30 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
1fb40 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
1fb50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1fb60 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62  _Integer, 0, iAb
1fb70 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
1fb80 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1fb90 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61  "clear abort fla
1fba0 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
1fbb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1fbc0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
1fbd0 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
1fbe0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1fbf0 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d   "indicate accum
1fc00 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
1fc10 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
1fc20 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
1fc30 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
1fc40 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
1fc50 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
1fc60 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
1fc70 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
1fc80 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
1fc90 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
1fca0 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
1fcb0 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
1fcc0 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
1fcd0 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
1fce0 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
1fcf0 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
1fd00 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
1fd10 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
1fd20 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
1fd30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fd40 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1fd50 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
1fd60 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49  eset);.      pWI
1fd70 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
1fd80 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
1fd90 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
1fda0 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30 29 3b  , &pGroupBy, 0);
1fdb0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
1fdc0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
1fdd0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
1fde0 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
1fdf0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1fe00 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c  optimizer is abl
1fe10 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77  e to deliver row
1fe20 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72  s in group by or
1fe30 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a  der so.        *
1fe40 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  * we do not have
1fe50 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f   to sort.  The O
1fe60 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
1fe70 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20  table will be.  
1fe80 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c        ** cancell
1fe90 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65  ed later because
1fea0 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
1feb0 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e  o use the pKeyIn
1fec0 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  fo.        */.  
1fed0 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d        pGroupBy =
1fee0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
1fef0 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
1ff00 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 0;.      }el
1ff10 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52  se{.        /* R
1ff20 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f  ows are coming o
1ff30 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e  ut in undetermin
1ff40 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61  ed order.  We ha
1ff50 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20  ve to push.     
1ff60 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69     ** each row i
1ff70 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  nto a sorting in
1ff80 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74  dex, terminate t
1ff90 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20  he first loop,. 
1ffa0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c         ** then l
1ffb0 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72  oop over the sor
1ffc0 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72  ting index in or
1ffd0 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f  der to get the o
1ffe0 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a  utput.        **
1fff0 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
20000 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
20010 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
20020 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
20030 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20  Record;.        
20040 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  int nCol;.      
20050 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a    int nGroupBy;.
20060 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
20070 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sort = 1;.      
20080 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72    nGroupBy = pGr
20090 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
200a0 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72        nCol = nGr
200b0 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20  oupBy + 1;.     
200c0 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b     j = nGroupBy+
200d0 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
200e0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
200f0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
20100 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67          if( sAgg
20110 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f  Info.aCol[i].iSo
20120 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
20130 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
20140 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l++;.           
20150 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
20160 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
20170 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71      regBase = sq
20180 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
20190 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b  e(pParse, nCol);
201a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
201b0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
201c0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
201d0 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a  y, regBase, 0);.
201e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
201f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20200 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e  Sequence, sAggIn
20210 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65  fo.sortingIdx,re
20220 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b  gBase+nGroupBy);
20230 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
20240 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20  oupBy+1;.       
20250 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
20260 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
20270 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
20280 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
20290 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e   *pCol = &sAggIn
202a0 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  fo.aCol[i];.    
202b0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
202c0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
202d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
202e0 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67  int r1 = j + reg
202f0 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Base;.          
20300 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20    int r2;..     
20310 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
20320 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
20330 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20  lumn(pParse, .  
20340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20350 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
20360 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69  l->pTab, pCol->i
20370 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54  Column, pCol->iT
20380 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20  able, r1, 0);.  
20390 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31            if( r1
203a0 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20  !=r2 ){.        
203b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
203c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
203d0 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20  opy, r2, r1);.  
203e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
203f0 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
20400 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20410 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65   }.        regRe
20420 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
20430 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
20440 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20450 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
20460 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
20470 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67  gBase, nCol, reg
20480 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
20490 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
204a0 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
204b0 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
204c0 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f  tingIdx, regReco
204d0 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
204e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
204f0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
20500 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
20510 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
20520 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
20530 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  egBase, nCol);. 
20540 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
20550 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
20560 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20570 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20580 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
20590 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
205a0 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
205b0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
205c0 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a  OUP BY sort"));.
205d0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
205e0 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
205f0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
20600 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
20610 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
20620 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74   BY terms and st
20630 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62  ore in b0, b1, b
20640 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62  2....      ** (b
20650 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  0 is memory loca
20660 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31  tion iBMem+0, b1
20670 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64   is iBMem+1, and
20680 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20   so forth).     
20690 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65   ** Then compare
206a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
206b0 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69  UP BY terms agai
206c0 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  nst the GROUP BY
206d0 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20   terms.      ** 
206e0 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
206f0 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  s row currently 
20700 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31  stored in a0, a1
20710 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  , a2....      */
20720 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66  .      addrTopOf
20730 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
20740 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
20750 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
20760 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
20770 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
20780 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
20790 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
207a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
207b0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
207c0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
207d0 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b  dx, j, iBMem+j);
207e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
207f0 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
20800 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  fo.directMode = 
20810 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  1;.          sql
20820 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
20830 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
20840 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d  [j].pExpr, iBMem
20850 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +j);.        }. 
20860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
20870 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
20880 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41  , OP_Compare, iA
20890 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f  Mem, iBMem, pGro
208a0 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  upBy->nExpr,.   
208b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208c0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
208d0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
208e0 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20  FO);.      j1 = 
208f0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
20900 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
20910 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20920 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
20930 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a  1+1, 0, j1+1);..
20940 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
20950 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
20960 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
20970 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
20980 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73        ** Changes
20990 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
209a0 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
209b0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
209c0 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  de.      ** bloc
209d0 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  k.  If there wer
209e0 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68  e no changes, th
209f0 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70  is block is skip
20a00 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ped..      **.  
20a10 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
20a20 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20   copies current 
20a30 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69  group by terms i
20a40 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20  n b0,b1,b2,.... 
20a50 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20       ** over to 
20a60 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68  a0,a1,a2.  It th
20a70 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74  en calls the out
20a80 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  put subroutine. 
20a90 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
20aa0 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ts the aggregate
20ab0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
20ac0 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72  isters in prepar
20ad0 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66  ation.      ** f
20ae0 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55  or the next GROU
20af0 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20  P BY batch..    
20b00 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
20b10 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
20b20 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41  Parse, iBMem, iA
20b30 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
20b40 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
20b50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20b60 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
20b70 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
20b80 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
20b90 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
20ba0 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22  "output one row"
20bb0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
20bc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20bd0 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46  P_IfPos, iAbortF
20be0 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  lag, addrEnd);. 
20bf0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
20c00 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72  ((v, "check abor
20c10 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
20c20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20c30 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
20c40 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
20c50 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
20c60 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73  Comment((v, "res
20c70 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
20c80 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
20c90 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
20ca0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
20cb0 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
20cc0 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
20cd0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
20ce0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
20cf0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
20d00 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20  re(v, j1);.     
20d10 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
20d20 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
20d30 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
20d40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20d50 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
20d60 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
20d70 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
20d80 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61  , "indicate data
20d90 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22   in accumulator"
20da0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  ));..      /* En
20db0 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  d of the loop.  
20dc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
20dd0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
20de0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20df0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20e00 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
20e10 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
20e20 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
20e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20e40 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
20e50 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
20e60 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
20e70 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
20e80 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a  SortingIdx, 1);.
20e90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
20ea0 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
20eb0 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
20ec0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20ed0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20ee0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
20ef0 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
20f00 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
20f10 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
20f20 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c  v, "output final
20f30 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20   row"));..      
20f40 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65  /* Jump over the
20f50 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20   subroutines.   
20f60 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
20f70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20f80 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
20f90 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  rEnd);..      /*
20fa0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
20fb0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
20fc0 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  uts a single row
20fd0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
20fe0 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68       ** set.  Th
20ff0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69  is subroutine fi
21000 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  rst looks at the
21010 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69   iUseFlag.  If i
21020 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a  UseFlag.      **
21030 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
21040 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
21050 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
21060 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20  s a no-op.  If. 
21070 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63       ** the proc
21080 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72  essing calls for
21090 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62   the query to ab
210a0 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75  ort, this subrou
210b0 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tine.      ** in
210c0 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62  crements the iAb
210d0 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c  ortFlag memory l
210e0 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72  ocation before r
210f0 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20  eturning in.    
21100 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69    ** order to si
21110 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20  gnal the caller 
21120 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20  to abort..      
21130 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74  */.      addrSet
21140 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Abort = sqlite3V
21150 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
21160 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21170 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21180 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62  _Integer, 1, iAb
21190 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
211a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
211b0 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22  "set abort flag"
211c0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
211d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
211e0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
211f0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73  putRow);.      s
21200 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
21210 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75  eLabel(v, addrOu
21220 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
21230 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
21240 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
21250 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
21260 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21270 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
21280 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75  iUseFlag, addrOu
21290 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20  tputRow+2);.    
212a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
212b0 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c  , "Groupby resul
212c0 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72  t generator entr
212d0 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20  y point"));.    
212e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
212f0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
21300 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
21310 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41  .      finalizeA
21320 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
21330 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
21340 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e        if( pHavin
21350 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
21360 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
21370 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
21380 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
21390 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
213a0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULL);.      }.  
213b0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
213c0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
213d0 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  ->pEList, 0, 0, 
213e0 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  pOrderBy,.      
213f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21400 64 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  distinct, pDest,
21410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21420 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75         addrOutpu
21430 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41  tRow+1, addrSetA
21440 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  bort);.      sql
21450 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
21460 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
21470 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
21480 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
21490 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72  , "end groupby r
214a0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
214b0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
214c0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
214d0 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
214e0 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
214f0 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
21500 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
21510 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
21520 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74  bel(v, addrReset
21530 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
21540 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
21550 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
21560 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21570 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
21580 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20  rn, regReset);. 
21590 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e      .    } /* en
215a0 64 69 66 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a  dif pGroupBy */.
215b0 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20      else {.     
215c0 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d   ExprList *pMinM
215d0 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  ax = 0;.      Ex
215e0 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30  prList *pDel = 0
215f0 3b 0a 20 20 20 20 20 20 75 38 20 66 6c 61 67 3b  ;.      u8 flag;
21600 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
21610 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
21620 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   of one of the f
21630 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a  ollowing forms:.
21640 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21650 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  *   SELECT min(x
21660 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
21670 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78   **   SELECT max
21680 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
21690 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
216a0 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73  f it is, then as
216b0 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68  k the code in wh
216c0 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74  ere.c to attempt
216d0 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73   to sort results
216e0 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20  .      ** as if 
216f0 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52  there was an "OR
21700 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52  DER ON x" or "OR
21710 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63  DER ON x DESC" c
21720 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 2a 2a  lause. .      **
21730 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61   If where.c is a
21740 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72  ble to produce r
21750 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e  esults sorted in
21760 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65   this order, the
21770 6e 0a 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76  n.      ** add v
21780 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61  dbe code to brea
21790 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f  k out of the pro
217a0 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74  cessing loop aft
217b0 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  er the .      **
217c0 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
217d0 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72 73   (since the firs
217e0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
217f0 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20  he loop is .    
21800 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
21810 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
21820 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d  e row with the m
21830 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75  inimum or maximu
21840 6d 20 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  m .      ** valu
21850 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79  e of x, the only
21860 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a   row required)..
21870 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21880 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67  * A special flag
21890 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20   must be passed 
218a0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
218b0 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74  egin() to slight
218c0 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69  ly.      ** modi
218d0 66 79 20 62 65 68 61 76 69 6f 75 72 20 61 73 20  fy behaviour as 
218e0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a  follows:.      *
218f0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49  *.      **   + I
21900 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61  f the query is a
21910 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22   "SELECT min(x)"
21920 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20  , then the loop 
21930 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 2a  coded by.      *
21940 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68  *     where.c sh
21950 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65  ould not iterate
21960 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73   over any values
21970 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c   with a NULL val
21980 75 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ue.      **     
21990 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 2a 2a 0a  for x..      **.
219a0 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65        **   + The
219b0 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20   optimizer code 
219c0 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20  in where.c (the 
219d0 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64  thing that decid
219e0 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a  es which.      *
219f0 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69  *     index or i
21a00 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20 73  ndices to use) s
21a10 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69  hould place a di
21a20 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79  fferent priority
21a30 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 20 20   on .      **   
21a40 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65    satisfying the
21a50 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75   'ORDER BY' clau
21a60 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20  se than it does 
21a70 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a  in other cases..
21a80 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66        **     Ref
21a90 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63  er to code and c
21aa0 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65  omments in where
21ab0 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  .c for details..
21ac0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
21ad0 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
21ae0 79 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  y(pParse, p);.  
21af0 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a      if( flag ){.
21b00 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70          pDel = p
21b10 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  MinMax = sqlite3
21b20 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
21b30 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
21b40 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20  pExpr->pList);. 
21b50 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d         if( pMinM
21b60 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  ax && !db->mallo
21b70 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
21b80 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
21b90 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66  0].sortOrder = f
21ba0 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag!=WHERE_ORDER
21bb0 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20  BY_MIN;.        
21bc0 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
21bd0 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
21be0 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 7d  OLUMN;.        }
21bf0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
21c00 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e  /* This case run
21c10 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61  s if the aggrega
21c20 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20  te has no GROUP 
21c30 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
21c40 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
21c50 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70  ing is much simp
21c60 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20  ler since there 
21c70 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
21c80 20 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66   row.      ** of
21c90 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a   output..      *
21ca0 2f 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  /.      resetAcc
21cb0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
21cc0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
21cd0 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
21ce0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
21cf0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
21d00 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61 78  pWhere, &pMinMax
21d10 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20 20 20 69  , flag);.      i
21d20 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a  f( pWInfo==0 ){.
21d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
21d40 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
21d50 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20  , pDel);.       
21d60 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
21d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21d80 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
21d90 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
21da0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
21db0 21 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c 61 67  !pMinMax && flag
21dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
21dd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21de0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49   OP_Goto, 0, pWI
21df0 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20 20  nfo->iBreak);.  
21e00 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
21e10 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69  t((v, "%s() by i
21e20 6e 64 65 78 22 2c 28 66 6c 61 67 3d 3d 57 48 45  ndex",(flag==WHE
21e30 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22  RE_ORDERBY_MIN?"
21e40 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20  min":"max")));. 
21e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
21e60 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
21e70 6e 66 6f 29 3b 0a 20 20 20 20 20 20 66 69 6e 61  nfo);.      fina
21e80 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
21e90 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
21ea0 66 6f 29 3b 0a 20 20 20 20 20 20 70 4f 72 64 65  fo);.      pOrde
21eb0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rBy = 0;.      i
21ec0 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
21ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21ee0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
21ef0 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e   pHaving, addrEn
21f00 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  d, SQLITE_JUMPIF
21f10 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
21f20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
21f30 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
21f40 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
21f50 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20   0, -1, .       
21f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21f70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61  Dest, addrEnd, a
21f80 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ddrEnd);..      
21f90 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
21fa0 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b  elete(db, pDel);
21fb0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
21fc0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
21fd0 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  el(v, addrEnd);.
21fe0 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69      .  } /* endi
21ff0 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  f aggregate quer
22000 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  y */..  /* If th
22010 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
22020 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
22030 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
22040 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
22050 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
22060 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
22070 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
22080 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
22090 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  {.    generateSo
220a0 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
220b0 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  , v, pEList->nEx
220c0 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a  pr, pDest);.  }.
220d0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
220e0 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65  to skip this que
220f0 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
22100 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
22110 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f  l(v, iEnd);..  /
22120 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73  * The SELECT was
22130 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
22140 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72  ded.   Set the r
22150 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a  eturn code to 0.
22160 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
22170 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f   no errors..  */
22180 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  .  rc = 0;..  /*
22190 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74   Control jumps t
221a0 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72  o here if an err
221b0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
221c0 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e  d above, or upon
221d0 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
221e0 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53   coding of the S
221f0 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65  ELECT..  */.sele
22200 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64  ct_end:..  /* Id
22210 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
22220 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f  mes if results o
22230 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  f the SELECT are
22240 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20   to be output.. 
22250 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
22260 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
22270 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
22280 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
22290 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
222a0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
222b0 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
222c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
222d0 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
222e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
222f0 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
22300 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e  aFunc);.  return
22310 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69   rc;.}..#if defi
22320 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
22330 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  )./*.***********
22340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22380 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ****.** The foll
22390 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20 75 73  owing code is us
223a0 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
223b0 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
223c0 79 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20  y.  The code.** 
223d0 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65  that follows doe
223e0 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20  s not appear in 
223f0 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a  normal builds..*
22400 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
22410 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
22420 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20 63 6f  print out the co
22430 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20  ntent of all or 
22440 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61  part of a .** pa
22450 72 73 65 20 73 74 72 75 63 74 75 72 65 73 20 73  rse structures s
22460 75 63 68 20 61 73 20 53 65 6c 65 63 74 20 6f 72  uch as Select or
22470 20 45 78 70 72 2e 20 20 53 75 63 68 20 70 72 69   Expr.  Such pri
22480 6e 74 6f 75 74 73 20 61 72 65 20 75 73 65 66 75  ntouts are usefu
22490 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67  l.** for helping
224a0 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 77   to understand w
224b0 68 61 74 20 69 73 20 68 61 70 70 65 6e 69 6e 67  hat is happening
224c0 20 69 6e 73 69 64 65 20 74 68 65 20 63 6f 64 65   inside the code
224d0 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75   generator.** du
224e0 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 69  ring the executi
224f0 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45  on of complex SE
22500 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
22510 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
22520 74 69 6e 65 20 61 72 65 20 6e 6f 74 20 63 61 6c  tine are not cal
22530 6c 65 64 20 61 6e 79 77 68 65 72 65 20 66 72 6f  led anywhere fro
22540 6d 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 72  m within the nor
22550 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65  mal.** code base
22560 2e 20 20 54 68 65 6e 20 61 72 65 20 69 6e 74 65  .  Then are inte
22570 6e 64 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  nded to be calle
22580 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  d from within th
22590 65 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72  e debugger.** or
225a0 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20   from temporary 
225b0 22 70 72 69 6e 74 66 22 20 73 74 61 74 65 6d 65  "printf" stateme
225c0 6e 74 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72  nts inserted for
225d0 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76   debugging..*/.v
225e0 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
225f0 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20  Expr(Expr *p){. 
22600 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20   if( p->token.z 
22610 26 26 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20  && p->token.n>0 
22620 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
22630 62 75 67 50 72 69 6e 74 66 28 22 28 25 2e 2a 73  bugPrintf("(%.*s
22640 22 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70  ", p->token.n, p
22650 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65  ->token.z);.  }e
22660 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
22670 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25 64  DebugPrintf("(%d
22680 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20  ", p->op);.  }. 
22690 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b   if( p->pLeft ){
226a0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
226b0 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20  gPrintf(" ");.  
226c0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
226d0 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pr(p->pLeft);.  
226e0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68  }.  if( p->pRigh
226f0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
22700 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29  DebugPrintf(" ")
22710 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
22720 6e 74 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  ntExpr(p->pRight
22730 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
22740 44 65 62 75 67 50 72 69 6e 74 66 28 22 29 22 29  DebugPrintf(")")
22750 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
22760 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 45 78  PrintExprList(Ex
22770 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
22780 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
22790 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
227a0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  pr; i++){.    sq
227b0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
227c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
227d0 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 4c 69  );.    if( i<pLi
227e0 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20  st->nExpr-1 ){. 
227f0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
22800 67 50 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20  gPrintf(", ");. 
22810 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20     }.  }.}.void 
22820 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65  sqlite3PrintSele
22830 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  ct(Select *p, in
22840 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c  t indent){.  sql
22850 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22860 22 25 2a 73 53 45 4c 45 43 54 28 25 70 29 20 22  "%*sSELECT(%p) "
22870 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29  , indent, "", p)
22880 3b 0a 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74  ;.  sqlite3Print
22890 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
228a0 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  st);.  sqlite3De
228b0 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
228c0 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29  .  if( p->pSrc )
228d0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65  {.    char *zPre
228e0 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  fix;.    int i;.
228f0 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 46      zPrefix = "F
22900 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ROM";.    for(i=
22910 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  0; i<p->pSrc->nS
22920 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
22930 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22940 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
22950 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  >pSrc->a[i];.   
22960 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
22970 72 69 6e 74 66 28 22 25 2a 73 20 22 2c 20 69 6e  rintf("%*s ", in
22980 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78 29  dent+6, zPrefix)
22990 3b 0a 20 20 20 20 20 20 7a 50 72 65 66 69 78 20  ;.      zPrefix 
229a0 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20  = "";.      if( 
229b0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
229c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
229d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 5c  3DebugPrintf("(\
229e0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n");.        sql
229f0 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28  ite3PrintSelect(
22a00 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
22a10 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20  indent+10);.    
22a20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
22a30 50 72 69 6e 74 66 28 22 25 2a 73 29 22 2c 20 69  Printf("%*s)", i
22a40 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20  ndent+8, "");.  
22a50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49      }else if( pI
22a60 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  tem->zName ){.  
22a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
22a80 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20 70  ugPrintf("%s", p
22a90 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
22aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22ab0 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20  pItem->pTab ){. 
22ac0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
22ad0 62 75 67 50 72 69 6e 74 66 28 22 28 74 61 62 6c  bugPrintf("(tabl
22ae0 65 3a 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e  e: %s)", pItem->
22af0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
22b00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22b10 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
22b20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22b30 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 41 53  DebugPrintf(" AS
22b40 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c   %s", pItem->zAl
22b50 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ias);.      }.  
22b60 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70 53 72      if( i<p->pSr
22b70 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20  c->nSrc-1 ){.   
22b80 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
22b90 67 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20  gPrintf(",");.  
22ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
22bb0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
22bc0 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  \n");.    }.  }.
22bd0 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
22be0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
22bf0 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 57  bugPrintf("%*s W
22c00 48 45 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20  HERE ", indent, 
22c10 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "");.    sqlite3
22c20 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 57 68  PrintExpr(p->pWh
22c30 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
22c40 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
22c50 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ");.  }.  if( p-
22c60 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
22c70 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
22c80 6e 74 66 28 22 25 2a 73 20 47 52 4f 55 50 20 42  ntf("%*s GROUP B
22c90 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  Y ", indent, "")
22ca0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
22cb0 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47  ntExprList(p->pG
22cc0 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c  roupBy);.    sql
22cd0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22ce0 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  "\n");.  }.  if(
22cf0 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20   p->pHaving ){. 
22d00 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
22d10 72 69 6e 74 66 28 22 25 2a 73 20 48 41 56 49 4e  rintf("%*s HAVIN
22d20 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  G ", indent, "")
22d30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
22d40 6e 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  ntExpr(p->pHavin
22d50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
22d60 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
22d70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
22d80 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
22d90 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
22da0 66 28 22 25 2a 73 20 4f 52 44 45 52 20 42 59 20  f("%*s ORDER BY 
22db0 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
22dc0 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
22dd0 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
22de0 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  erBy);.    sqlit
22df0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
22e00 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e  n");.  }.}./* En
22e10 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  d of the structu
22e20 72 65 20 64 65 62 75 67 20 70 72 69 6e 74 69 6e  re debug printin
22e30 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g code.*********
22e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22e80 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ****/.#endif /* 
22e90 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
22ea0 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
22eb0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 2a 2f  SQLITE_DEBUG) */
22ec0 0a                                               .