/ Hex Artifact Content
Login

Artifact 18c296d45cc8cad8dc4b862d2df000a4681d7883:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 35 31 39  select.c,v 1.519
0200: 20 32 30 30 39 2f 30 35 2f 32 37 20 31 30 3a 33   2009/05/27 10:3
0210: 31 3a 32 39 20 64 72 68 20 45 78 70 20 24 0a 2a  1:29 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0250: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0260: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 62 75  ect structure bu
0270: 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c 6f 63  t do not dealloc
0280: 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63  ate.** the selec
0290: 74 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  t structure itse
02a0: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lf..*/.static vo
02b0: 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74 28 73  id clearSelect(s
02c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
02d0: 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  ct *p){.  sqlite
02e0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
02f0: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
0300: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
0310: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
0320: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  rc);.  sqlite3Ex
0330: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
0340: 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  pWhere);.  sqlit
0350: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0360: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
0370: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
0380: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0390: 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  aving);.  sqlite
03a0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
03b0: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
03c0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
03d0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
03e0: 50 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65  Prior);.  sqlite
03f0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
0400: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71  p->pLimit);.  sq
0410: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0420: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
0440: 6c 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73  lize a SelectDes
0450: 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  t structure..*/.
0460: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
0470: 63 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63  ctDestInit(Selec
0480: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e  tDest *pDest, in
0490: 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61  t eDest, int iPa
04a0: 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44  rm){.  pDest->eD
04b0: 65 73 74 20 3d 20 28 75 38 29 65 44 65 73 74 3b  est = (u8)eDest;
04c0: 0a 20 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  .  pDest->iParm 
04d0: 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74  = iParm;.  pDest
04e0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 30 3b 0a  ->affinity = 0;.
04f0: 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20    pDest->iMem = 
0500: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  0;.  pDest->nMem
0510: 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 0;.}.../*.** 
0520: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53  Allocate a new S
0530: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0540: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
0550: 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20  nter to that.** 
0560: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65  structure..*/.Se
0570: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
0580: 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65 20  ectNew(.  Parse 
0590: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
05a0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
05b0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
05c0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a   *pEList,     /*
05d0: 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 74   which columns t
05e0: 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65  o include in the
05f0: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72 63   result */.  Src
0600: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
0610: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
0620: 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20 74  lause -- which t
0630: 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f  ables to scan */
0640: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
0660: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
0670: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
0680: 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 47  upBy,   /* the G
0690: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
06a0: 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
06b0: 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  g,        /* the
06c0: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 2a   HAVING clause *
06d0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
06e0: 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68 65  rderBy,   /* the
06f0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
0700: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74   */.  int isDist
0710: 69 6e 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 74  inct,       /* t
0720: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
0730: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
0740: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  resent */.  Expr
0750: 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20   *pLimit,       
0760: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0770: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f  .  NULL means no
0780: 74 20 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72  t used */.  Expr
0790: 20 2a 70 4f 66 66 73 65 74 20 20 20 20 20 20 20   *pOffset       
07a0: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
07b0: 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e  e.  NULL means n
07c0: 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  o offset */.){. 
07d0: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
07e0: 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b   Select standin;
07f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0800: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
0810: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
0820: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
0830: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
0840: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
0850: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 21 70 4f  locFailed || !pO
0860: 66 66 73 65 74 20 7c 7c 20 70 4c 69 6d 69 74 20  ffset || pLimit 
0870: 29 3b 20 2f 2a 20 4f 46 46 53 45 54 20 69 6d 70  ); /* OFFSET imp
0880: 6c 69 65 73 20 4c 49 4d 49 54 20 2a 2f 0a 20 20  lies LIMIT */.  
0890: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
08a0: 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64     pNew = &stand
08b0: 69 6e 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  in;.    memset(p
08c0: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  New, 0, sizeof(*
08d0: 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20 69 66  pNew));.  }.  if
08e0: 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  ( pEList==0 ){. 
08f0: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
0900: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
0910: 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c  d(pParse, 0, sql
0920: 69 74 65 33 45 78 70 72 28 64 62 2c 54 4b 5f 41  ite3Expr(db,TK_A
0930: 4c 4c 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e  LL,0));.  }.  pN
0940: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  ew->pEList = pEL
0950: 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  ist;.  pNew->pSr
0960: 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e 65 77  c = pSrc;.  pNew
0970: 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
0980: 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  e;.  pNew->pGrou
0990: 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
09a0: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
09b0: 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65  = pHaving;.  pNe
09c0: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  w->pOrderBy = pO
09d0: 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  rderBy;.  pNew->
09e0: 73 65 6c 46 6c 61 67 73 20 3d 20 69 73 44 69 73  selFlags = isDis
09f0: 74 69 6e 63 74 20 3f 20 53 46 5f 44 69 73 74 69  tinct ? SF_Disti
0a00: 6e 63 74 20 3a 20 30 3b 0a 20 20 70 4e 65 77 2d  nct : 0;.  pNew-
0a10: 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
0a20: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
0a30: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77  = pLimit;.  pNew
0a40: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
0a50: 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  set;.  assert( p
0a60: 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69  Offset==0 || pLi
0a70: 6d 69 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77  mit!=0 );.  pNew
0a80: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
0a90: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
0aa0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
0ab0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
0ac0: 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
0ad0: 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
0ae0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
0af0: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64     clearSelect(d
0b00: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66  b, pNew);.    if
0b10: 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  ( pNew!=&standin
0b20: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
0b30: 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (db, pNew);.    
0b40: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pNew = 0;.  }.  
0b50: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
0b60: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
0b70: 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74   given Select st
0b80: 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20  ructure and all 
0b90: 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63 74  of its substruct
0ba0: 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ures..*/.void sq
0bb0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
0bc0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  e(sqlite3 *db, S
0bd0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28  elect *p){.  if(
0be0: 20 70 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 53   p ){.    clearS
0bf0: 65 6c 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20  elect(db, p);.  
0c00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
0c10: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  db, p);.  }.}../
0c20: 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20  *.** Given 1 to 
0c30: 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70 72  3 identifiers pr
0c40: 65 63 65 65 64 69 6e 67 20 74 68 65 20 4a 4f 49  eceeding the JOI
0c50: 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72  N keyword, deter
0c60: 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65  mine the.** type
0c70: 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72   of join.  Retur
0c80: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  n an integer con
0c90: 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65  stant that expre
0ca0: 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a  sses that type.*
0cb0: 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  * in terms of th
0cc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20  e following bit 
0cd0: 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  values:.**.**   
0ce0: 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20    JT_INNER.**   
0cf0: 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20    JT_CROSS.**   
0d00: 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20    JT_OUTER.**   
0d10: 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20    JT_NATURAL.** 
0d20: 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20      JT_LEFT.**  
0d30: 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a     JT_RIGHT.**.*
0d40: 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a  * A full outer j
0d50: 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69  oin is the combi
0d60: 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46  nation of JT_LEF
0d70: 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a  T and JT_RIGHT..
0d80: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65  **.** If an ille
0d90: 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  gal or unsupport
0da0: 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20  ed join type is 
0db0: 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c  seen, then still
0dc0: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69   return.** a joi
0dd0: 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20  n type, but put 
0de0: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
0df0: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0e00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0e10: 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a  JoinType(Parse *
0e20: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
0e30: 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f  A, Token *pB, To
0e40: 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20  ken *pC){.  int 
0e50: 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
0e60: 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b  Token *apAll[3];
0e70: 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20  .  Token *p;.   
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 30            /*   0
0ea0: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
0eb0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
0ec0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0ed0: 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65 78  nst char zKeyTex
0ee0: 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65 66  t[] = "naturalef
0ef0: 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69 6e  touterightfullin
0f00: 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74 61  nercross";.  sta
0f10: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
0f20: 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20 20   {.    u8 i;    
0f30: 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
0f40: 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78 74   of keyword text
0f50: 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20 2a   in zKeyText[] *
0f60: 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b 20  /.    u8 nChar; 
0f70: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
0f80: 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20 63  the keyword in c
0f90: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 20  haracters */.   
0fa0: 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f 2a   u8 code;     /*
0fb0: 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b 20   Join type mask 
0fc0: 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64 5b  */.  } aKeyword[
0fd0: 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61 74  ] = {.    /* nat
0fe0: 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37 2c  ural */ { 0,  7,
0ff0: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20 20   JT_NATURAL     
1000: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1010: 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f 20    /* left    */ 
1020: 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46 54  { 6,  4, JT_LEFT
1030: 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20  |JT_OUTER       
1040: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75 74     },.    /* out
1050: 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35 2c  er   */ { 10, 5,
1060: 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20   JT_OUTER       
1070: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1080: 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f 20    /* right   */ 
1090: 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47 48  { 14, 5, JT_RIGH
10a0: 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  T|JT_OUTER      
10b0: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75 6c     },.    /* ful
10c0: 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34 2c  l    */ { 19, 4,
10d0: 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48   JT_LEFT|JT_RIGH
10e0: 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  T|JT_OUTER },.  
10f0: 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f 20    /* inner   */ 
1100: 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45  { 23, 5, JT_INNE
1110: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1120: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72 6f     },.    /* cro
1130: 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35 2c  ss   */ { 28, 5,
1140: 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f   JT_INNER|JT_CRO
1150: 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  SS         },.  
1160: 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  };.  int i, j;. 
1170: 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a   apAll[0] = pA;.
1180: 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b    apAll[1] = pB;
1190: 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43  .  apAll[2] = pC
11a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33  ;.  for(i=0; i<3
11b0: 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b   && apAll[i]; i+
11c0: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c  +){.    p = apAl
11d0: 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  l[i];.    for(j=
11e0: 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 61  0; j<ArraySize(a
11f0: 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b 0a  Keyword); j++){.
1200: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d        if( p->n==
1210: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68 61  aKeyword[j].nCha
1220: 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  r .          && 
1230: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
1240: 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a 4b  (char*)p->z, &zK
1250: 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64 5b  eyText[aKeyword[
1260: 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30 20  j].i], p->n)==0 
1270: 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74  ){.        joint
1280: 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64 5b  ype |= aKeyword[
1290: 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20  j].code;.       
12a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
12b0: 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
12c0: 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d 31  se( j==0 || j==1
12d0: 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d 33   || j==2 || j==3
12e0: 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d 35   || j==4 || j==5
12f0: 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20 20   || j==6 );.    
1300: 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a 65  if( j>=ArraySize
1310: 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20 20  (aKeyword) ){.  
1320: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1330: 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  JT_ERROR;.      
1340: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1350: 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69  .  if(.     (joi
1360: 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45  ntype & (JT_INNE
1370: 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a  R|JT_OUTER))==(J
1380: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
1390: 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74  ) ||.     (joint
13a0: 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21  ype & JT_ERROR)!
13b0: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73  =0.  ){.    cons
13c0: 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22 20  t char *zSp = " 
13d0: 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ";.    assert( p
13e0: 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  B!=0 );.    if( 
13f0: 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20  pC==0 ){ zSp++; 
1400: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
1410: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1420: 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70  nknown or unsupp
1430: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a  orted join type:
1440: 20 22 0a 20 20 20 20 20 20 20 22 25 54 20 25 54   ".       "%T %T
1450: 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a  %s%T", pA, pB, z
1460: 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69  Sp, pC);.    joi
1470: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
1480: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6a  ;.  }else if( (j
1490: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
14a0: 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  ER)!=0 .        
14b0: 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26 20   && (jointype & 
14c0: 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48  (JT_LEFT|JT_RIGH
14d0: 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b 0a  T))!=JT_LEFT ){.
14e0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14f0: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
1500: 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46 55     "RIGHT and FU
1510: 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61  LL OUTER JOINs a
1520: 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  re not currently
1530: 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20   supported");.  
1540: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
1550: 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  INNER;.  }.  ret
1560: 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a  urn jointype;.}.
1570: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1580: 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c  e index of a col
1590: 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20  umn in a table. 
15a0: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68   Return -1 if th
15b0: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e  e column.** is n
15c0: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
15d0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
15e0: 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49  atic int columnI
15f0: 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62  ndex(Table *pTab
1600: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  , const char *zC
1610: 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ol){.  int i;.  
1620: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
1630: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
1640: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1650: 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  Cmp(pTab->aCol[i
1660: 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ].zName, zCol)==
1670: 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
1680: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
1690: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
16a0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  n expression nod
16b0: 65 20 66 6f 72 20 61 6e 20 69 64 65 6e 74 69 66  e for an identif
16c0: 69 65 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ier with the nam
16d0: 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a 45 78  e of zName.*/.Ex
16e0: 70 72 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74  pr *sqlite3Creat
16f0: 65 49 64 45 78 70 72 28 50 61 72 73 65 20 2a 70  eIdExpr(Parse *p
1700: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
1710: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 72 65 74  r *zName){.  ret
1720: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28  urn sqlite3Expr(
1730: 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49  pParse->db, TK_I
1740: 44 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  D, zName);.}../*
1750: 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74  .** Add a term t
1760: 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70 72  o the WHERE expr
1770: 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70  ession in *ppExp
1780: 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  r that requires 
1790: 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75  the.** zCol colu
17a0: 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69  mn to be equal i
17b0: 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  n the two tables
17c0: 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62 32   pTab1 and pTab2
17d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17e0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20   addWhereTerm(. 
17f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1810: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1820: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1830: 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ol,        /* Na
1840: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
1850: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c   */.  const Tabl
1860: 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f  e *pTab1,      /
1870: 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f  * First table */
1880: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1890: 41 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a 20 41  Alias1,     /* A
18a0: 6c 69 61 73 20 66 6f 72 20 66 69 72 73 74 20 74  lias for first t
18b0: 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  able.  May be NU
18c0: 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61  LL */.  const Ta
18d0: 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20  ble *pTab2,     
18e0: 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65   /* Second table
18f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1900: 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20 20 2f   *zAlias2,     /
1910: 2a 20 41 6c 69 61 73 20 66 6f 72 20 73 65 63 6f  * Alias for seco
1920: 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62  nd table.  May b
1930: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
1940: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 2c  iRightJoinTable,
1950: 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
1960: 73 6f 72 20 66 6f 72 20 74 68 65 20 72 69 67 68  sor for the righ
1970: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  t table */.  Exp
1980: 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20  r **ppExpr,     
1990: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
19a0: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74   equality term t
19b0: 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  o this expressio
19c0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74  n */.  int isOut
19d0: 65 72 4a 6f 69 6e 20 20 20 20 20 20 20 20 20 20  erJoin          
19e0: 2f 2a 20 54 72 75 65 20 69 66 20 64 65 61 6c 69  /* True if deali
19f0: 6e 67 20 77 69 74 68 20 61 6e 20 4f 55 54 45 52  ng with an OUTER
1a00: 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78   join */.){.  Ex
1a10: 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c  pr *pE1a, *pE1b,
1a20: 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a   *pE1c;.  Expr *
1a30: 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45  pE2a, *pE2b, *pE
1a40: 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a  2c;.  Expr *pE;.
1a50: 0a 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65  .  pE1a = sqlite
1a60: 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50  3CreateIdExpr(pP
1a70: 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70  arse, zCol);.  p
1a80: 45 32 61 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E2a = sqlite3Cre
1a90: 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65  ateIdExpr(pParse
1aa0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 7a  , zCol);.  if( z
1ab0: 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20 20  Alias1==0 ){.   
1ac0: 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61 62 31   zAlias1 = pTab1
1ad0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70  ->zName;.  }.  p
1ae0: 45 31 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E1b = sqlite3Cre
1af0: 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65  ateIdExpr(pParse
1b00: 2c 20 7a 41 6c 69 61 73 31 29 3b 0a 20 20 69 66  , zAlias1);.  if
1b10: 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29 7b 0a  ( zAlias2==0 ){.
1b20: 20 20 20 20 7a 41 6c 69 61 73 32 20 3d 20 70 54      zAlias2 = pT
1b30: 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  ab2->zName;.  }.
1b40: 20 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65 33    pE2b = sqlite3
1b50: 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61  CreateIdExpr(pPa
1b60: 72 73 65 2c 20 7a 41 6c 69 61 73 32 29 3b 0a 20  rse, zAlias2);. 
1b70: 20 70 45 31 63 20 3d 20 73 71 6c 69 74 65 33 50   pE1c = sqlite3P
1b80: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1b90: 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61 2c  DOT, pE1b, pE1a,
1ba0: 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73 71   0);.  pE2c = sq
1bb0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1bc0: 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c  e, TK_DOT, pE2b,
1bd0: 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20   pE2a, 0);.  pE 
1be0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1bf0: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
1c00: 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20  1c, pE2c, 0);.  
1c10: 69 66 28 20 70 45 20 26 26 20 69 73 4f 75 74 65  if( pE && isOute
1c20: 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70  rJoin ){.    Exp
1c30: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 2c  rSetProperty(pE,
1c40: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
1c50: 20 20 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69     pE->iRightJoi
1c60: 6e 54 61 62 6c 65 20 3d 20 69 52 69 67 68 74 4a  nTable = iRightJ
1c70: 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  oinTable;.  }.  
1c80: 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  *ppExpr = sqlite
1c90: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
1ca0: 3e 64 62 2c 2a 70 70 45 78 70 72 2c 20 70 45 29  >db,*ppExpr, pE)
1cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1cc0: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
1cd0: 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74  roperty on all t
1ce0: 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65  erms of the give
1cf0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
1d00: 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70   And set the Exp
1d10: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
1d20: 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20  e to iTable for 
1d30: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
1d40: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  e.** expression.
1d50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72  .**.** The EP_Fr
1d60: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1d70: 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73  is used on terms
1d80: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
1d90: 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65  n to tell.** the
1da0: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1db0: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
1dc0: 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d  c that this term
1dd0: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   is part of the.
1de0: 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74  ** join restrict
1df0: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
1e00: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
1e10: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20   clause and not 
1e20: 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  a part.** of the
1e30: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48   more general WH
1e40: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
1e50: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76  se terms are mov
1e60: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a  ed over to the.*
1e70: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  * WHERE clause d
1e80: 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65  uring join proce
1e90: 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65  ssing but we nee
1ea0: 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
1eb0: 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69  at they.** origi
1ec0: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
1ed0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
1ee0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e  .**.** The Expr.
1ef0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1f00: 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20  tells the WHERE 
1f10: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
1f20: 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78  g that the.** ex
1f30: 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73  pression depends
1f40: 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74   on table iRight
1f50: 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69  JoinTable even i
1f60: 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20  f that table is 
1f70: 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c  not.** explicitl
1f80: 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  y mentioned in t
1f90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
1fa0: 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  That information
1fb0: 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f   is needed.** fo
1fc0: 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  r cases like thi
1fd0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
1fe0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
1ff0: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
2000: 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d  a=t2.b AND t1.x=
2010: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72  5.**.** The wher
2020: 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74  e clause needs t
2030: 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  o defer the hand
2040: 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78  ling of the t1.x
2050: 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c  =5.** term until
2060: 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f   after the t2 lo
2070: 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  op of the join. 
2080: 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a   In that way, a.
2090: 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77  ** NULL t2 row w
20a0: 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
20b0: 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35  whenever t1.x!=5
20c0: 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a  .  If we do not.
20d0: 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  ** defer the han
20e0: 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c  dling of t1.x=5,
20f0: 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63   it will be proc
2100: 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  essed immediatel
2110: 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74  y.** after the t
2120: 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20  1 loop and rows 
2130: 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c  with t1.x!=5 wil
2140: 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69  l never appear i
2150: 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c  n.** the output,
2160: 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72   which is incorr
2170: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
2180: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
2190: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61  Expr *p, int iTa
21a0: 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ble){.  while( p
21b0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
21c0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
21d0: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d 3e  omJoin);.    p->
21e0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
21f0: 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65  = iTable;.    se
2200: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
2210: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
2220: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
2230: 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68    } .}../*.** Th
2240: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
2250: 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e  sses the join in
2260: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
2270: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2280: 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e  ..** ON and USIN
2290: 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f  G clauses are co
22a0: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74  nverted into ext
22b0: 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ra terms of the 
22c0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
22d0: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61   NATURAL joins a
22e0: 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61  lso create extra
22f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
2300: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  rms..**.** The t
2310: 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63  erms of a FROM c
2320: 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69  lause are contai
2330: 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63  ned in the Selec
2340: 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65  t.pSrc structure
2350: 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f  ..** The left mo
2360: 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  st table is the 
2370: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53  first entry in S
2380: 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65  elect.pSrc.  The
2390: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74   right-most.** t
23a0: 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74  able is the last
23b0: 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69   entry.  The joi
23c0: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65  n operator is he
23d0: 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ld in the entry 
23e0: 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20  to.** the left. 
23f0: 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f   Thus entry 0 co
2400: 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20  ntains the join 
2410: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  operator for the
2420: 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a   join between.**
2430: 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31   entries 0 and 1
2440: 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49  .  Any ON or USI
2450: 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63  NG clauses assoc
2460: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a  iated with the j
2470: 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20  oin are.** also 
2480: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
2490: 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  left entry..**.*
24a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
24b0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
24c0: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
24d0: 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  untered..*/.stat
24e0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f  ic int sqlitePro
24f0: 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a  cessJoin(Parse *
2500: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2510: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
2520: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
2530: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62        /* All tab
2540: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
2550: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
2560: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
2570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2580: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
2590: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
25a0: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20  _item *pLeft;   
25b0: 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20    /* Left table 
25c0: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
25d0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
25e0: 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20  _item *pRight;  
25f0: 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65    /* Right table
2600: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
2610: 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ..  pSrc = p->pS
2620: 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70  rc;.  pLeft = &p
2630: 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69  Src->a[0];.  pRi
2640: 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b  ght = &pLeft[1];
2650: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
2660: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c  rc->nSrc-1; i++,
2670: 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74   pRight++, pLeft
2680: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
2690: 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74  pLeftTab = pLeft
26a0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c  ->pTab;.    Tabl
26b0: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
26c0: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20  Right->pTab;.   
26d0: 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20   int isOuter;.. 
26e0: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65     if( NEVER(pLe
26f0: 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67  ftTab==0 || pRig
2700: 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74  htTab==0) ) cont
2710: 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65  inue;.    isOute
2720: 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 6a 6f 69  r = (pRight->joi
2730: 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
2740: 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  )!=0;..    /* Wh
2750: 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  en the NATURAL k
2760: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
2770: 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61  t, add WHERE cla
2780: 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20  use terms for.  
2790: 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d    ** every colum
27a0: 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74  n that the two t
27b0: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f  ables have in co
27c0: 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mmon..    */.   
27d0: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69   if( pRight->joi
27e0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
27f0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AL ){.      if( 
2800: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70  pRight->pOn || p
2810: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
2820: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2830: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2840: 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e   "a NATURAL join
2850: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a   may not have ".
2860: 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f             "an O
2870: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2880: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  e", 0);.        
2890: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
28a0: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
28b0: 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f   j<pLeftTab->nCo
28c0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
28d0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
28e0: 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  LeftTab->aCol[j]
28f0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
2900: 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  if( columnIndex(
2910: 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65  pRightTab, zName
2920: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
2930: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
2940: 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c  Parse, zName, pL
2950: 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a  eftTab, pLeft->z
2960: 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20  Alias, .        
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c        pRightTab,
2990: 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c   pRight->zAlias,
29a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
29c0: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20  Right->iCursor, 
29d0: 26 70 2d 3e 70 57 68 65 72 65 2c 20 69 73 4f 75  &p->pWhere, isOu
29e0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
29f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a00: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2a10: 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f   Disallow both O
2a20: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
2a30: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
2a40: 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  join.    */.    
2a50: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
2a60: 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e  && pRight->pUsin
2a70: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
2a80: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2a90: 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20  e, "cannot have 
2aa0: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
2ab0: 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61  G ".        "cla
2ac0: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
2ad0: 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72   join");.      r
2ae0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
2af0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f      /* Add the O
2b00: 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  N clause to the 
2b10: 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
2b20: 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74   clause, connect
2b30: 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20  ed by.    ** an 
2b40: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  AND operator..  
2b50: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
2b60: 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20  ght->pOn ){.    
2b70: 20 20 69 66 28 20 69 73 4f 75 74 65 72 20 29 20    if( isOuter ) 
2b80: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67  setJoinExpr(pRig
2b90: 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d  ht->pOn, pRight-
2ba0: 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2bb0: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c   p->pWhere = sql
2bc0: 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
2bd0: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72  se->db, p->pWher
2be0: 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b  e, pRight->pOn);
2bf0: 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70  .      pRight->p
2c00: 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  On = 0;.    }.. 
2c10: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74     /* Create ext
2c20: 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  ra terms on the 
2c30: 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72  WHERE clause for
2c40: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d   each column nam
2c50: 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ed.    ** in the
2c60: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20   USING clause.  
2c70: 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20  Example: If the 
2c80: 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65  two tables to be
2c90: 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20   joined are .   
2ca0: 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20   ** A and B and 
2cb0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
2cc0: 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64   names X, Y, and
2cd0: 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69   Z, then add thi
2ce0: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  s.    ** to the 
2cf0: 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20  WHERE clause:   
2d00: 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59   A.X=B.X AND A.Y
2d10: 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a  =B.Y AND A.Z=B.Z
2d20: 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61  .    ** Report a
2d30: 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63  n error if any c
2d40: 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20  olumn mentioned 
2d50: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
2d60: 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  use is.    ** no
2d70: 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62  t contained in b
2d80: 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65  oth tables to be
2d90: 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a   joined..    */.
2da0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
2db0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2dc0: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  IdList *pList = 
2dd0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a  pRight->pUsing;.
2de0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2df0: 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b  <pList->nId; j++
2e00: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
2e10: 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e  *zName = pList->
2e20: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
2e30: 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e      if( columnIn
2e40: 64 65 78 28 70 4c 65 66 74 54 61 62 2c 20 7a 4e  dex(pLeftTab, zN
2e50: 61 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e  ame)<0 || column
2e60: 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c  Index(pRightTab,
2e70: 20 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20   zName)<0 ){.   
2e80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2e90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2ea0: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
2eb0: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
2ec0: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
2ed0: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
2ee0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
2ef0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
2f00: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2f10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2f20: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
2f30: 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65 66 74  se, zName, pLeft
2f40: 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69  Tab, pLeft->zAli
2f50: 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  as, .           
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f70: 20 70 52 69 67 68 74 54 61 62 2c 20 70 52 69 67   pRightTab, pRig
2f80: 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20  ht->zAlias,.    
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
2fb0: 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68  iCursor, &p->pWh
2fc0: 65 72 65 2c 20 69 73 4f 75 74 65 72 29 3b 0a 20  ere, isOuter);. 
2fd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2fe0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2ff0: 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64  /*.** Insert cod
3000: 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74 20  e into "v" that 
3010: 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65  will push the re
3020: 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f 70 20  cord on the top 
3030: 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  of the.** stack 
3040: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e  into the sorter.
3050: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3060: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
3070: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3080: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
3090: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
30a0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
30b0: 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  By,    /* The OR
30c0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
30d0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
30e0: 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct,       /* The
30f0: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
3100: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
3110: 20 72 65 67 44 61 74 61 20 20 20 20 20 20 20 20   regData        
3120: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
3130: 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20  holding data to 
3140: 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29 7b 0a  be sorted */.){.
3150: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
3160: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
3170: 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42   nExpr = pOrderB
3180: 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20  y->nExpr;.  int 
3190: 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65  regBase = sqlite
31a0: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
31b0: 61 72 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a  arse, nExpr+2);.
31c0: 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20    int regRecord 
31d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
31e0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
31f0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
3200: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
3210: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
3220: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
3230: 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73  pOrderBy, regBas
3240: 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
3250: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3260: 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65  _Sequence, pOrde
3270: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  rBy->iECursor, r
3280: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
3290: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
32a0: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
32b0: 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45  Data, regBase+nE
32c0: 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71 6c  xpr+1, 1);.  sql
32d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
32e0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
32f0: 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72 20   regBase, nExpr 
3300: 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  + 2, regRecord);
3310: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3320: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
3330: 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e  sert, pOrderBy->
3340: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63  iECursor, regRec
3350: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ord);.  sqlite3R
3360: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
3370: 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
3380: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
3390: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
33a0: 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78  se, regBase, nEx
33b0: 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65  pr+2);.  if( pSe
33c0: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  lect->iLimit ){.
33d0: 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61      int addr1, a
33e0: 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c  ddr2;.    int iL
33f0: 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53  imit;.    if( pS
3400: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29  elect->iOffset )
3410: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
3420: 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65   pSelect->iOffse
3430: 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  t+1;.    }else{.
3440: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70        iLimit = p
3450: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a  Select->iLimit;.
3460: 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20      }.    addr1 
3470: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3480: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op1(v, OP_IfZero
3490: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73  , iLimit);.    s
34a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
34b0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69  (v, OP_AddImm, i
34c0: 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
34d0: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
34e0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
34f0: 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74  Goto);.    sqlit
3500: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
3510: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71  , addr1);.    sq
3520: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
3530: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64  v, OP_Last, pOrd
3540: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b  erBy->iECursor);
3550: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3560: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
3570: 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  ete, pOrderBy->i
3580: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  ECursor);.    sq
3590: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
35a0: 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20  e(v, addr2);.   
35b0: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
35c0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
35d0: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
35e0: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
35f0: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
3600: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
3610: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
3620: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
3630: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
3640: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
3650: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
3660: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
3670: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
3680: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20   int iContinue  
3690: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
36a0: 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72  to skip the curr
36b0: 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  ent record */.){
36c0: 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65  .  if( p->iOffse
36d0: 74 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d  t && iContinue!=
36e0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  0 ){.    int add
36f0: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  r;.    sqlite3Vd
3700: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
3710: 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66 73 65  ddImm, p->iOffse
3720: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
3730: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3740: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65 67  dOp1(v, OP_IfNeg
3750: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20  , p->iOffset);. 
3760: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3770: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
3780: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
3790: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
37a0: 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54  (v, "skip OFFSET
37b0: 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20   records"));.   
37c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
37d0: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
37e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
37f0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
3800: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
3810: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
3820: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
3830: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
3840: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
3850: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
3860: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
3870: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
3880: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
3890: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
38a0: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
38b0: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
38c0: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
38d0: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
38e0: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
38f0: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
3900: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
3910: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
3920: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
3930: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
3940: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
3950: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
3960: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
3970: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
3980: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3990: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
39a0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
39b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
39c0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
39d0: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
39e0: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
39f0: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
3a00: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
3a10: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
3a20: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
3a30: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
3a40: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
3a50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
3a60: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
3a70: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
3a80: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
3a90: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
3aa0: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
3ab0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
3ac0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
3ad0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
3ae0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3af0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
3b00: 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c  Record, iMem, N,
3b10: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   r1);.  sqlite3V
3b20: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
3b30: 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64  Found, iTab, add
3b40: 72 52 65 70 65 61 74 2c 20 72 31 29 3b 0a 20 20  rRepeat, r1);.  
3b50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3b60: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
3b70: 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20  t, iTab, r1);.  
3b80: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
3b90: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
3ba0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
3bb0: 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
3bc0: 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c  ssage when a SEL
3bd0: 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74 68  ECT is used with
3be0: 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73 69  in a subexpressi
3bf0: 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20  on.** (example: 
3c00: 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a   "a IN (SELECT *
3c10: 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62   FROM table)") b
3c20: 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74  ut it has more t
3c30: 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20  han 1 result.** 
3c40: 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74  column.  We do t
3c50: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
3c60: 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ine because the 
3c70: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
3c80: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c 61 63  multiple.** plac
3c90: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
3ca0: 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  t checkForMultiC
3cb0: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
3cc0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3cd0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
3ce0: 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20  e context. */.  
3cf0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
3d00: 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74  t,   /* Destinat
3d10: 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65  ion of SELECT re
3d20: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sults */.  int n
3d30: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
3d40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
3d50: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  ult columns retu
3d60: 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a  rned by SELECT *
3d70: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74  /.){.  int eDest
3d80: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
3d90: 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26  .  if( nExpr>1 &
3da0: 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  & (eDest==SRT_Me
3db0: 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
3dc0: 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Set) ){.    sqli
3dd0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3de0: 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
3df0: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
3e00: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
3e10: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
3e20: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
3e30: 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  ession");.    re
3e40: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
3e50: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3e60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
3e70: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
3e80: 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
3e90: 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68  the inside of th
3ea0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
3eb0: 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  of a SELECT..**.
3ec0: 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e 64  ** If srcTab and
3ed0: 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74   nColumn are bot
3ee0: 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  h zero, then the
3ef0: 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69   pEList expressi
3f00: 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75  ons.** are evalu
3f10: 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
3f20: 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f   get the data fo
3f30: 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20  r this row.  If 
3f40: 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65  nColumn>0.** the
3f50: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
3f60: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
3f70: 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20   pEList is used 
3f80: 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a  only to get the.
3f90: 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f 72  ** datatypes for
3fa0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
3fb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
3fc0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
3fd0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3fe0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
3ff0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
4000: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
4010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4020: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
4030: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
4040: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
4050: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
4060: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
4070: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
4080: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
4090: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
40a0: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
40b0: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
40c0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
40d0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n,            /*
40e0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
40f0: 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  ns in the source
4100: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
4110: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
4120: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
4130: 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73  LL, sort results
4140: 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20   using this key 
4150: 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63  */.  int distinc
4160: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
4170: 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72  If >=0, make sur
4180: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
4190: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 53 65 6c 65  stinct */.  Sele
41a0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
41b0: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
41c0: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
41d0: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ults */.  int iC
41e0: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
41f0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
4200: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
4210: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
4220: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
4230: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4240: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
4250: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
4260: 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  p */.){.  Vdbe *
4270: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4280: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
4290: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
42a0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
42b0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
42c0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
42d0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73   */.  int regRes
42e0: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ult;            
42f0: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65    /* Start of me
4300: 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73  mory holding res
4310: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  ult set */.  int
4320: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
4330: 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20  eDest;   /* How 
4340: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65  to dispose of re
4350: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
4360: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50  Parm = pDest->iP
4370: 61 72 6d 3b 20 20 20 2f 2a 20 46 69 72 73 74 20  arm;   /* First 
4380: 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70  argument to disp
4390: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
43a0: 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b   int nResultCol;
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
43c0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
43d0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61   columns */..  a
43e0: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 69 66  ssert( v );.  if
43f0: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
4400: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
4410: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
4420: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64   hasDistinct = d
4430: 69 73 74 69 6e 63 74 3e 3d 30 3b 0a 20 20 69 66  istinct>=0;.  if
4440: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ( pOrderBy==0 &&
4450: 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b   !hasDistinct ){
4460: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
4470: 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29  v, p, iContinue)
4480: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c  ;.  }..  /* Pull
4490: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
44a0: 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  olumns..  */.  i
44b0: 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a  f( nColumn>0 ){.
44c0: 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d      nResultCol =
44d0: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73   nColumn;.  }els
44e0: 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f  e{.    nResultCo
44f0: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
4500: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65  r;.  }.  if( pDe
4510: 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20  st->iMem==0 ){. 
4520: 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d     pDest->iMem =
4530: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
4540: 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  .    pDest->nMem
4550: 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   = nResultCol;. 
4560: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
4570: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20  += nResultCol;. 
4580: 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73   }else{ .    ass
4590: 65 72 74 28 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  ert( pDest->nMem
45a0: 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a  ==nResultCol );.
45b0: 20 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20    }.  regResult 
45c0: 3d 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20  = pDest->iMem;. 
45d0: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
45e0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
45f0: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
4600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4610: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
4620: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c  lumn, srcTab, i,
4630: 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20   regResult+i);. 
4640: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
4650: 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73   eDest!=SRT_Exis
4660: 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ts ){.    /* If 
4670: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
4680: 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e  is an EXISTS(...
4690: 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  ) expression, th
46a0: 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20  e actual.    ** 
46b0: 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20  values returned 
46c0: 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  by the SELECT ar
46d0: 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  e not required..
46e0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
46f0: 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
4700: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71  (pParse);.    sq
4710: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
4720: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
4730: 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c  List, regResult,
4740: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
4750: 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75  ut);.  }.  nColu
4760: 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  mn = nResultCol;
4770: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
4780: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
4790: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
47a0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
47b0: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
47c0: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
47d0: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
47e0: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
47f0: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
4800: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
4810: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
4820: 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65  inct ){.    asse
4830: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
4840: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c  .    assert( pEL
4850: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c  ist->nExpr==nCol
4860: 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44  umn );.    codeD
4870: 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
4880: 64 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69  distinct, iConti
4890: 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65  nue, nColumn, re
48a0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 69 66  gResult);.    if
48b0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
48c0: 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65  .      codeOffse
48d0: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
48e0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
48f0: 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
4900: 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
4910: 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
4920: 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
4930: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
4940: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
4950: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
4960: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
4970: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
4980: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
4990: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
49a0: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
49b0: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
49c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
49d0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
49e0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
49f0: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ion: {.      int
4a00: 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20   r1;.      r1 = 
4a10: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
4a20: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
4a30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4a40: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
4a50: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
4a60: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
4a70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4a80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
4a90: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
4aa0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4ab0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
4ac0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
4ad0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4ae0: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
4af0: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
4b00: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
4b10: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
4b20: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
4b30: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
4b40: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
4b50: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
4b60: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
4b70: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
4b80: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
4b90: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
4ba0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4bb0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
4bc0: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
4bd0: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  m, regResult, nC
4be0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
4bf0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
4c00: 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  f..    /* Store 
4c10: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
4c20: 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
4c30: 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
4c40: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
4c50: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
4c60: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
4c70: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
4c80: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
4c90: 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  se);.      testc
4ca0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
4cb0: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74  Table );.      t
4cc0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
4cd0: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
4ce0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4cf0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4d00: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
4d10: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31  ult, nColumn, r1
4d20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
4d30: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
4d40: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
4d50: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
4d60: 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  , p, r1);.      
4d70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
4d80: 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
4d90: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
4da0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4db0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4dc0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
4dd0: 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  rm, r2);.       
4de0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4df0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
4e00: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b   iParm, r1, r2);
4e10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4e20: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
4e30: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
4e40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
4e50: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
4e60: 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
4e70: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
4e80: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
4e90: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
4ea0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4eb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4ec0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
4ed0: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
4ee0: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
4ef0: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
4f00: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
4f10: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
4f20: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
4f30: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
4f40: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
4f50: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
4f60: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
4f70: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
4f80: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
4f90: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
4fa0: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
4fb0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
4fc0: 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69  .      p->affini
4fd0: 74 79 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ty = sqlite3Comp
4fe0: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69  areAffinity(pELi
4ff0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
5000: 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29  pDest->affinity)
5010: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
5020: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
5030: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
5040: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
5050: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
5060: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
5070: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
5080: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
5090: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
50a0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
50b0: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
50c0: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
50d0: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
50e0: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
50f0: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
5100: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
5110: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
5120: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
5130: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
5140: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
5150: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
5160: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5170: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
5180: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5190: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
51a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
51b0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
51c0: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 2c  d, regResult, 1,
51d0: 20 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74   r1, &p->affinit
51e0: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  y, 1);.        s
51f0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
5200: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
5210: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
5220: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
5230: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5240: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
5250: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
5260: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5270: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5280: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r1);.      }. 
5290: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
52a0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  }..    /* If any
52b0: 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
52c0: 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
52d0: 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
52e0: 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
52f0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
5300: 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
5310: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5320: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
5330: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
5340: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
5350: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
5360: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
5370: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
5380: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
5390: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
53a0: 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
53b0: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
53c0: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
53d0: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
53e0: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
53f0: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
5400: 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
5410: 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
5420: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
5430: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5440: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
5450: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
5460: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
5470: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
5480: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
5490: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
54a0: 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  rBy, p, regResul
54b0: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
54c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
54d0: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
54e0: 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  rse, regResult, 
54f0: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
5500: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
5510: 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
5520: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
5530: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
5540: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
5550: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
5560: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5570: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
5580: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65  .    /* Send the
5590: 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c   data to the cal
55a0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f  lback function o
55b0: 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e  r to a subroutin
55c0: 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a  e.  In the.    *
55d0: 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75 62 72  * case of a subr
55e0: 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72  outine, the subr
55f0: 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73  outine itself is
5600: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
5610: 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20  .    ** popping 
5620: 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  the data from th
5630: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  e stack..    */.
5640: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
5650: 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65  outine:.    case
5660: 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a 20   SRT_Output: {. 
5670: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
5680: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
5690: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ine );.      tes
56a0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
56b0: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
56c0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
56d0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
56e0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
56f0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5710: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
5720: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
5730: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31  ult, nColumn, r1
5740: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
5750: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
5760: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
5770: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
5780: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5790: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
57a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
57b0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
57c0: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ine ){.        s
57d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
57e0: 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
57f0: 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20  est->iParm);.   
5800: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5820: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
5830: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
5840: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
5850: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
5860: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
5870: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
5880: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  lt, nColumn);.  
5890: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
58a0: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  k;.    }..#if !d
58b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
58c0: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
58d0: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
58e0: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
58f0: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
5900: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
5910: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
5920: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
5930: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
5940: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
5950: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
5960: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
5970: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
5980: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
5990: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
59a0: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
59b0: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
59c0: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
59d0: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
59e0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
59f0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
5a00: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72  card );.      br
5a10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5a20: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
5a30: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
5a40: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
5a50: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
5a60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
5a70: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 61 73 73  Limit ){.    ass
5a80: 65 72 74 28 20 70 4f 72 64 65 72 42 79 3d 3d 30  ert( pOrderBy==0
5a90: 20 29 3b 20 20 2f 2a 20 49 66 20 74 68 65 72 65   );  /* If there
5aa0: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c   is an ORDER BY,
5ab0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20   the call to.   
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ad0: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 75 73 68           ** push
5ae0: 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20 77 6f 75  OntoSorter() wou
5af0: 6c 64 20 68 61 76 65 20 63 6c 65 61 72 65 64 20  ld have cleared 
5b00: 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 20  p->iLimit */.   
5b10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5b20: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
5b30: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b   p->iLimit, -1);
5b40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5b50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a  AddOp2(v, OP_IfZ
5b60: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
5b70: 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a  iBreak);.  }.}..
5b80: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
5b90: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
5ba0: 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e  generate a KeyIn
5bb0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
5bc0: 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  t records.** the
5bd0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
5be0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70  nce for each exp
5bf0: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20  ression in that 
5c00: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
5c10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78  .**.** If the Ex
5c20: 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44  prList is an ORD
5c30: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
5c40: 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68  Y clause then th
5c50: 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b  e resulting.** K
5c60: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5c70: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
5c80: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
5c90: 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
5ca0: 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
5cb0: 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49   that clause.  I
5cc0: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
5cd0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
5ce0: 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20   of a SELECT.** 
5cf0: 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f  then the KeyInfo
5d00: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
5d10: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
5d20: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
5d30: 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  tual.** index to
5d40: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53   implement a DIS
5d50: 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a  TINCT test..**.*
5d60: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
5d70: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
5d80: 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20  cture is obtain 
5d90: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68  from malloc.  Th
5da0: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
5db0: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
5dc0: 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20  ible for seeing 
5dd0: 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
5de0: 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
5df0: 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64 64  y.** freed.  Add
5e00: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
5e10: 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 50 34  ucture to the P4
5e20: 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63   field of an opc
5e30: 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 34 5f  ode using.** P4_
5e40: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
5e50: 69 73 20 74 68 65 20 75 73 75 61 6c 20 77 61 79  is the usual way
5e60: 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74 68   of dealing with
5e70: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
5e80: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
5e90: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50 61  oFromExprList(Pa
5ea0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
5eb0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
5ec0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5ed0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
5ee0: 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66   nExpr;.  KeyInf
5ef0: 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75  o *pInfo;.  stru
5f00: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
5f10: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
5f20: 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69  ;..  nExpr = pLi
5f30: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
5f40: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
5f50: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
5f60: 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 45  eof(*pInfo) + nE
5f70: 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  xpr*(sizeof(Coll
5f80: 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66  Seq*)+1) );.  if
5f90: 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70  ( pInfo ){.    p
5fa0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
5fb0: 20 3d 20 28 75 38 2a 29 26 70 49 6e 66 6f 2d 3e   = (u8*)&pInfo->
5fc0: 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20  aColl[nExpr];.  
5fd0: 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20    pInfo->nField 
5fe0: 3d 20 28 75 31 36 29 6e 45 78 70 72 3b 0a 20 20  = (u16)nExpr;.  
5ff0: 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45    pInfo->enc = E
6000: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 49 6e 66  NC(db);.    pInf
6010: 6f 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  o->db = db;.    
6020: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
6030: 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72  List->a; i<nExpr
6040: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
6050: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
6060: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f  pColl;.      pCo
6070: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
6080: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
6090: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
60a0: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
60b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
60c0: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
60d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
60e0: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  pInfo->aColl[i] 
60f0: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
6100: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
6110: 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72  [i] = pItem->sor
6120: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
6130: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f  }.  return pInfo
6140: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
6150: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61  he inner loop wa
6160: 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e  s generated usin
6170: 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72  g a non-null pOr
6180: 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a  derBy argument,.
6190: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  ** then the resu
61a0: 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20  lts were placed 
61b0: 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66  in a sorter.  Af
61c0: 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20  ter the loop is 
61d0: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65  terminated.** we
61e0: 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65   need to run the
61f0: 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70   sorter and outp
6200: 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  ut the results. 
6210: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
6220: 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
6230: 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65  tes the code nee
6240: 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  ded to do that..
6250: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
6260: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
6270: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6280: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
6290: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
62a0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f  ect *p,        /
62b0: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
62c0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65  tement */.  Vdbe
62d0: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a   *v,          /*
62e0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
62f0: 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f  nto this VDBE */
6300: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
6310: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6320: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
6330: 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
6340: 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74  t *pDest /* Writ
6350: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
6360: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
6370: 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20    int addrBreak 
6380: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
6390: 65 4c 61 62 65 6c 28 76 29 3b 20 20 20 20 20 2f  eLabel(v);     /
63a0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65  * Jump here to e
63b0: 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  xit loop */.  in
63c0: 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d  t addrContinue =
63d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
63e0: 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75  Label(v);  /* Ju
63f0: 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74  mp here for next
6400: 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   cycle */.  int 
6410: 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54 61 62  addr;.  int iTab
6420: 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f 54 61  ;.  int pseudoTa
6430: 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69 73  b = 0;.  ExprLis
6440: 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
6450: 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69 6e  >pOrderBy;..  in
6460: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
6470: 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50  >eDest;.  int iP
6480: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50 61  arm = pDest->iPa
6490: 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65 67 52 6f  rm;..  int regRo
64a0: 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69  w;.  int regRowi
64b0: 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f 72  d;..  iTab = pOr
64c0: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b  derBy->iECursor;
64d0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
64e0: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
64f0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
6500: 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54 61   ){.    pseudoTa
6510: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
6520: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
6530: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6540: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65 75  OpenPseudo, pseu
6550: 64 6f 54 61 62 2c 20 65 44 65 73 74 3d 3d 53 52  doTab, eDest==SR
6560: 54 5f 4f 75 74 70 75 74 2c 20 6e 43 6f 6c 75 6d  T_Output, nColum
6570: 6e 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d  n);.  }.  addr =
6580: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
6590: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
65a0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
65b0: 61 6b 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  ak);.  codeOffse
65c0: 74 28 76 2c 20 70 2c 20 61 64 64 72 43 6f 6e 74  t(v, p, addrCont
65d0: 69 6e 75 65 29 3b 0a 20 20 72 65 67 52 6f 77 20  inue);.  regRow 
65e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
65f0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72  Reg(pParse);.  r
6600: 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  egRowid = sqlite
6610: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
6620: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
6630: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
6640: 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72  olumn, iTab, pOr
6650: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31  derBy->nExpr + 1
6660: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73 77 69  , regRow);.  swi
6670: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
6680: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
6690: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
66a0: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
66b0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
66c0: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
66d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
66e0: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
66f0: 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
6700: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6710: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
6720: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
6730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6740: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
6750: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
6760: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
6770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6780: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
6790: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
67a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
67b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
67c0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
67d0: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
67e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
67f0: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
6800: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6810: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
6820: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31  ecord, regRow, 1
6830: 2c 20 72 65 67 52 6f 77 69 64 2c 20 26 70 2d 3e  , regRowid, &p->
6840: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
6850: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
6860: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
6870: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  ge(pParse, regRo
6880: 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  w, 1);.      sql
6890: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
68a0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
68b0: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
68c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
68d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
68e0: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
68f0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
6900: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
6910: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
6920: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 69  Parse, regRow, i
6930: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
6940: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
6950: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
6960: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
6970: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
6980: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
6990: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
69a0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
69b0: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
69c0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
69d0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
69e0: 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65  ine ); .      te
69f0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6a00: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
6a10: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
6a20: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
6a30: 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e );.      sqlit
6a40: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6a50: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
6a60: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
6a70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6a80: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
6a90: 70 73 65 75 64 6f 54 61 62 2c 20 72 65 67 52 6f  pseudoTab, regRo
6aa0: 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  w, regRowid);.  
6ab0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
6ac0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
6ad0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
6ae0: 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69 4d 65  gRow!=pDest->iMe
6af0: 6d 2b 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73  m+i );.        s
6b00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6b10: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
6b20: 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65  seudoTab, i, pDe
6b30: 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20 20  st->iMem+i);.   
6b40: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
6b50: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
6b60: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6b70: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6b80: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
6b90: 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c  Dest->iMem, nCol
6ba0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  umn);.        sq
6bb0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
6bc0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
6bd0: 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d  rse, pDest->iMem
6be0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
6bf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6c00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6c10: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
6c20: 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20  pDest->iParm);. 
6c30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6c40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
6c50: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
6c60: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
6c70: 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65 33  gRow);.  sqlite3
6c80: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6c90: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29  Parse, regRowid)
6ca0: 3b 0a 0a 20 20 2f 2a 20 4c 49 4d 49 54 20 68 61  ;..  /* LIMIT ha
6cb0: 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74  s been implement
6cc0: 65 64 20 62 79 20 74 68 65 20 70 75 73 68 4f 6e  ed by the pushOn
6cd0: 74 6f 53 6f 72 74 65 72 28 29 20 72 6f 75 74 69  toSorter() routi
6ce0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ne..  */.  asser
6cf0: 74 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20  t( p->iLimit==0 
6d00: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74  );..  /* The bot
6d10: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  tom of the loop.
6d20: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
6d30: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
6d40: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
6d50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6d60: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
6d70: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20   iTab, addr);.  
6d80: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
6d90: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
6da0: 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 65 44 65  reak);.  if( eDe
6db0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
6dc0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
6dd0: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71  outine ){.    sq
6de0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6df0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65  v, OP_Close, pse
6e00: 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a  udoTab, 0);.  }.
6e10: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6e20: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
6e30: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
6e40: 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f   the 'declaratio
6e50: 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a  n type' of the.*
6e60: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * expression pEx
6e70: 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d  pr. The string m
6e80: 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ay be treated as
6e90: 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63   static by the c
6ea0: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  aller..**.** The
6eb0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
6ec0: 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20 64  e is the exact d
6ed0: 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74 69  atatype definiti
6ee0: 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  on extracted fro
6ef0: 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61  m the.** origina
6f00: 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  l CREATE TABLE s
6f10: 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20  tatement if the 
6f20: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
6f30: 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64  column. The.** d
6f40: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
6f50: 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c  for a ROWID fiel
6f60: 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78  d is INTEGER. Ex
6f70: 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78  actly when an ex
6f80: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63  pression.** is c
6f90: 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75  onsidered a colu
6fa0: 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  mn can be comple
6fb0: 78 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63  x in the presenc
6fc0: 65 20 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e  e of subqueries.
6fd0: 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73   The.** result-s
6fe0: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  et expression in
6ff0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
7000: 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61  owing SELECT sta
7010: 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63  tements is .** c
7020: 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75  onsidered a colu
7030: 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  mn by this funct
7040: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ion..**.**   SEL
7050: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
7060: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
7070: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
7080: 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  bl;.**   SELECT 
7090: 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d  (SELECT col FROM
70a0: 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45   tbl);.**   SELE
70b0: 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c  CT abc FROM (SEL
70c0: 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46  ECT col AS abc F
70d0: 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a  ROM tbl);.** .**
70e0: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
70f0: 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78   type for any ex
7100: 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74  pression other t
7110: 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20  han a column is 
7120: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
7130: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75  const char *colu
7140: 6d 6e 54 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f  mnType(.  NameCo
7150: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45  ntext *pNC, .  E
7160: 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f  xpr *pExpr,.  co
7170: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
7180: 67 69 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  ginDb,.  const c
7190: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61  har **pzOriginTa
71a0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
71b0: 2a 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b  **pzOriginCol.){
71c0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
71d0: 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72  Type = 0;.  char
71e0: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44   const *zOriginD
71f0: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
7200: 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20  nst *zOriginTab 
7210: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
7220: 74 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20  t *zOriginCol = 
7230: 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66  0;.  int j;.  if
7240: 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
7250: 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ) || pNC->pSrcLi
7260: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
7270: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
7280: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
7290: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
72a0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
72b0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
72c0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
72d0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
72e0: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
72f0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
7300: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
7310: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
7320: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
7330: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
7340: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
7350: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
7360: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
7370: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
7380: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
7390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
73a0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
73b0: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
73c0: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
73d0: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
73f0: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
7400: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
7410: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
7420: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
7430: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
7440: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
7450: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  Tab */.      tes
7460: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
7470: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
7480: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7490: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
74a0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
74b0: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
74c0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
74d0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
74e0: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
74f0: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
7500: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
7510: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
7520: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
7530: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
7540: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
7550: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
7560: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
7570: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
7580: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
7590: 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74     pS = pTabList
75a0: 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[j].pSelect;.
75b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
75c0: 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70           pNC = p
75d0: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  NC->pNext;.     
75e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
75f0: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
7600: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 49  ){.        /* FI
7610: 58 20 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a  X ME:.        **
7620: 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 73   This can occurs
7630: 20 69 66 20 79 6f 75 20 68 61 76 65 20 73 6f 6d   if you have som
7640: 65 74 68 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c  ething like "SEL
7650: 45 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69  ECT new.x;" insi
7660: 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  de.        ** a 
7670: 74 72 69 67 67 65 72 2e 20 20 49 6e 20 6f 74 68  trigger.  In oth
7680: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 79 6f 75  er words, if you
7690: 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
76a0: 70 65 63 69 61 6c 20 22 6e 65 77 22 0a 20 20 20  pecial "new".   
76b0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e       ** table in
76c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
76d0: 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 57 65  of a select.  We
76e0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 67   do not have a g
76f0: 6f 6f 64 20 77 61 79 0a 20 20 20 20 20 20 20 20  ood way.        
7700: 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61  ** to find the a
7710: 63 74 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65  ctual table type
7720: 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20 22 54 45  , so call it "TE
7730: 58 54 22 2e 20 20 54 68 69 73 20 69 73 20 72 65  XT".  This is re
7740: 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  ally.        ** 
7750: 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61 20 62  something of a b
7760: 75 67 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f 74  ug, but I do not
7770: 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69 78   know how to fix
7780: 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   it..        **.
7790: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
77a0: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 72  code does not pr
77b0: 6f 64 75 63 65 20 74 68 65 20 63 6f 72 72 65 63  oduce the correc
77c0: 74 20 61 6e 73 77 65 72 20 2d 20 69 74 20 6a 75  t answer - it ju
77d0: 73 74 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20  st prevents.    
77e0: 20 20 20 20 2a 2a 20 61 20 73 65 67 66 61 75 6c      ** a segfaul
77f0: 74 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  t.  See ticket #
7800: 31 32 32 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f  1229..        */
7810: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
7820: 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20 20 20   "TEXT";.       
7830: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
7840: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7850: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Tab );.      if(
7860: 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   pS ){.        /
7870: 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73  * The "table" is
7880: 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d   actually a sub-
7890: 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77  select or a view
78a0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
78b0: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  use.        ** o
78c0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
78d0: 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74  tement. Return t
78e0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
78f0: 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20  ype and origin. 
7900: 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66         ** data f
7910: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  or the result-se
7920: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
7930: 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20  sub-select..    
7940: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
7950: 66 28 20 41 4c 57 41 59 53 28 69 43 6f 6c 3e 3d  f( ALWAYS(iCol>=
7960: 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45  0 && iCol<pS->pE
7970: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
7980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
7990: 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61  iCol is less tha
79a0: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
79b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75   expression requ
79c0: 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  ests the.       
79d0: 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74     ** rowid of t
79e0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72  he sub-select or
79f0: 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72   view. This expr
7a00: 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20  ession is legal 
7a10: 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20  (see .          
7a20: 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73  ** test case mis
7a30: 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77  c2.2.2) - it alw
7a40: 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ays evaluates to
7a50: 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20   NULL..         
7a60: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61   */.          Na
7a70: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
7a80: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
7a90: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
7aa0: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20  [iCol].pExpr;.  
7ab0: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63          sNC.pSrc
7ac0: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
7ad0: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
7ae0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
7af0: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
7b00: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
7b10: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
7b20: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
7b30: 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20   p, &zOriginDb, 
7b40: 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f  &zOriginTab, &zO
7b50: 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20  riginCol); .    
7b60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
7b70: 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61  e if( ALWAYS(pTa
7b80: 62 2d 3e 70 53 63 68 65 6d 61 29 20 29 7b 0a 20  b->pSchema) ){. 
7b90: 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c         /* A real
7ba0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
7bb0: 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b    assert( !pS );
7bc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
7bd0: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
7be0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
7bf0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
7c00: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
7c10: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
7c20: 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l) );.        if
7c30: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
7c40: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
7c50: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
7c60: 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20     zOriginCol = 
7c70: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20  "rowid";.       
7c80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7c90: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
7ca0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
7cb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
7cc0: 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61  ginCol = pTab->a
7cd0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
7ce0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7cf0: 20 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20     zOriginTab = 
7d00: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
7d10: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
7d20: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
7d30: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
7d40: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
7d50: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
7d60: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
7d70: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
7d80: 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61  ginDb = pNC->pPa
7d90: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
7da0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
7db0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
7dc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
7dd0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7de0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
7df0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
7e00: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
7e10: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75  pression is a su
7e20: 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e  b-select. Return
7e30: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
7e40: 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20   type and.      
7e50: 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66  ** origin info f
7e60: 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f  or the single co
7e70: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
7e80: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
7e90: 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74  LECT.      ** st
7ea0: 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  atement..      *
7eb0: 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74  /.      NameCont
7ec0: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53  ext sNC;.      S
7ed0: 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70  elect *pS = pExp
7ee0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
7ef0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
7f00: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
7f10: 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
7f20: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
7f30: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
7f40: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
7f50: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
7f60: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
7f70: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
7f80: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72  ;.      sNC.pPar
7f90: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
7fa0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
7fb0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
7fc0: 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20   p, &zOriginDb, 
7fd0: 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f  &zOriginTab, &zO
7fe0: 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20  riginCol); .    
7ff0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
8000: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69  endif.  }.  .  i
8010: 66 28 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b  f( pzOriginDb ){
8020: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f  .    assert( pzO
8030: 72 69 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72  riginTab && pzOr
8040: 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  iginCol );.    *
8050: 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72  pzOriginDb = zOr
8060: 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f  iginDb;.    *pzO
8070: 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67  riginTab = zOrig
8080: 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  inTab;.    *pzOr
8090: 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69  iginCol = zOrigi
80a0: 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nCol;.  }.  retu
80b0: 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zType;.}../*.
80c0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
80d0: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
80e0: 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63  the VDBE the dec
80f0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f  laration types o
8100: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
8110: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
8120: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
8130: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
8140: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
8150: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
8160: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
8170: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
8180: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
8190: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
81a0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
81b0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
81c0: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
81d0: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66  lt set */.){.#if
81e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
81f0: 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65  _DECLTYPE.  Vdbe
8200: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
8210: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
8220: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
8230: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
8240: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e  = pTabList;.  sN
8250: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
8260: 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  e;.  for(i=0; i<
8270: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
8280: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
8290: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
82a0: 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74  pExpr;.    const
82b0: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69   char *zType;.#i
82c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
82d0: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
82e0: 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  TA.    const cha
82f0: 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  r *zOrigDb = 0;.
8300: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8310: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
8320: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
8330: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  rigCol = 0;.    
8340: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
8350: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
8360: 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c  igDb, &zOrigTab,
8370: 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20   &zOrigCol);..  
8380: 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75    /* The vdbe mu
8390: 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20  st make its own 
83a0: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
83b0: 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65  mn-type and othe
83c0: 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  r .    ** column
83d0: 20 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67   specific string
83e0: 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  s, in case the s
83f0: 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62  chema is reset b
8400: 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a  efore this.    *
8410: 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
8420: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20  e is deleted..  
8430: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
8440: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8450: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54  , i, COLNAME_DAT
8460: 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20  ABASE, zOrigDb, 
8470: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
8480: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8490: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
84a0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45  i, COLNAME_TABLE
84b0: 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49  , zOrigTab, SQLI
84c0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
84d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
84e0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
84f0: 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a  OLNAME_COLUMN, z
8500: 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  OrigCol, SQLITE_
8510: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73  TRANSIENT);.#els
8520: 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  e.    zType = co
8530: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
8540: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  , 0, 0, 0);.#end
8550: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
8560: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8570: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54  i, COLNAME_DECLT
8580: 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49  YPE, zType, SQLI
8590: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
85a0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
85b0: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
85c0: 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  E */.}../*.** Ge
85d0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
85e0: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
85f0: 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  DBE the names of
8600: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
8610: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
8620: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
8630: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
8640: 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c  ide the.** azCol
8650: 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  [] values in the
8660: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
8670: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
8680: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
8690: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
86a0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
86b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
86c0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
86d0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
86e0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
86f0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
8700: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
8710: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
8720: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
8730: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
8740: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  e;.  int i, j;. 
8750: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8760: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
8770: 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72   fullNames, shor
8780: 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66  tNames;..#ifndef
8790: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
87a0: 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69  LAIN.  /* If thi
87b0: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c  s is an EXPLAIN,
87c0: 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   skip this step 
87d0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
87e0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
87f0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
8800: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  if..  if( pParse
8810: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
8820: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c 20   NEVER(v==0) || 
8830: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8840: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61   ) return;.  pPa
8850: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
8860: 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65   = 1;.  fullName
8870: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
8880: 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
8890: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72  ames)!=0;.  shor
88a0: 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  tNames = (db->fl
88b0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
88c0: 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  rtColNames)!=0;.
88d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
88e0: 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73  NumCols(v, pELis
88f0: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72  t->nExpr);.  for
8900: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
8910: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
8920: 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20   Expr *p;.    p 
8930: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
8940: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 4e 45  Expr;.    if( NE
8950: 56 45 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e 74  VER(p==0) ) cont
8960: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45  inue;.    if( pE
8970: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
8980: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
8990: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
89a0: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
89b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
89c0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
89d0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
89e0: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
89f0: 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
8a00: 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( (p->op==TK_C
8a10: 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  OLUMN || p->op==
8a20: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26  TK_AGG_COLUMN) &
8a30: 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20  & pTabList ){.  
8a40: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
8a50: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
8a60: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  l;.      int iCo
8a70: 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  l = p->iColumn;.
8a80: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41        for(j=0; A
8a90: 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74  LWAYS(j<pTabList
8aa0: 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20  ->nSrc); j++){. 
8ab0: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c         if( pTabL
8ac0: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
8ad0: 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62  r==p->iTable ) b
8ae0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8af0: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
8b00: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
8b10: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
8b20: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
8b30: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
8b40: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
8b50: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
8b60: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
8b70: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
8b80: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
8b90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
8ba0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
8bb0: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
8bc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8bd0: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
8be0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
8bf0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
8c00: 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73   if( !shortNames
8c10: 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29   && !fullNames )
8c20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8c30: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8c40: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8c50: 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ME, .           
8c60: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8c70: 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  (db, pEList->a[i
8c80: 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45  ].zSpan), SQLITE
8c90: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
8ca0: 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e   }else if( fullN
8cb0: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
8cc0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
8cd0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
8ce0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8cf0: 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  db, "%s.%s", pTa
8d00: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b  b->zName, zCol);
8d10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8d20: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8d30: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
8d40: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
8d50: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
8d60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8d70: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8d80: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8d90: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20  AME_NAME, zCol, 
8da0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
8db0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8dc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
8dd0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8de0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8df0: 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20  NAME, .         
8e00: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8e10: 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  (db, pEList->a[i
8e20: 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45  ].zSpan), SQLITE
8e30: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
8e40: 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
8e50: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
8e60: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
8e70: 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ist);.}..#ifndef
8e80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
8e90: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
8ea0: 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  ** Name of the c
8eb0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74  onnection operat
8ec0: 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72  or, used for err
8ed0: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
8ee0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
8ef0: 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  r *selectOpName(
8f00: 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20  int id){.  char 
8f10: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64  *z;.  switch( id
8f20: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
8f30: 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ALL:       z = "
8f40: 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72  UNION ALL";   br
8f50: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8f60: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20  _INTERSECT: z = 
8f70: 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62  "INTERSECT";   b
8f80: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8f90: 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d  K_EXCEPT:    z =
8fa0: 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20   "EXCEPT";      
8fb0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
8fc0: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20  lt:           z 
8fd0: 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20  = "UNION";      
8fe0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
8ff0: 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
9000: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
9010: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
9020: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  */../*.** Given 
9030: 61 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  a an expression 
9040: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
9050: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
9060: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
9070: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
9080: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
9090: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
90a0: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
90b0: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
90c0: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
90d0: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
90e0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
90f0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
9100: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
9110: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
9120: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
9130: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
9140: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
9150: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
9160: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
9170: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
9180: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
9190: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
91a0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
91b0: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
91c0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
91d0: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
91e0: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
91f0: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
9200: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
9210: 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
9220: 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75  c int selectColu
9230: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
9240: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9250: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
9260: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9270: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
9280: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
9290: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
92a0: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
92b0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
92c0: 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  nt *pnCol,      
92d0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
92e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
92f0: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
9300: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
9310: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
9320: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
9330: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
9340: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9350: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
9360: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
9370: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
9380: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
9390: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
93a0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
93b0: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
93c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
93d0: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
93e0: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
93f0: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
9400: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
9410: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
9420: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
9430: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
9440: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9450: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9460: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
9470: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
9480: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
9490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
94a0: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
94b0: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
94c0: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
94d0: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
94e0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
94f0: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
9500: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
9510: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9520: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
9530: 20 2a 2f 0a 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20   */..  *pnCol = 
9540: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
9550: 45 78 70 72 3b 0a 20 20 61 43 6f 6c 20 3d 20 2a  Expr;.  aCol = *
9560: 70 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44  paCol = sqlite3D
9570: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
9580: 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
9590: 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 61 43 6f  nCol);.  if( aCo
95a0: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
95b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 66 6f  LITE_NOMEM;.  fo
95c0: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
95d0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ; i<nCol; i++, p
95e0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47  Col++){.    /* G
95f0: 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  et an appropriat
9600: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63  e name for the c
9610: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  olumn.    */.   
9620: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
9630: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
9640: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
9650: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e  0 || p->pRight->
9660: 7a 54 6f 6b 65 6e 3d 3d 30 20 7c 7c 20 70 2d 3e  zToken==0 || p->
9670: 70 52 69 67 68 74 2d 3e 7a 54 6f 6b 65 6e 5b 30  pRight->zToken[0
9680: 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  ]!=0 );.    if( 
9690: 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  (zName = pEList-
96a0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20  >a[i].zName)!=0 
96b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
96c0: 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  he column contai
96d0: 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e  ns an "AS <name>
96e0: 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e  " phrase, use <n
96f0: 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65  ame> as the name
9700: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
9710: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
9720: 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  p(db, zName);.  
9730: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
9740: 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20  xpr *pColExpr = 
9750: 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  p;  /* The expre
9760: 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68  ssion that is th
9770: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
9780: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61  name */.      Ta
9790: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
97a0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f     /* Table asso
97b0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
97c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
97d0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c       while( pCol
97e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  Expr->op==TK_DOT
97f0: 20 29 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43   ) pColExpr = pC
9800: 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  olExpr->pRight;.
9810: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78        if( pColEx
9820: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
9830: 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f 6c  N && ALWAYS(pCol
9840: 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20 29  Expr->pTab!=0) )
9850: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  {.        /* For
9860: 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65   columns use the
9870: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d   column name nam
9880: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
9890: 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72   iCol = pColExpr
98a0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
98b0: 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78     pTab = pColEx
98c0: 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
98d0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
98e0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
98f0: 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  y;.        zName
9900: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
9910: 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20 20 20  f(db, "%s",.    
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f               iCo
9930: 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f  l>=0 ? pTab->aCo
9940: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20  l[iCol].zName : 
9950: 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20  "rowid");.      
9960: 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78  }else if( pColEx
9970: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  pr->op==TK_ID ){
9980: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
9990: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
99a0: 64 62 2c 20 22 25 73 22 2c 20 70 43 6f 6c 45 78  db, "%s", pColEx
99b0: 70 72 2d 3e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  pr->zToken);.   
99c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
99d0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69    /* Use the ori
99e0: 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
99f0: 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  e column express
9a00: 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20  ion as its name 
9a10: 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  */.        zName
9a20: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
9a30: 66 28 64 62 2c 20 22 25 73 22 2c 20 70 45 4c 69  f(db, "%s", pELi
9a40: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b  st->a[i].zSpan);
9a50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9a60: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
9a70: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
9a80: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9a90: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
9aa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
9ab0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
9ac0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
9ad0: 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74  is unique.  If t
9ae0: 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75  he name is not u
9af0: 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70  nique,.    ** ap
9b00: 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74  pend a integer t
9b10: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
9b20: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
9b30: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
9b40: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
9b50: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
9b60: 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30  .    for(j=cnt=0
9b70: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
9b80: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
9b90: 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e  rICmp(aCol[j].zN
9ba0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
9bb0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
9bc0: 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zNewName;.      
9bd0: 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d    zName[nName] =
9be0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77   0;.        zNew
9bf0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
9c00: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 3a 25 64  rintf(db, "%s:%d
9c10: 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29  ", zName, ++cnt)
9c20: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9c30: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
9c40: 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  e);.        zNam
9c50: 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20  e = zNewName;.  
9c60: 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20        j = -1;.  
9c70: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d        if( zName=
9c80: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
9c90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43    }.    }.    pC
9ca0: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  ol->zName = zNam
9cb0: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d  e;.  }.  if( db-
9cc0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
9cd0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
9ce0: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
9cf0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9d00: 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
9d10: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9d20: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
9d30: 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
9d40: 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
9d50: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
9d60: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
9d70: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9d80: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
9d90: 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  d type and colla
9da0: 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
9db0: 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73   to a column lis
9dc0: 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20  t based on.** a 
9dd0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
9de0: 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c  ..** .** The col
9df0: 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61  umn list presuma
9e00: 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65  bly came from se
9e10: 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46  lectColumnNamesF
9e20: 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a  romExprList()..*
9e30: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
9e40: 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73  t has only names
9e50: 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63  , not types or c
9e60: 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73  ollations.  This
9e70: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  .** routine goes
9e80: 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64   through and add
9e90: 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64 20  s the types and 
9ea0: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  collations..**.*
9eb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
9ec0: 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c  equires that all
9ed0: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   identifiers in 
9ee0: 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  the SELECT.** st
9ef0: 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c  atement be resol
9f00: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ved..*/.static v
9f10: 6f 69 64 20 73 65 6c 65 63 74 41 64 64 43 6f 6c  oid selectAddCol
9f20: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
9f30: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
9f40: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
9f50: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73  Parsing contexts
9f60: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20   */.  int nCol, 
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9f80: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9f90: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43   */.  Column *aC
9fa0: 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ol,         /* L
9fb0: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a  ist of columns *
9fc0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
9fd0: 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c  ect       /* SEL
9fe0: 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65  ECT used to dete
9ff0: 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20  rmine types and 
a000: 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b  collations */.){
a010: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a020: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e   pParse->db;.  N
a030: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
a040: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
a050: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
a060: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
a070: 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45  r *p;.  struct E
a080: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
a090: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
a0a0: 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ect!=0 );.  asse
a0b0: 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  rt( (pSelect->se
a0c0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
a0d0: 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73  lved)!=0 );.  as
a0e0: 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 70 53 65 6c  sert( nCol==pSel
a0f0: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
a100: 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
a110: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
a120: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a130: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
a140: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
a150: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
a160: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
a170: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d  ect->pSrc;.  a =
a180: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
a190: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ->a;.  for(i=0, 
a1a0: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
a1b0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
a1c0: 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45  .    p = a[i].pE
a1d0: 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a  xpr;.    pCol->z
a1e0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Type = sqlite3Db
a1f0: 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d  StrDup(db, colum
a200: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
a210: 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43  , 0, 0));.    pC
a220: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
a230: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
a240: 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70  ty(p);.    if( p
a250: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30  Col->affinity==0
a260: 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74   ) pCol->affinit
a270: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
a280: 4f 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ONE;.    pColl =
a290: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
a2a0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
a2b0: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
a2c0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f  .      pCol->zCo
a2d0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ll = sqlite3DbSt
a2e0: 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e  rDup(db, pColl->
a2f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
a300: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
a310: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
a320: 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ent, generate a 
a330: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
a340: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a  that describes.*
a350: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
a360: 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e   of that SELECT.
a370: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
a380: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
a390: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
a3a0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
a3b0: 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ct){.  Table *pT
a3c0: 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ab;.  sqlite3 *d
a3d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a3e0: 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73    int savedFlags
a3f0: 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20  ;..  savedFlags 
a400: 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64  = db->flags;.  d
a410: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
a420: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
a430: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  ;.  db->flags |=
a440: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
a450: 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  Names;.  sqlite3
a460: 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73  SelectPrep(pPars
a470: 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e, pSelect, 0);.
a480: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
a490: 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  rr ) return 0;. 
a4a0: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
a4b0: 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
a4c0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
a4d0: 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ior;.  db->flags
a4e0: 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20   = savedFlags;. 
a4f0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
a500: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
a510: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
a520: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
a530: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a540: 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c    }.  /* The sql
a550: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
a560: 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20  elect() is only 
a570: 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20  used n contexts 
a580: 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a  where lookaside.
a590: 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64    ** is disabled
a5a0: 2c 20 73 6f 20 77 65 20 6d 69 67 68 74 20 61 73  , so we might as
a5b0: 20 77 65 6c 6c 20 68 61 72 64 2d 63 6f 64 65 20   well hard-code 
a5c0: 70 54 61 62 2d 3e 64 62 4d 65 6d 20 74 6f 20 4e  pTab->dbMem to N
a5d0: 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ULL. */.  assert
a5e0: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
a5f0: 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20  bEnabled==0 );. 
a600: 20 70 54 61 62 2d 3e 64 62 4d 65 6d 20 3d 20 30   pTab->dbMem = 0
a610: 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d  ;.  pTab->nRef =
a620: 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
a630: 65 20 3d 20 30 3b 0a 20 20 73 65 6c 65 63 74 43  e = 0;.  selectC
a640: 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
a650: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
a660: 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  ct->pEList, &pTa
a670: 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
a680: 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41  aCol);.  selectA
a690: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
a6a0: 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
a6b0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61   pTab->nCol, pTa
a6c0: 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 65 63 74  b->aCol, pSelect
a6d0: 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  );.  pTab->iPKey
a6e0: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d   = -1;.  if( db-
a6f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
a700: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
a710: 74 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a 20  teTable(pTab);. 
a720: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
a730: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
a740: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
a750: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
a760: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
a770: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
a780: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
a790: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
a7a0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
a7b0: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
a7c0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
a7d0: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
a7e0: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
a7f0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
a800: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a810: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
a820: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
a830: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
a840: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
a850: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e  Parse->db);.#ifn
a860: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a870: 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 76 20  TRACE.    if( v 
a880: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a890: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
a8a0: 5f 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23  _Trace);.    }.#
a8b0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
a8c0: 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn v;.}.../*.** 
a8d0: 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
a8e0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
a8f0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
a900: 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
a910: 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  .** pLimit and p
a920: 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f  Offset expressio
a930: 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20  ns.  pLimit and 
a940: 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  pOffset hold the
a950: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
a960: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
a970: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
a980: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
a990: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
a9a0: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
a9b0: 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68  .  Or NULL if th
a9c0: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
a9d0: 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74   omitted. iLimit
a9e0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a   and iOffset .**
a9f0: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
aa00: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
aa10: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75   numbers for cou
aa20: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
aa30: 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69  mpute .** the li
aa40: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
aa50: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
aa60: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
aa70: 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c  set, then .** iL
aa80: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
aa90: 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a   are negative..*
aaa0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
aab0: 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
aac0: 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61  lues of iLimit a
aad0: 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20  nd iOffset only 
aae0: 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72  if.** a limit or
aaf0: 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e   offset is defin
ab00: 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64  ed by pLimit and
ab10: 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69   pOffset.  iLimi
ab20: 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74  t and.** iOffset
ab30: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
ab40: 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
ab50: 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
ab60: 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c  values.** (usual
ab70: 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79  ly but not alway
ab80: 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63  s -1) prior to c
ab90: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
aba0: 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ine..** Only if 
abb0: 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
abc0: 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
abd0: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
abe0: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
abf0: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
ac00: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
ac10: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
ac20: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
ac30: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
ac40: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
ac50: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
ac60: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
ac70: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
ac80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
ac90: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
aca0: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
acb0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
acc0: 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
acd0: 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
ace0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
acf0: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
ad00: 20 61 64 64 72 31 3b 0a 20 20 69 66 28 20 70 2d   addr1;.  if( p-
ad10: 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >iLimit ) return
ad20: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c  ;..  /* .  ** "L
ad30: 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20  IMIT -1" always 
ad40: 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20  shows all rows. 
ad50: 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20   There is some. 
ad60: 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20   ** contraversy 
ad70: 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63  about what the c
ad80: 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
ad90: 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20  should be..  ** 
ada0: 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
adb0: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72  ementation inter
adc0: 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20  prets "LIMIT 0" 
add0: 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20  to mean.  ** no 
ade0: 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rows..  */.  sql
adf0: 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
ae00: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  ar(pParse);.  as
ae10: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
ae20: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74  ==0 || p->pLimit
ae30: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
ae40: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d  pLimit ){.    p-
ae50: 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  >iLimit = iLimit
ae60: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
ae70: 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  m;.    v = sqlit
ae80: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
ae90: 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
aea0: 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
aeb0: 20 20 2f 2a 20 56 44 42 45 20 73 68 6f 75 6c 64    /* VDBE should
aec0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
aed0: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
aee0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
aef0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
af00: 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  Limit, iLimit);.
af10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
af20: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
af30: 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  BeInt, iLimit);.
af40: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
af50: 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
af60: 65 72 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  er"));.    sqlit
af70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
af80: 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69  OP_IfZero, iLimi
af90: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
afa0: 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29  if( p->pOffset )
afb0: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  {.      p->iOffs
afc0: 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b  et = iOffset = +
afd0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
afe0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
aff0: 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  m++;   /* Alloca
b000: 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67 69  te an extra regi
b010: 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f  ster for limit+o
b020: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 73  ffset */.      s
b030: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
b040: 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65  Parse, p->pOffse
b050: 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  t, iOffset);.   
b060: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b070: 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
b080: 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a  eInt, iOffset);.
b090: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
b0a0: 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f  t((v, "OFFSET co
b0b0: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
b0c0: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
b0d0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b0e0: 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b  IfPos, iOffset);
b0f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b100: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
b110: 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66 66 73  nteger, 0, iOffs
b120: 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
b130: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
b140: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20  , addr1);.      
b150: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b160: 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69  3(v, OP_Add, iLi
b170: 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f  mit, iOffset, iO
b180: 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  ffset+1);.      
b190: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
b1a0: 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29  "LIMIT+OFFSET"))
b1b0: 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  ;.      addr1 = 
b1c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b1d0: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  1(v, OP_IfPos, i
b1e0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71  Limit);.      sq
b1f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b200: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d  v, OP_Integer, -
b210: 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20  1, iOffset+1);. 
b220: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b230: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
b240: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
b250: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b260: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
b270: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  LECT./*.** Retur
b280: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
b290: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
b2a0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f  ence for the iCo
b2b0: 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  l-th column of.*
b2c0: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
b2d0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
b2e0: 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d-select stateme
b2f0: 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20  nt "p".  Return 
b300: 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63  NULL if.** the c
b310: 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66  olumn has no def
b320: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ault collating s
b330: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
b340: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
b350: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f  uence for the co
b360: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73  mpound select is
b370: 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a   taken from the.
b380: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  ** left-most ter
b390: 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  m of the select 
b3a0: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61  that has a colla
b3b0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
b3c0: 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
b3d0: 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c   *multiSelectCol
b3e0: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
b3f0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
b400: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c  nt iCol){.  Coll
b410: 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  Seq *pRet;.  if(
b420: 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
b430: 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65    pRet = multiSe
b440: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
b450: 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  se, p->pPrior, i
b460: 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col);.  }else{. 
b470: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d     pRet = 0;.  }
b480: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
b490: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74  =0 );.  if( pRet
b4a0: 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70  ==0 && iCol<p->p
b4b0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
b4c0: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
b4d0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
b4e0: 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  arse, p->pEList-
b4f0: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b  >a[iCol].pExpr);
b500: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
b510: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  et;.}.#endif /* 
b520: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
b530: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
b540: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
b550: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
b560: 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
b570: 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
b580: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
b590: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
b5a0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
b5b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
b5c0: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
b5d0: 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
b5e0: 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
b5f0: 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
b600: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
b610: 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
b620: 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65  s */.);...#ifnde
b630: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
b640: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
b650: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b660: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
b670: 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ocess a compound
b680: 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d   query form from
b690: 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  .** two or more 
b6a0: 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
b6b0: 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e   using UNION, UN
b6c0: 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c  ION ALL, EXCEPT,
b6d0: 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54   or.** INTERSECT
b6e0: 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
b6f0: 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
b700: 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
b710: 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
b720: 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
b730: 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
b740: 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
b750: 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
b760: 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
b770: 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
b780: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
b790: 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
b7a0: 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
b7b0: 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
b7c0: 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
b7d0: 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
b7e0: 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
b7f0: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
b800: 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
b810: 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
b820: 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
b830: 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
b840: 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
b850: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
b860: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
b870: 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
b880: 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
b890: 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
b8a0: 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
b8b0: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
b8c0: 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
b8d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
b8e0: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
b8f0: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
b900: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
b910: 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
b920: 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
b940: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
b950: 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
b960: 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
b970: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
b980: 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
b990: 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
b9a0: 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
b9b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
b9c0: 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
b9d0: 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
b9e0: 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
b9f0: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
ba00: 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
ba10: 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
ba20: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
ba30: 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
ba40: 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
ba50: 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
ba60: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
ba70: 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
ba80: 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
ba90: 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
baa0: 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
bab0: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
bac0: 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
bad0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
bae0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
baf0: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
bb00: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
bb10: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
bb20: 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
bb30: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
bb40: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
bb50: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
bb60: 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
bb70: 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
bb80: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
bb90: 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
bba0: 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
bbb0: 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
bbc0: 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
bbd0: 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
bbe0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
bbf0: 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
bc00: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
bc10: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
bc20: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
bc30: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
bc40: 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41   dest;      /* A
bc50: 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20  lternative data 
bc60: 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
bc70: 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65   Select *pDelete
bc80: 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20   = 0;  /* Chain 
bc90: 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  of simple select
bca0: 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
bcb0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
bcc0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
bcd0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
bce0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
bcf0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
bd00: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
bd10: 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
bd20: 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
bd30: 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
bd40: 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
bd50: 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
bd60: 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
bd70: 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
bd80: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
bd90: 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
bda0: 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
bdb0: 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
bdc0: 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20  is much */.  db 
bdd0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
bde0: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
bdf0: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
be00: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
be10: 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73  !=pPrior );.  as
be20: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
be30: 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69  ightmost==p->pRi
be40: 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73  ghtmost );.  des
be50: 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66  t = *pDest;.  if
be60: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
be70: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
be80: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
be90: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
bea0: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
beb0: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
bec0: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
bed0: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
bee0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
bef0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
bf00: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
bf10: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
bf20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
bf30: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
bf40: 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
bf50: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
bf60: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
bf70: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
bf80: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
bf90: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
bfa0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
bfb0: 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69  .  }..  v = sqli
bfc0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
bfd0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
bfe0: 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44  =0 );  /* The VD
bff0: 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  BE already creat
c000: 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75  ed by calling fu
c010: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nction */..  /* 
c020: 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
c030: 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
c040: 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
c050: 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ary.  */.  if( d
c060: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
c070: 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
c080: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
c090: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
c0a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c0b0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
c0c0: 65 73 74 2e 69 50 61 72 6d 2c 20 70 2d 3e 70 45  est.iParm, p->pE
c0d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
c0e0: 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
c0f0: 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
c100: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
c110: 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65  l SELECTs in the
c120: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20   statement have 
c130: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
c140: 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  of elements.  **
c150: 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74   in their result
c160: 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73   sets..  */.  as
c170: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
c180: 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  && pPrior->pELis
c190: 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45  t );.  if( p->pE
c1a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72  List->nExpr!=pPr
c1b0: 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ior->pEList->nEx
c1c0: 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
c1d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c1e0: 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
c1f0: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
c200: 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20   of %s".      " 
c210: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
c220: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
c230: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
c240: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
c250: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
c260: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
c270: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
c280: 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20  ..  /* Compound 
c290: 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76  SELECTs that hav
c2a0: 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
c2b0: 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64  ause are handled
c2c0: 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a   separately..  *
c2d0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  /.  if( p->pOrde
c2e0: 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rBy ){.    retur
c2f0: 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  n multiSelectOrd
c300: 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  erBy(pParse, p, 
c310: 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pDest);.  }..  /
c320: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c330: 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64  for the left and
c340: 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74   right SELECT st
c350: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
c360: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
c370: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
c380: 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  L: {.      int a
c390: 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  ddr = 0;.      a
c3a0: 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
c3b0: 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
c3c0: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
c3d0: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
c3e0: 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65    pPrior->pOffse
c3f0: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
c400: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c410: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
c420: 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b   pPrior, &dest);
c430: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
c440: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
c450: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
c460: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
c470: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
c480: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
c490: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
c4a0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  or = 0;.      p-
c4b0: 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
c4c0: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
c4d0: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72  p->iOffset = pPr
c4e0: 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  ior->iOffset;.  
c4f0: 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69      if( p->iLimi
c500: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64  t ){.        add
c510: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
c520: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp1(v, OP_IfZe
c530: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a  ro, p->iLimit);.
c540: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
c550: 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68  ent((v, "Jump ah
c560: 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61  ead if LIMIT rea
c570: 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d  ched"));.      }
c580: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c590: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
c5a0: 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
c5b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
c5c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
c5d0: 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
c5e0: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
c5f0: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
c600: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64  r;.      if( add
c610: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
c620: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c630: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
c640: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
c650: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
c660: 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
c670: 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
c680: 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
c690: 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
c6a0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
c6b0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
c6c0: 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
c6d0: 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b        u8 op = 0;
c6e0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
c6f0: 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
c700: 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
c710: 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
c720: 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
c730: 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
c740: 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
c750: 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
c760: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
c770: 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
c780: 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
c790: 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
c7a0: 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
c7b0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
c7c0: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
c7d0: 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20   uniondest;..   
c7e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
c7f0: 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b  op==TK_EXCEPT );
c800: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
c810: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
c820: 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f   );.      priorO
c830: 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
c840: 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
c850: 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20  est==priorOp && 
c860: 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c 69 6d 69  ALWAYS(!p->pLimi
c870: 74 20 26 26 21 70 2d 3e 70 4f 66 66 73 65 74 29  t &&!p->pOffset)
c880: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
c890: 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
c8a0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
c8b0: 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
c8c0: 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
c8d0: 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
c8e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c8f0: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
c900: 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20 2f 2a 20  tmost!=p );  /* 
c910: 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  Can only happen 
c920: 66 6f 72 20 6c 65 66 74 77 61 72 64 20 65 6c 65  for leftward ele
c930: 6d 65 6e 74 73 0a 20 20 20 20 20 20 20 20 20 20  ments.          
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c950: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66             ** of
c960: 20 61 20 33 2d 77 61 79 20 6f 72 20 6d 6f 72 65   a 3-way or more
c970: 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 20   compound */.   
c980: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c990: 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20  pLimit==0 );    
c9a0: 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
c9b0: 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
c9c0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
c9d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
c9e0: 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a  set==0 );     /*
c9f0: 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
ca00: 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
ca10: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69  s */.        uni
ca20: 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 50 61  onTab = dest.iPa
ca30: 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
ca40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
ca50: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
ca60: 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
ca70: 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
ca80: 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
ca90: 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
caa0: 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
cab0: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
cac0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
cad0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ab++;.        as
cae0: 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
caf0: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y==0 );.        
cb00: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
cb10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
cb20: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e  penEphemeral, un
cb30: 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
cb40: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
cb50: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
cb60: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
cb70: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
cb80: 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
cb90: 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
cba0: 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
cbb0: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
cbc0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
cbd0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
cbe0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
cbf0: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
cc00: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
cc10: 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
cc20: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
cc30: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
cc40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
cc50: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75  electDestInit(&u
cc60: 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f  niondest, priorO
cc70: 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
cc80: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cc90: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
cca0: 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73  Prior, &uniondes
ccb0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
ccc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
ccd0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
cce0: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
ccf0: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
cd00: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
cd10: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a  tement.      */.
cd20: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
cd30: 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20  =TK_EXCEPT ){.  
cd40: 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45        op = SRT_E
cd50: 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c  xcept;.      }el
cd60: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
cd70: 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  rt( p->op==TK_UN
cd80: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  ION );.        o
cd90: 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
cda0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
cdb0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
cdc0: 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
cdd0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
cde0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
cdf0: 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
ce00: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
ce10: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
ce20: 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65     uniondest.eDe
ce30: 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 72  st = op;.      r
ce40: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
ce50: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e  t(pParse, p, &un
ce60: 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
ce70: 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
ce80: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
ce90: 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65   /* Query flatte
cea0: 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53  ning in sqlite3S
ceb0: 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65  elect() might re
cec0: 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79  fill p->pOrderBy
ced0: 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75  ..      ** Be su
cee0: 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e  re to delete p->
cef0: 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66  pOrderBy, theref
cf00: 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  ore, to avoid a 
cf10: 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a  memory leak. */.
cf20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
cf30: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
cf40: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
cf50: 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
cf60: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
cf70: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
cf80: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  r;.      p->pOrd
cf90: 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
cfa0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
cfb0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
cfc0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
cfd0: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
cfe0: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
cff0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
d000: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
d010: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
d020: 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  0;..      /* Con
d030: 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e  vert the data in
d040: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
d050: 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76  able into whatev
d060: 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  er form.      **
d070: 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
d080: 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
d090: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
d0a0: 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d  sert( unionTab==
d0b0: 64 65 73 74 2e 69 50 61 72 6d 20 7c 7c 20 64 65  dest.iParm || de
d0c0: 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
d0d0: 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  p );.      if( d
d0e0: 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
d0f0: 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  Op ){.        in
d100: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
d110: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
d120: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
d130: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
d140: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
d150: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
d160: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
d170: 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
d180: 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
d190: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
d1a0: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
d1b0: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67  ior;.          g
d1c0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
d1d0: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
d1e0: 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
d1f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d200: 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
d210: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
d220: 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74  );.        iCont
d230: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
d240: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
d250: 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
d260: 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
d270: 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
d280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d290: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
d2a0: 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  wind, unionTab, 
d2b0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
d2c0: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
d2d0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
d2e0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  (v);.        sel
d2f0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
d300: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
d310: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e  t, unionTab, p->
d320: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64         0, -1, &d
d350: 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
d360: 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
d370: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
d380: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
d390: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d3a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d3b0: 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Next, unionTab, 
d3c0: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  iStart);.       
d3d0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
d3e0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
d3f0: 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
d400: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d410: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
d420: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
d430: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
d440: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
d450: 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d  : assert( p->op=
d460: 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b  =TK_INTERSECT );
d470: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
d480: 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
d490: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
d4a0: 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
d4b0: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
d4c0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e  Offset;.      in
d4d0: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65  t addr;.      Se
d4e0: 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65  lectDest interse
d4f0: 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e  ctdest;.      in
d500: 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t r1;..      /* 
d510: 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66  INTERSECT is dif
d520: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
d530: 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20  others since it 
d540: 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
d550: 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
d560: 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
d570: 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
d580: 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
d590: 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e   ** by allocatin
d5a0: 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20  g the tables we 
d5b0: 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20  will need..     
d5c0: 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d   */.      tab1 =
d5d0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
d5e0: 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50  .      tab2 = pP
d5f0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
d600: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
d610: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20  OrderBy==0 );.. 
d620: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
d630: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d640: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
d650: 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  l, tab1, 0);.   
d660: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
d670: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
d680: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
d690: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
d6a0: 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
d6b0: 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c  >pRightmost->sel
d6c0: 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
d6d0: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20  Ephemeral;.     
d6e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
d6f0: 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  st );..      /* 
d700: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73  Code the SELECTs
d710: 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74   to our left int
d720: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
d730: 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20  e "tab1"..      
d740: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
d750: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
d760: 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53  intersectdest, S
d770: 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b  RT_Union, tab1);
d780: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d790: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
d7a0: 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72  , pPrior, &inter
d7b0: 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
d7c0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
d7d0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d7e0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
d7f0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
d800: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
d810: 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
d820: 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
d830: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
d840: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
d850: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
d860: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
d870: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  2, 0);.      ass
d880: 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
d890: 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[1] == -1 );
d8a0: 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
d8b0: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72  enEphm[1] = addr
d8c0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
d8d0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  r = 0;.      pLi
d8e0: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
d8f0: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
d900: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
d910: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
d920: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
d930: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  et = 0;.      in
d940: 74 65 72 73 65 63 74 64 65 73 74 2e 69 50 61 72  tersectdest.iPar
d950: 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20  m = tab2;.      
d960: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
d970: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69  ct(pParse, p, &i
d980: 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20  ntersectdest);. 
d990: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
d9a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
d9b0: 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
d9c0: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
d9d0: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
d9e0: 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ior;.      sqlit
d9f0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
da00: 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
da10: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
da20: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
da30: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
da40: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  t;..      /* Gen
da50: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
da60: 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
da70: 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
da80: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
da90: 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
daa0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
dab0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
dac0: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
dad0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
dae0: 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  {.        Select
daf0: 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
db00: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
db10: 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
db20: 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
db30: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67  Prior;.        g
db40: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
db50: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
db60: 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
db70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72       }.      iBr
db80: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
db90: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
dba0: 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
dbb0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
dbc0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70  l(v);.      comp
dbd0: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
dbe0: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
dbf0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
dc00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
dc10: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31   OP_Rewind, tab1
dc20: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
dc30: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
dc40: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
dc50: 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
dc60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dc70: 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20  2(v, OP_RowKey, 
dc80: 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  tab1, r1);.     
dc90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dca0: 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  p3(v, OP_NotFoun
dcb0: 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20  d, tab2, iCont, 
dcc0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
dcd0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
dce0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
dcf0: 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
dd00: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
dd10: 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20  ->pEList, tab1, 
dd20: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
dd30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dd40: 20 20 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26          0, -1, &
dd50: 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
dd60: 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
dd70: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
dd80: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
dd90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dda0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
ddb0: 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
ddc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ddd0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
dde0: 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
ddf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
de00: 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
de10: 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
de20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
de30: 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
de40: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
de50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
de60: 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  ..  /* Compute c
de70: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
de80: 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  es used by .  **
de90: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
dea0: 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
deb0: 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
dec0: 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
ded0: 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
dee0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
def0: 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
df00: 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
df10: 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20  This section is 
df20: 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74  run by the right
df30: 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
df40: 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a  tement only..  *
df50: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
df60: 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  nts to the left 
df70: 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73  always skip this
df80: 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68   part.  The righ
df90: 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45  t-most.  ** SELE
dfa0: 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b  CT might also sk
dfb0: 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20  ip this part if 
dfc0: 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20  it has no ORDER 
dfd0: 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20  BY clause and.  
dfe0: 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65  ** no temp table
dff0: 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a  s are required..
e000: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
e010: 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73  lFlags & SF_Uses
e020: 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20  Ephemeral ){.   
e030: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e050: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e060: 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
e070: 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  KeyInfo;        
e080: 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
e090: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
e0a0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
e0b0: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
e0c0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
e0d0: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
e0e0: 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20   through SELECT 
e0f0: 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
e100: 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f    CollSeq **apCo
e110: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
e120: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
e130: 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d  hrough pKeyInfo-
e140: 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20  >aColl[] */.    
e150: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e170: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
e180: 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
e190: 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
e1a0: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
e1b0: 70 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  p );.    nCol = 
e1c0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
e1d0: 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
e1e0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
e1f0: 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20  Zero(db,.       
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e210: 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
e220: 29 2b 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43  )+nCol*(sizeof(C
e230: 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a  ollSeq*) + 1));.
e240: 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
e250: 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
e260: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e270: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
e280: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
e290: 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e  ..    pKeyInfo->
e2a0: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
e2b0: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
e2c0: 65 6c 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b  eld = (u16)nCol;
e2d0: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61  ..    for(i=0, a
e2e0: 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  pColl=pKeyInfo->
e2f0: 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  aColl; i<nCol; i
e300: 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20  ++, apColl++){. 
e310: 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d       *apColl = m
e320: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
e330: 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
e340: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61  .      if( 0==*a
e350: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
e360: 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   *apColl = db->p
e370: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
e380: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
e390: 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b  (pLoop=p; pLoop;
e3a0: 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
e3b0: 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72  rior){.      for
e3c0: 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
e3d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
e3e0: 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  r = pLoop->addrO
e3f0: 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20  penEphm[i];.    
e400: 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29      if( addr<0 )
e410: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
e420: 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20  f [0] is unused 
e430: 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f  then [1] is also
e440: 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20   unused.  So we 
e450: 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  can.          **
e460: 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61   always safely a
e470: 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20  bort as soon as 
e480: 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64  the first unused
e490: 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a   slot is found *
e4a0: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
e4b0: 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  rt( pLoop->addrO
e4c0: 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a  penEphm[1]<0 );.
e4d0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
e4e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e4f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
e500: 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20  angeP2(v, addr, 
e510: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
e520: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
e530: 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P4(v, addr, (cha
e540: 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
e550: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
e560: 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65    pLoop->addrOpe
e570: 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20  nEphm[i] = -1;. 
e580: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e590: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e5a0: 62 2c 20 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  b, pKeyInfo);.  
e5b0: 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
e5c0: 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 4d  end:.  pDest->iM
e5d0: 65 6d 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b 0a  em = dest.iMem;.
e5e0: 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20    pDest->nMem = 
e5f0: 64 65 73 74 2e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  dest.nMem;.  sql
e600: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
e610: 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20  (db, pDelete);. 
e620: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
e630: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
e640: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
e650: 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ECT */../*.** Co
e660: 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62  de an output sub
e670: 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f  routine for a co
e680: 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
e690: 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53  tation of a.** S
e6a0: 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a  ELECT statment..
e6b0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74  **.** The data t
e6c0: 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63  o be output is c
e6d0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d  ontained in pIn-
e6e0: 3e 69 4d 65 6d 2e 20 20 54 68 65 72 65 20 61 72  >iMem.  There ar
e6f0: 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 4d 65 6d 20 63  e.** pIn->nMem c
e700: 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74  olumns to be out
e710: 70 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77  put.  pDest is w
e720: 68 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20  here the output 
e730: 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e  should.** be sen
e740: 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75  t..**.** regRetu
e750: 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  rn is the number
e760: 20 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72   of the register
e770: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62   holding the sub
e780: 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
e790: 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  n address..**.**
e7a0: 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
e7b0: 65 6e 20 69 74 20 69 73 20 61 20 74 68 65 20 66  en it is a the f
e7c0: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
e7d0: 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a   a vector that.*
e7e0: 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72  * records the pr
e7f0: 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
e800: 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20  mem[regPrev] is 
e810: 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66  a flag that is f
e820: 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65  alse.** if there
e830: 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65   has been no pre
e840: 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49  vious output.  I
e850: 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
e860: 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65   code is.** gene
e870: 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73  rated to suppres
e880: 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70  s duplicates.  p
e890: 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20  KeyInfo is used 
e8a0: 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a  for comparing.**
e8b0: 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   keys..**.** If 
e8c0: 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20  the LIMIT found 
e8d0: 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20  in p->iLimit is 
e8e0: 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d  reached, jump im
e8f0: 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20  mediately to.** 
e900: 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69  iBreak..*/.stati
e910: 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75  c int generateOu
e920: 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a  tputSubroutine(.
e930: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
e950: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
e960: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
e970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e980: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
e990: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  t */.  SelectDes
e9a0: 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f  t *pIn,        /
e9b0: 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70  * Coroutine supp
e9c0: 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  lying data */.  
e9d0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
e9e0: 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  t,      /* Where
e9f0: 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74   to send the dat
ea00: 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  a */.  int regRe
ea10: 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  turn,          /
ea20: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64  * The return add
ea30: 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f  ress register */
ea40: 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20  .  int regPrev, 
ea50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
ea60: 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65  evious result re
ea70: 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71  gister.  No uniq
ea80: 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20  ueness if 0 */. 
ea90: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
eaa0: 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  fo,      /* For 
eab0: 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70  comparing with p
eac0: 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f  revious entry */
ead0: 0a 20 20 69 6e 74 20 70 34 74 79 70 65 2c 20 20  .  int p4type,  
eae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
eaf0: 65 20 70 34 20 74 79 70 65 20 66 6f 72 20 70 4b  e p4 type for pK
eb00: 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20  eyInfo */.  int 
eb10: 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
eb20: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
eb30: 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c   if we hit the L
eb40: 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  IMIT */.){.  Vdb
eb50: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
eb60: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e  Vdbe;.  int iCon
eb70: 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64  tinue;.  int add
eb80: 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  r;..  addr = sql
eb90: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
eba0: 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69  ddr(v);.  iConti
ebb0: 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
ebc0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
ebd0: 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75    /* Suppress du
ebe0: 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49  plicates for UNI
ebf0: 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
ec00: 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a  INTERSECT .  */.
ec10: 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
ec20: 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b  .    int j1, j2;
ec30: 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
ec40: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
ec50: 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76  P_IfNot, regPrev
ec60: 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69  );.    j2 = sqli
ec70: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
ec80: 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e   OP_Compare, pIn
ec90: 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b  ->iMem, regPrev+
eca0: 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20  1, pIn->nMem,.  
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
ecd0: 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70 34 74  r*)pKeyInfo, p4t
ece0: 79 70 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ype);.    sqlite
ecf0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
ed00: 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43  P_Jump, j2+2, iC
ed10: 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a  ontinue, j2+2);.
ed20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
ed30: 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
ed40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
ed50: 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20  odeCopy(pParse, 
ed60: 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72  pIn->iMem, regPr
ed70: 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29  ev+1, pIn->nMem)
ed80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ed90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
eda0: 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65  teger, 1, regPre
edb0: 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  v);.  }.  if( pP
edc0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
edd0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
ede0: 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  0;..  /* Suppres
edf0: 73 20 74 68 65 20 74 68 65 20 66 69 72 73 74 20  s the the first 
ee00: 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69  OFFSET entries i
ee10: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46  f there is an OF
ee20: 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FSET clause.  */
ee30: 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
ee40: 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   p, iContinue);.
ee50: 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74  .  switch( pDest
ee60: 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f  ->eDest ){.    /
ee70: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
ee80: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
ee90: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
eea0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
eeb0: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
eec0: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
eed0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20   {.      int r1 
eee0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
eef0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
ef00: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
ef10: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
ef20: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73  arse);.      tes
ef30: 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44  tcase( pDest->eD
ef40: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
ef50: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ef60: 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
ef70: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
ef80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ef90: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
efa0: 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
efb0: 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 20  Mem, pIn->nMem, 
efc0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
efd0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
efe0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65  OP_NewRowid, pDe
eff0: 73 74 2d 3e 69 50 61 72 6d 2c 20 72 32 29 3b 0a  st->iParm, r2);.
f000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f010: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
f020: 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61  sert, pDest->iPa
f030: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
f040: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
f050: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
f060: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
f070: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
f080: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
f090: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f0a0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
f0b0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
f0c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
f0d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f0e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
f0f0: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
f100: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
f110: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
f120: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
f130: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
f140: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
f150: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
f160: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
f170: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
f180: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
f190: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
f1a0: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
f1b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
f1c0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t: {.      int r
f1d0: 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
f1e0: 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b   pIn->nMem==1 );
f1f0: 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69  .      p->affini
f200: 74 79 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73  ty = .         s
f210: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
f220: 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d  inity(p->pEList-
f230: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65  >a[0].pExpr, pDe
f240: 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20  st->affinity);. 
f250: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
f260: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
f270: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
f280: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
f290: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
f2a0: 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72 31 2c  In->iMem, 1, r1,
f2b0: 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31   &p->affinity, 1
f2c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f2d0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
f2e0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
f2f0: 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20  pIn->iMem, 1);. 
f300: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f310: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
f320: 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
f330: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
f340: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
f350: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
f360: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
f370: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f  .    }..#if 0  /
f380: 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f  * Never occurs o
f390: 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75  n an ORDER BY qu
f3a0: 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  ery */.    /* If
f3b0: 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
f3c0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
f3d0: 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
f3e0: 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
f3f0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
f400: 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
f410: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f420: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
f430: 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 50 61  r, 1, pDest->iPa
f440: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
f450: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
f460: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
f470: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
f480: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f490: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
f4a0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
f4b0: 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
f4c0: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
f4d0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
f4e0: 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
f4f0: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
f500: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
f510: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
f520: 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
f530: 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
f540: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
f550: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
f560: 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
f570: 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Mem==1 );.      
f580: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
f590: 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
f5a0: 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69 50  >iMem, pDest->iP
f5b0: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
f5c0: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
f5d0: 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
f5e0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
f5f0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
f600: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
f610: 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
f620: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
f630: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   */..    /* The 
f640: 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
f650: 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
f660: 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
f670: 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
f680: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2e 20 20 54   pDest->iMem.  T
f690: 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  hen the co-routi
f6a0: 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a  ne yields..    *
f6b0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  /.    case SRT_C
f6c0: 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  oroutine: {.    
f6d0: 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d 65    if( pDest->iMe
f6e0: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
f6f0: 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71  pDest->iMem = sq
f700: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
f710: 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
f720: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 44  Mem);.        pD
f730: 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d  est->nMem = pIn-
f740: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >nMem;.      }. 
f750: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f760: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
f770: 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73   pIn->iMem, pDes
f780: 74 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e  t->iMem, pDest->
f790: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  nMem);.      sql
f7a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
f7b0: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
f7c0: 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  t->iParm);.     
f7d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
f7e0: 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66     /* If none of
f7f0: 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e   the above, then
f800: 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74   the result dest
f810: 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a  ination must be.
f820: 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75      ** SRT_Outpu
f830: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
f840: 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
f850: 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a   with any other.
f860: 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69      ** destinati
f870: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
f880: 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61  e ones handled a
f890: 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70  bove or SRT_Outp
f8a0: 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ut..    **.    *
f8b0: 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  * For SRT_Output
f8c0: 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  , results are st
f8d0: 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
f8e0: 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ce of registers.
f8f0: 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74    .    ** Then t
f900: 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  he OP_ResultRow 
f910: 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74  opcode is used t
f920: 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f  o cause sqlite3_
f930: 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a  step() to.    **
f940: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74   return the next
f950: 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a   row of result..
f960: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
f970: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
f980: 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
f990: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
f9a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f9b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
f9c0: 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d  sultRow, pIn->iM
f9d0: 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a  em, pIn->nMem);.
f9e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f9f0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
fa00: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
fa10: 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65  ->iMem, pIn->nMe
fa20: 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
fa30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
fa40: 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   Jump to the end
fa50: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20   of the loop if 
fa60: 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61  the LIMIT is rea
fa70: 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ched..  */.  if(
fa80: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
fa90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
faa0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
fab0: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31 29  , p->iLimit, -1)
fac0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fad0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
fae0: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
faf0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 0a 20   iBreak);.  }.. 
fb00: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
fb10: 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
fb20: 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rn.  */.  sqlite
fb30: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
fb40: 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  l(v, iContinue);
fb50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
fb60: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
fb70: 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a  n, regReturn);..
fb80: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
fb90: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74  ../*.** Alternat
fba0: 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  ive compound sel
fbb0: 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ect code generat
fbc0: 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65  or for cases whe
fbd0: 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e  n there.** is an
fbe0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
fbf0: 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d  ..**.** We assum
fc00: 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  e a query of the
fc10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a   following form:
fc20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c  .**.**      <sel
fc30: 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72  ectA>  <operator
fc40: 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52  >  <selectB>  OR
fc50: 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c  DER BY <orderbyl
fc60: 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72  ist>.**.** <oper
fc70: 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20  ator> is one of 
fc80: 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e  UNION ALL, UNION
fc90: 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
fca0: 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65  ERSECT.  The ide
fcb0: 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20  a.** is to code 
fcc0: 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61  both <selectA> a
fcd0: 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74  nd <selectB> wit
fce0: 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
fcf0: 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72  lause as.** co-r
fd00: 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72  outines.  Then r
fd10: 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  un the co-routin
fd20: 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61  es in parallel a
fd30: 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73  nd merge the res
fd40: 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  ults.** into the
fd50: 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64   output.  In add
fd60: 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f  ition to the two
fd70: 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c   coroutines (cal
fd80: 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a  led selectA and.
fd90: 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72  ** selectB) ther
fda0: 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69  e are 7 subrouti
fdb0: 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  nes:.**.**    ou
fdc0: 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tA:    Move the 
fdd0: 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
fde0: 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20  lectA coroutine 
fdf0: 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
fe00: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
fe10: 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
fe20: 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  uery..**.**    o
fe30: 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utB:    Move the
fe40: 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
fe50: 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65  electB coroutine
fe60: 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
fe70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
fe80: 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
fe90: 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65  query.  (Only ge
fea0: 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f  nerated for UNIO
feb0: 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  N and.**        
fec0: 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20       UNION ALL. 
fed0: 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45   EXCEPT and INSE
fee0: 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74  RTSECT never out
fef0: 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a  put a row that.*
ff00: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70  *             ap
ff10: 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e  pears only in B.
ff20: 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a  ).**.**    AltB:
ff30: 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
ff40: 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
ff50: 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
ff60: 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a  es and A<B..**.*
ff70: 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61  *    AeqB:    Ca
ff80: 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
ff90: 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
ffa0: 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
ffb0: 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   A==B..**.**    
ffc0: 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AgtB:    Called 
ffd0: 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
ffe0: 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
fff0: 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e  outines and A>B.
10000 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  .**.**    EofA: 
10010 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
10020 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
10030 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a   from selectA..*
10040 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20  *.**    EofB:   
10050 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
10060 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
10070 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a  rom selectB..**.
10080 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
10090 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74  ation of the lat
100a0 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74  ter five subrout
100b0 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77  ines depend on w
100c0 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74  hich .** <operat
100d0 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a  or> is used:.**.
100e0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
100f0 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20    UNION ALL     
10100 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20      UNION       
10110 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20       EXCEPT     
10120 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a       INTERSECT.*
10130 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  *          -----
10140 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
10150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
10160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
10170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
10180 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41  *   AltB:   outA
10190 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
101a0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
101b0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
101c0 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20     nextA.**.**  
101d0 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AeqB:   outA, n
101e0 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
101f0 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  tA             n
10200 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74  extA         out
10210 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20  A, nextA.**.**  
10220 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e   AgtB:   outB, n
10230 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
10240 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e  nextB          n
10250 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20  extB            
10260 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f  nextB.**.**   Eo
10270 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  fA:   outB, next
10280 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
10290 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74  tB          halt
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c               hal
102b0 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20  t.**.**   EofB: 
102c0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
102d0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
102e0 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
102f0 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
10300 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c  .** In the AltB,
10310 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20   AeqB, and AgtB 
10320 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20  subroutines, an 
10330 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69  EOF on A followi
10340 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73  ng nextA.** caus
10350 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
10360 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64  jump to EofA and
10370 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c   an EOF on B fol
10380 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75  lowing nextB cau
10390 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69  ses.** an immedi
103a0 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42  ate jump to EofB
103b0 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61  .  Within EofA a
103c0 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46  nd EofB, and EOF
103d0 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20   on entry or.** 
103e0 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20  following nextX 
103f0 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f  causes a jump to
10400 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
10410 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e  select processin
10420 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61  g..**.** Duplica
10430 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68  te removal in th
10440 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  e UNION, EXCEPT,
10450 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63   and INTERSECT c
10460 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a  ases is handled.
10470 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75  ** within the ou
10480 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e  tput subroutine.
10490 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65    The regPrev re
104a0 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73  gister set holds
104b0 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a   the previously.
104c0 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e  ** output value.
104d0 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69    A comparison i
104e0 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74  s made against t
104f0 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68  his value and th
10500 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73  e output.** is s
10510 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65  kipped if the ne
10520 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64  xt results would
10530 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
10540 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a  the previous..**
10550 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
10560 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74  tation plan is t
10570 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
10580 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  two coroutines a
10590 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72  nd seven.** subr
105a0 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74  outines first, t
105b0 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74  hen put the cont
105c0 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65  rol logic at the
105d0 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74   bottom.  Like t
105e0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
105f0 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a      goto Init.**
10600 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74       coA: corout
10610 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65  ine for left que
10620 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f  ry (A).**     co
10630 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  B: coroutine for
10640 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29   right query (B)
10650 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74  .**    outA: out
10660 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41  put one row of A
10670 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74  .**    outB: out
10680 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42  put one row of B
10690 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f   (UNION and UNIO
106a0 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20  N ALL only).**  
106b0 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofA: ....**  
106c0 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofB: ....**  
106d0 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AltB: ....**  
106e0 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AeqB: ....**  
106f0 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AgtB: ....**  
10700 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69    Init: initiali
10710 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67  ze coroutine reg
10720 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20  isters.**       
10730 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20     yield coA.** 
10740 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
10750 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20  A) goto EofA.** 
10760 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
10770 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oB.**          i
10780 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f  f eof(B) goto Eo
10790 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43  fB.**    Cmpr: C
107a0 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20  ompare A, B.**  
107b0 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74          Jump Alt
107c0 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a  B, AeqB, AgtB.**
107d0 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a       End: ....**
107e0 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42  .** We call AltB
107f0 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f  , AeqB, AgtB, Eo
10800 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75  fA, and EofB "su
10810 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74  broutines" but t
10820 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  hey are not.** a
10830 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75  ctually called u
10840 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74  sing Gosub and t
10850 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72  hey do not Retur
10860 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  n.  EofA and Eof
10870 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20  B loop.** until 
10880 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61  all data is exha
10890 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20  usted then jump 
108a0 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62  to the "end" lab
108b0 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a  e.  AltB, AeqB,.
108c0 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70  ** and AgtB jump
108d0 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72   to either L2 or
108e0 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20   to one of EofA 
108f0 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e  or EofB..*/.#ifn
10900 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10910 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
10920 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
10930 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
10940 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10950 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
10960 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
10970 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
10980 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
10990 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
109a0 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
109b0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
109c0 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
109d0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
109e0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
109f0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
10a00 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10a10 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65  counters */.  Se
10a20 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
10a30 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
10a40 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
10a50 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
10a60 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
10a70 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
10a80 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
10a90 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
10aa0 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20  ctDest destA;   
10ab0 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
10ac0 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41   for coroutine A
10ad0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
10ae0 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44   destB;     /* D
10af0 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
10b00 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20  oroutine B */.  
10b10 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20  int regAddrA;   
10b20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10b30 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
10b40 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
10b50 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66   */.  int regEof
10b60 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  A;          /* F
10b70 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20  lag to indicate 
10b80 77 68 65 6e 20 73 65 6c 65 63 74 2d 41 20 69 73  when select-A is
10b90 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69   complete */.  i
10ba0 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20  nt regAddrB;    
10bb0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
10bc0 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
10bd0 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
10be0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 42  */.  int regEofB
10bf0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  ;          /* Fl
10c00 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  ag to indicate w
10c10 68 65 6e 20 73 65 6c 65 63 74 2d 42 20 69 73 20  hen select-B is 
10c20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  complete */.  in
10c30 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20  t addrSelectA;  
10c40 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
10c50 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63  f the select-A c
10c60 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
10c70 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20  t addrSelectB;  
10c80 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
10c90 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63  f the select-B c
10ca0 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
10cb0 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20  t regOutA;      
10cc0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
10cd0 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
10ce0 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
10cf0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
10d00 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f  OutB;          /
10d10 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
10d20 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
10d30 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
10d40 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41  /.  int addrOutA
10d50 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
10d60 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
10d70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
10d80 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
10d90 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64  B = 0;     /* Ad
10da0 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
10db0 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
10dc0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
10dd0 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fA;         /* A
10de0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
10df0 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64  lect-A-exhausted
10e00 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
10e10 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20   int addrEofB;  
10e20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
10e30 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
10e40 42 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  B-exhausted subr
10e50 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10e60 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20  addrAltB;       
10e70 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10e80 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69  the A<B subrouti
10e90 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
10ea0 41 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AeqB;         /*
10eb0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
10ec0 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  A==B subroutine 
10ed0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74  */.  int addrAgt
10ee0 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
10ef0 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42  dress of the A>B
10f00 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
10f10 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20   int regLimitA; 
10f20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
10f30 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
10f40 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
10f50 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20  egLimitB;       
10f60 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
10f70 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
10f80 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
10f90 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
10fa0 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
10fb0 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69  rs to hold previ
10fc0 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  ous output */.  
10fd0 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20  int savedLimit; 
10fe0 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
10ff0 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69  alue of p->iLimi
11000 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
11010 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
11020 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
11030 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69  ->iOffset */.  i
11040 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20  nt labelCmpr;   
11050 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
11060 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  r the start of t
11070 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74  he merge algorit
11080 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  hm */.  int labe
11090 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  lEnd;         /*
110a0 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65   Label for the e
110b0 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c  nd of the overal
110c0 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f  l SELECT stmt */
110d0 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20  .  int j1;      
110e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
110f0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68   instructions th
11100 61 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74  at get retargett
11110 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  ed */.  int op; 
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11130 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20   One of TK_ALL, 
11140 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
11150 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43  EPT, TK_INTERSEC
11160 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  T */.  KeyInfo *
11170 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20  pKeyDup = 0; /* 
11180 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72  Comparison infor
11190 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  mation for dupli
111a0 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a  cate removal */.
111b0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d    KeyInfo *pKeyM
111c0 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61  erge;   /* Compa
111d0 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
111e0 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f  n for merging ro
111f0 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ws */.  sqlite3 
11200 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *db;          /*
11210 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
11220 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69  tion */.  ExprLi
11230 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
11240 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
11250 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
11260 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
11270 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
11280 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
11290 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
112a0 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20   int *aPermute; 
112b0 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e         /* Mappin
112c0 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20  g from ORDER BY 
112d0 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20  terms to result 
112e0 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a  set columns */..
112f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
11300 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
11310 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30  sert( pKeyDup==0
11320 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22   ); /* "Managed"
11330 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73   code needs this
11340 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e  .  Ticket #3382.
11350 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
11360 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61  e->db;.  v = pPa
11370 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
11380 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
11390 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74      /* Already t
113a0 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20  hrown the error 
113b0 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61  if VDBE alloc fa
113c0 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45  iled */.  labelE
113d0 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
113e0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
113f0 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69  labelCmpr = sqli
11400 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
11410 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63  (v);...  /* Patc
11420 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42  h up the ORDER B
11430 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  Y clause.  */.  
11440 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20  op = p->op;  .  
11450 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
11460 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
11470 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rior->pOrderBy==
11480 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  0 );.  pOrderBy 
11490 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
114a0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
114b0 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  y );.  nOrderBy 
114c0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
114d0 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65  r;..  /* For ope
114e0 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61  rators other tha
114f0 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68  n UNION ALL we h
11500 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ave to make sure
11510 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f   that.  ** the O
11520 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
11530 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d  overs every term
11540 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
11550 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65  et.  Add.  ** te
11560 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  rms to the ORDER
11570 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65   BY clause as ne
11580 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
11590 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  if( op!=TK_ALL )
115a0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64  {.    for(i=1; d
115b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
115c0 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69  =0 && i<=p->pELi
115d0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
115e0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
115f0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
11600 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  em;.      for(j=
11610 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
11620 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79  y->a; j<nOrderBy
11630 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
11640 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11650 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 29   pItem->iCol>0 )
11660 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
11670 74 65 6d 2d 3e 69 43 6f 6c 3d 3d 69 20 29 20 62  tem->iCol==i ) b
11680 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
11690 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65      if( j==nOrde
116a0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45  rBy ){.        E
116b0 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
116c0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
116d0 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20  NTEGER, 0);.    
116e0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
116f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
11700 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
11710 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
11720 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
11730 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20     pNew->iTable 
11740 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  = i;.        pOr
11750 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
11760 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
11770 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
11780 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  pNew);.        p
11790 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65  OrderBy->a[nOrde
117a0 72 42 79 2b 2b 5d 2e 69 43 6f 6c 20 3d 20 28 75  rBy++].iCol = (u
117b0 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  16)i;.      }.  
117c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
117d0 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72  mpute the compar
117e0 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e  ison permutation
117f0 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61   and keyinfo tha
11800 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20  t is used with. 
11810 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74   ** the permutat
11820 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65  ion used to dete
11830 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78  rmine if the nex
11840 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65  t.  ** row of re
11850 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d  sults comes from
11860 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65   selectA or sele
11870 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65  ctB.  Also add e
11880 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c  xplicit.  ** col
11890 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f  lations to the O
118a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
118b0 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65  erms so that whe
118c0 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73  n the subqueries
118d0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67  .  ** to the rig
118e0 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20  ht and the left 
118f0 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74  are evaluated, t
11900 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72  hey use the corr
11910 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  ect.  ** collati
11920 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d  on..  */.  aPerm
11930 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ute = sqlite3DbM
11940 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
11950 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42  eof(int)*nOrderB
11960 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75  y);.  if( aPermu
11970 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  te ){.    struct
11980 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
11990 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69  pItem;.    for(i
119a0 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
119b0 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42  By->a; i<nOrderB
119c0 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; i++, pItem++)
119d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
119e0 70 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 20 26  pItem->iCol>0  &
119f0 26 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3c 3d 70  & pItem->iCol<=p
11a00 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
11a10 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
11a20 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 69 43  e[i] = pItem->iC
11a30 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ol - 1;.    }.  
11a40 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20    pKeyMerge =.  
11a50 20 20 20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c      sqlite3DbMal
11a60 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
11a70 66 28 2a 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f  f(*pKeyMerge)+nO
11a80 72 64 65 72 42 79 2a 28 73 69 7a 65 6f 66 28 43  rderBy*(sizeof(C
11a90 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20  ollSeq*)+1));.  
11aa0 20 20 69 66 28 20 70 4b 65 79 4d 65 72 67 65 20    if( pKeyMerge 
11ab0 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72  ){.      pKeyMer
11ac0 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  ge->aSortOrder =
11ad0 20 28 75 38 2a 29 26 70 4b 65 79 4d 65 72 67 65   (u8*)&pKeyMerge
11ae0 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79  ->aColl[nOrderBy
11af0 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72  ];.      pKeyMer
11b00 67 65 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31  ge->nField = (u1
11b10 36 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  6)nOrderBy;.    
11b20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 65 6e 63    pKeyMerge->enc
11b30 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
11b40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
11b50 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
11b60 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
11b70 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 45 78 70  oll;.        Exp
11b80 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65  r *pTerm = pOrde
11b90 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
11ba0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
11bb0 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  rm->flags & EP_E
11bc0 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  xpCollate ){.   
11bd0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
11be0 54 65 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  Term->pColl;.   
11bf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11c00 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75        pColl = mu
11c10 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
11c20 28 70 50 61 72 73 65 2c 20 70 2c 20 61 50 65 72  (pParse, p, aPer
11c30 6d 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  mute[i]);.      
11c40 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73      pTerm->flags
11c50 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
11c60 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  e;.          pTe
11c70 72 6d 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c  rm->pColl = pCol
11c80 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  l;.        }.   
11c90 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e       pKeyMerge->
11ca0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c  aColl[i] = pColl
11cb0 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65  ;.        pKeyMe
11cc0 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  rge->aSortOrder[
11cd0 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  i] = pOrderBy->a
11ce0 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
11cf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11d00 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65  else{.    pKeyMe
11d10 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rge = 0;.  }..  
11d20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20  /* Reattach the 
11d30 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11d40 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  to the query..  
11d50 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  */.  p->pOrderBy
11d60 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
11d70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
11d80 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
11d90 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  tDup(pParse->db,
11da0 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a   pOrderBy, 0);..
11db0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
11dc0 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61  range of tempora
11dd0 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ry registers and
11de0 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65   the KeyInfo nee
11df0 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ded.  ** for the
11e00 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f   logic that remo
11e10 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72 65  ves duplicate re
11e20 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74  sult rows when t
11e30 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  he.  ** operator
11e40 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50   is UNION, EXCEP
11e50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20  T, or INTERSECT 
11e60 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41  (but not UNION A
11e70 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  LL)..  */.  if( 
11e80 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
11e90 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20    regPrev = 0;. 
11ea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
11eb0 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  nExpr = p->pELis
11ec0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73  t->nExpr;.    as
11ed0 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d  sert( nOrderBy>=
11ee0 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  nExpr || db->mal
11ef0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
11f00 20 72 65 67 50 72 65 76 20 3d 20 73 71 6c 69 74   regPrev = sqlit
11f10 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
11f20 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 31 29 3b  Parse, nExpr+1);
11f30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11f40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
11f50 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76  eger, 0, regPrev
11f60 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d  );.    pKeyDup =
11f70 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
11f80 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20  Zero(db,.       
11f90 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
11fa0 66 28 2a 70 4b 65 79 44 75 70 29 20 2b 20 6e 45  f(*pKeyDup) + nE
11fb0 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  xpr*(sizeof(Coll
11fc0 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20  Seq*)+1) );.    
11fd0 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
11fe0 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53       pKeyDup->aS
11ff0 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
12000 26 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b  &pKeyDup->aColl[
12010 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b  nExpr];.      pK
12020 65 79 44 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  eyDup->nField = 
12030 28 75 31 36 29 6e 45 78 70 72 3b 0a 20 20 20 20  (u16)nExpr;.    
12040 20 20 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d    pKeyDup->enc =
12050 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20   ENC(db);.      
12060 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
12070 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
12080 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69  pKeyDup->aColl[i
12090 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
120a0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
120b0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  , i);.        pK
120c0 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
120d0 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
120e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20  }.    }.  }. .  
120f0 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20  /* Separate the 
12100 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67  left and the rig
12110 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e  ht query from on
12120 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20  e another.  */. 
12130 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
12140 20 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74    pPrior->pRight
12150 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  most = 0;.  sqli
12160 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
12170 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
12180 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  , p->pOrderBy, "
12190 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70  ORDER");.  if( p
121a0 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
121b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
121c0 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
121d0 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  By(pParse, pPrio
121e0 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  r, pPrior->pOrde
121f0 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
12200 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
12210 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
12220 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  ters */.  comput
12230 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
12240 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c  pParse, p, label
12250 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
12260 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f  Limit && op==TK_
12270 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69  ALL ){.    regLi
12280 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitA = ++pParse-
12290 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69  >nMem;.    regLi
122a0 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitB = ++pParse-
122b0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
122c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
122d0 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66  OP_Copy, p->iOff
122e0 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74  set ? p->iOffset
122f0 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a  +1 : p->iLimit,.
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20    regLimitA);.  
12330 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12340 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
12350 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69  regLimitA, regLi
12360 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mitB);.  }else{.
12370 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
12380 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20  regLimitB = 0;. 
12390 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
123a0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
123b0 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d  imit);.  p->pLim
123c0 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  it = 0;.  sqlite
123d0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
123e0 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70  p->pOffset);.  p
123f0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->pOffset = 0;..
12400 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70    regAddrA = ++p
12410 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
12420 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73  egEofA = ++pPars
12430 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64  e->nMem;.  regAd
12440 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drB = ++pParse->
12450 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20  nMem;.  regEofB 
12460 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
12470 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
12480 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12490 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
124a0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
124b0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
124c0 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
124d0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
124e0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
124f0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
12500 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
12510 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
12520 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68   /* Jump past th
12530 65 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75  e various subrou
12540 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74  tines and corout
12550 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e  ines to the main
12560 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70  .  ** merge loop
12570 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c  .  */.  j1 = sql
12580 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
12590 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64  , OP_Goto);.  ad
125a0 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69  drSelectA = sqli
125b0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
125c0 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65  dr(v);...  /* Ge
125d0 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
125e0 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
125f0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
12600 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ent to the.  ** 
12610 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  left of the comp
12620 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20  ound operator - 
12630 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a  the "A" select..
12640 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
12650 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
12660 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  n coroutine for 
12670 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
12680 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
12690 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20   = regLimitA;.  
126a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
126b0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
126c0 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  estA);.  sqlite3
126d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
126e0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
126f0 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofA);.  sqlite3
12700 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12710 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
12720 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  );.  VdbeNoopCom
12730 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f  ment((v, "End co
12740 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
12750 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f   SELECT"));..  /
12760 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
12770 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
12780 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
12790 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a  atement on .  **
127a0 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65   the right - the
127b0 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f   "B" select.  */
127c0 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d  .  addrSelectB =
127d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
127e0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 56 64  entAddr(v);.  Vd
127f0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
12800 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69  , "Begin corouti
12810 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c  ne for right SEL
12820 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c  ECT"));.  savedL
12830 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
12840 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20  ;.  savedOffset 
12850 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
12860 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  p->iLimit = regL
12870 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66  imitB;.  p->iOff
12880 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 73 71 6c  set = 0;  .  sql
12890 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
128a0 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20  e, p, &destB);. 
128b0 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76   p->iLimit = sav
128c0 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f  edLimit;.  p->iO
128d0 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66  ffset = savedOff
128e0 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  set;.  sqlite3Vd
128f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12900 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f  nteger, 1, regEo
12910 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fB);.  sqlite3Vd
12920 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
12930 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b  ield, regAddrB);
12940 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
12950 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f  nt((v, "End coro
12960 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
12970 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a  SELECT"));..  /*
12980 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
12990 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
129a0 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
129b0 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a  row of the A.  *
129c0 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
129d0 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
129e0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
129f0 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56  select..  */.  V
12a00 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
12a10 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
12a20 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61  ne for A"));.  a
12a30 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61  ddrOutA = genera
12a40 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
12a50 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
12a60 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
12a70 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65  destA, pDest, re
12a80 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20  gOutA,.         
12a90 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
12aa0 20 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59   pKeyDup, P4_KEY
12ab0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c 61  INFO_HANDOFF, la
12ac0 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a  belEnd);.  .  /*
12ad0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
12ae0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
12af0 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
12b00 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a  row of the B.  *
12b10 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
12b20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
12b30 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
12b40 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69  select..  */.  i
12b50 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
12b60 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
12b70 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
12b80 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
12b90 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29   routine for B")
12ba0 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20  );.    addrOutB 
12bb0 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
12bc0 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
12bd0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
12be0 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70      p, &destB, p
12bf0 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20  Dest, regOutB,. 
12c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c10 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
12c20 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41  , P4_KEYINFO_STA
12c30 54 49 43 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  TIC, labelEnd);.
12c40 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
12c50 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
12c60 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
12c70 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
12c80 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65  ect A.  ** are e
12c90 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
12ca0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
12cb0 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   B remains..  */
12cc0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
12cd0 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75  nt((v, "eof-A su
12ce0 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 69  broutine"));.  i
12cf0 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  f( op==TK_EXCEPT
12d00 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
12d10 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
12d20 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64  EofA = sqlite3Vd
12d30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
12d40 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64  oto, 0, labelEnd
12d50 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  );.  }else{  .  
12d60 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
12d70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12d80 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42  , OP_If, regEofB
12d90 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20  , labelEnd);.   
12da0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12db0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
12dc0 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
12dd0 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B);.    sqlite3V
12de0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12df0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29  Yield, regAddrB)
12e00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12e10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
12e20 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29  to, 0, addrEofA)
12e30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
12e40 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
12e50 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
12e60 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
12e70 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65  elect B.  ** are
12e80 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
12e90 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
12ea0 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct A remains..  
12eb0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
12ec0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
12ed0 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72   addrEofB = addr
12ee0 45 6f 66 41 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  EofA;.  }else{  
12ef0 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
12f00 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20  ment((v, "eof-B 
12f10 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
12f20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71     addrEofB = sq
12f30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12f40 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
12f50 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  A, labelEnd);.  
12f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12f70 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
12f80 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
12f90 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
12fa0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12fb0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
12fc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12fd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
12fe0 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42  oto, 0, addrEofB
12ff0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
13000 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
13010 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
13020 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A<B.  */.  Vdbe
13030 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
13040 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-lt-B subrouti
13050 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74  ne"));.  addrAlt
13060 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
13070 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
13080 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
13090 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  OutA);.  sqlite3
130a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
130b0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
130c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
130d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
130e0 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f   regEofA, addrEo
130f0 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
13100 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
13110 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
13120 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
13130 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
13140 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
13150 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
13160 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
13170 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
13180 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
13190 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
131a0 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
131b0 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
131c0 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
131d0 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
131e0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
131f0 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
13200 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
13210 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
13220 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
13230 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
13240 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13250 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
13260 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72  f, regEofA, addr
13270 45 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  EofA);.    sqlit
13280 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13290 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
132a0 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lCmpr);.  }..  /
132b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
132c0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
132d0 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20  se of A>B.  */. 
132e0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
132f0 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62  ((v, "A-gt-B sub
13300 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
13310 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33  drAgtB = sqlite3
13320 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
13330 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  v);.  if( op==TK
13340 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
13350 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  NION ){.    sqli
13360 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13370 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
13380 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
13390 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
133a0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
133b0 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20  ld, regAddrB);. 
133c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
133d0 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
133e0 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  EofB, addrEofB);
133f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13400 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
13410 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
13420 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
13430 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69  runs once to ini
13440 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69  tialize everythi
13450 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ng..  */.  sqlit
13460 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
13470 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , j1);.  sqlite3
13480 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13490 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
134a0 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofA);.  sqlite3
134b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
134c0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
134d0 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofB);.  sqlite3
134e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
134f0 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 41  _Gosub, regAddrA
13500 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a  , addrSelectA);.
13510 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13520 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
13530 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 53   regAddrB, addrS
13540 65 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69 74  electB);.  sqlit
13550 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13560 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
13570 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c  addrEofA);.  sql
13580 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13590 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42  , OP_If, regEofB
135a0 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20  , addrEofB);..  
135b0 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65  /* Implement the
135c0 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70   main merge loop
135d0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
135e0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
135f0 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  v, labelCmpr);. 
13600 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13610 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61  p4(v, OP_Permuta
13620 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28  tion, 0, 0, 0, (
13630 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20  char*)aPermute, 
13640 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20  P4_INTARRAY);.  
13650 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13660 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
13670 20 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65 73   destA.iMem, des
13680 74 42 2e 69 4d 65 6d 2c 20 6e 4f 72 64 65 72 42  tB.iMem, nOrderB
13690 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
136a0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
136b0 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34  r*)pKeyMerge, P4
136c0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
136d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
136e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
136f0 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64  p, addrAltB, add
13700 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29  rAeqB, addrAgtB)
13710 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  ;..  /* Release 
13720 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
13730 65 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ers.  */.  if( r
13740 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 73 71  egPrev ){.    sq
13750 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
13760 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
13770 67 50 72 65 76 2c 20 6e 4f 72 64 65 72 42 79 2b  gPrev, nOrderBy+
13780 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  1);.  }..  /* Ju
13790 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70  mp to the this p
137a0 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  oint in order to
137b0 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71   terminate the q
137c0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  uery..  */.  sql
137d0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
137e0 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64  abel(v, labelEnd
137f0 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
13800 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
13810 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  t columns.  */. 
13820 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
13830 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
13840 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69  .    Select *pFi
13850 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  rst = pPrior;.  
13860 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
13870 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
13880 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
13890 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  r;.    generateC
138a0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
138b0 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
138c0 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
138d0 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20   Reassembly the 
138e0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73  compound query s
138f0 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
13900 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c  e freed correctl
13910 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61  y.  ** by the ca
13920 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
13930 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
13940 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
13950 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
13960 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d   p->pPrior);.  }
13970 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
13980 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54  Prior;..  /*** T
13990 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72  BD:  Insert subr
139a0 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20  outine calls to 
139b0 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e  close cursors on
139c0 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a   incomplete.  **
139d0 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a  ** subqueries **
139e0 2a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  **/.  return SQL
139f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
13a00 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
13a10 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
13a20 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
13a30 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
13a40 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  W)./* Forward De
13a50 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  clarations */.st
13a60 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
13a70 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a  xprList(sqlite3*
13a80 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74  , ExprList*, int
13a90 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
13aa0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
13ab0 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20  elect(sqlite3*, 
13ac0 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45  Select *, int, E
13ad0 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a  xprList *);../*.
13ae0 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
13af0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
13b00 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
13b10 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
13b20 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
13b30 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
13b40 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
13b50 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
13b60 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
13b70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
13b80 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
13b90 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
13ba0 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
13bb0 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
13bc0 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
13bd0 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
13be0 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
13bf0 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
13c00 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
13c10 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
13c20 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
13c30 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
13c40 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
13c50 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
13c60 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
13c70 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
13c80 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
13c90 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
13ca0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20  is routine make 
13cb0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a  the necessary .*
13cc0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78  * changes to pEx
13cd0 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65  pr so that it re
13ce0 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
13cf0 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
13d00 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71  e.** of the subq
13d10 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20  uery rather the 
13d20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
13d30 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
13d40 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73  tatic Expr *subs
13d50 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  tExpr(.  sqlite3
13d60 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
13d70 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
13d80 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e  rors to this con
13d90 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
13da0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
13db0 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
13dc0 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
13dd0 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ccurs */.  int i
13de0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Table,         /
13df0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
13e00 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
13e10 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
13e20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
13e30 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
13e40 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
13e50 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
13e60 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
13e70 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
13e80 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
13e90 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
13ea0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
13eb0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
13ec0 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
13ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
13ee0 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
13ef0 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
13f00 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
13f10 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
13f20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13f30 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
13f40 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
13f50 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ht==0 );.      p
13f60 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
13f70 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
13f80 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
13f90 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  n].pExpr, 0);.  
13fa0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
13fb0 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
13fc0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
13fd0 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  pNew;.    }.  }e
13fe0 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  lse{.    pExpr->
13ff0 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
14000 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  r(db, pExpr->pLe
14010 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
14020 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  st);.    pExpr->
14030 70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78  pRight = substEx
14040 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52  pr(db, pExpr->pR
14050 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
14060 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45  List);.    if( E
14070 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
14080 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
14090 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62  ct) ){.      sub
140a0 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78  stSelect(db, pEx
140b0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69  pr->x.pSelect, i
140c0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
140d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
140e0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
140f0 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  b, pExpr->x.pLis
14100 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
14110 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
14120 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
14130 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
14140 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c  tExprList(.  sql
14150 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
14160 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
14170 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
14180 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
14190 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist,     /* List
141a0 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
141b0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
141c0 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69  bstitutes */.  i
141d0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
141e0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
141f0 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
14200 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
14210 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
14220 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
14230 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
14240 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
14250 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
14260 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
14270 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74   i++){.    pList
14280 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
14290 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69  ubstExpr(db, pLi
142a0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
142b0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
142c0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
142d0 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
142e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
142f0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
14300 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68   malloc errors h
14310 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ere */.  Select 
14320 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
14330 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
14340 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  t in which to ma
14350 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  ke substitutions
14360 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
14370 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
14380 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  ble to be replac
14390 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
143a0 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20   *pEList     /* 
143b0 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
143c0 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  s */.){.  SrcLis
143d0 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
143e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
143f0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
14400 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
14410 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  n;.  substExprLi
14420 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  st(db, p->pEList
14430 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
14440 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
14450 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  st(db, p->pGroup
14460 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
14470 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
14480 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64  List(db, p->pOrd
14490 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  erBy, iTable, pE
144a0 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76  List);.  p->pHav
144b0 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
144c0 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
144d0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
144e0 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73  .  p->pWhere = s
144f0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
14500 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20  pWhere, iTable, 
14510 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
14520 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50  Select(db, p->pP
14530 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  rior, iTable, pE
14540 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20  List);.  pSrc = 
14550 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
14560 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45  t( pSrc );  /* E
14570 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20  ven for (SELECT 
14580 31 29 20 77 65 20 68 61 76 65 3a 20 70 53 72 63  1) we have: pSrc
14590 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53  !=0 but pSrc->nS
145a0 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41  rc==0 */.  if( A
145b0 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20  LWAYS(pSrc) ){. 
145c0 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
145d0 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d  Src, pItem=pSrc-
145e0 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
145f0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75  tem++){.      su
14600 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49  bstSelect(db, pI
14610 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54  tem->pSelect, iT
14620 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
14630 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
14640 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
14650 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
14660 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
14670 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
14680 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  ) */..#if !defin
14690 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
146a0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
146b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
146c0 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69  _VIEW)./*.** Thi
146d0 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
146e0 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
146f0 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65  bqueries in orde
14700 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78  r to speed.** ex
14710 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74  ecution.  It ret
14720 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
14730 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
14740 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
14750 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  g.** occurs..**.
14760 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
14770 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
14780 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
14790 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
147a0 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
147b0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
147c0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
147d0 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
147e0 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
147f0 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
14800 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
14810 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
14820 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
14830 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
14840 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
14850 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
14860 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
14870 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
14880 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
14890 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
148a0 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
148b0 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
148c0 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
148d0 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
148e0 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
148f0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14900 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
14910 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
14920 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
14930 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
14940 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
14950 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14960 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
14970 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
14980 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
14990 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
149a0 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
149b0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
149c0 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
149d0 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
149e0 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
149f0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
14a00 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
14a10 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20  s simpification 
14a20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
14a30 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
14a40 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
14a50 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
14a60 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
14a70 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
14a80 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
14a90 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
14aa0 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
14ab0 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
14ac0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
14ad0 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
14ae0 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
14af0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
14b00 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
14b10 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
14b20 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
14b30 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
14b40 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
14b50 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
14b60 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
14b70 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
14b80 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
14b90 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
14ba0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20  n..**.**   (3)  
14bb0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
14bc0 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70  not the right op
14bd0 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
14be0 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20  outer join.**   
14bf0 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79       (Originally
14c00 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20 20 53   ticket #306.  S
14c10 74 72 65 6e 67 68 74 65 6e 65 64 20 62 79 20 74  trenghtened by t
14c20 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a  icket #3300).**.
14c30 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
14c40 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
14c50 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75  STINCT or the ou
14c60 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
14c70 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
14c80 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75 65   (5)  The subque
14c90 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
14ca0 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
14cb0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
14cc0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
14cd0 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
14ce0 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65   (6)  The subque
14cf0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
14d00 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
14d10 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
14d20 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
14d30 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
14d40 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65   (7)  The subque
14d50 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c  ry has a FROM cl
14d60 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38  ause..**.**   (8
14d70 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
14d80 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
14d90 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
14da0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
14db0 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29  oin..**.**   (9)
14dc0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
14dd0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
14de0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
14df0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
14e00 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
14e10 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
14e20 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72  10)  The subquer
14e30 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
14e40 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
14e50 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
14e60 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
14e70 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a  use LIMIT..**.**
14e80 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71    (11)  The subq
14e90 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
14ea0 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
14eb0 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20  both have ORDER 
14ec0 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  BY clauses..**.*
14ed0 2a 20 20 28 31 32 29 20 20 4e 6f 74 20 69 6d 70  *  (12)  Not imp
14ee0 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75  lemented.  Subsu
14ef0 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63  med into restric
14f00 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70  tion (3).  Was p
14f10 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20  reviously.**    
14f20 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72      a separate r
14f30 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76  estriction deriv
14f40 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20  ing from ticket 
14f50 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33  #350..**.**  (13
14f60 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
14f70 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20  and outer query 
14f80 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
14f90 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34  LIMIT.**.**  (14
14fa0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
14fb0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46  does not use OFF
14fc0 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  SET.**.**  (15) 
14fd0 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
14fe0 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
14ff0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
15000 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  t or the.**     
15010 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73     subquery does
15020 20 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 61   not have both a
15030 6e 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 61  n ORDER BY and a
15040 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a   LIMIT clause..*
15050 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69  *        (See ti
15060 63 6b 65 74 20 23 32 33 33 39 29 0a 2a 2a 0a 2a  cket #2339).**.*
15070 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f 75 74  *  (16)  The out
15080 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
15090 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
150a0 74 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  the subquery doe
150b0 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20  s.**        not 
150c0 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
150d0 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32  .  (Ticket #2942
150e0 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20  )  This used to 
150f0 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20  not matter.**   
15100 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e       until we in
15110 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f  troduced the gro
15120 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63  up_concat() func
15130 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28  tion.  .**.**  (
15140 31 37 29 20 20 54 68 65 20 73 75 62 2d 71 75 65  17)  The sub-que
15150 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70  ry is not a comp
15160 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20  ound select, or 
15170 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c  it is a UNION AL
15180 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d  L .**        com
15190 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64  pound clause mad
151a0 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66  e up entirely of
151b0 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71   non-aggregate q
151c0 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20  ueries, and .** 
151d0 20 20 20 20 20 20 20 74 68 65 20 70 61 72 65 6e         the paren
151e0 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  t query:.**.**  
151f0 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
15200 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20   itself part of 
15210 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
15220 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  t,.**          *
15230 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
15240 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54  gate or DISTINCT
15250 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20   query, and.**  
15260 20 20 20 20 20 20 20 20 2a 20 68 61 73 20 6e 6f          * has no
15270 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 6f 72   other tables or
15280 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20   sub-selects in 
15290 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
152a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
152b0 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
152c0 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
152d0 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
152e0 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
152f0 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
15300 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
15310 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
15320 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
15330 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
15340 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
15350 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38  uses..**.**  (18
15360 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
15370 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
15380 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61  d select, then a
15390 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ll terms of the.
153a0 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  **        ORDER 
153b0 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  by clause of the
153c0 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
153d0 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65  simple reference
153e0 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20  s to .**        
153f0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73  columns of the s
15400 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
15410 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75   (19)  The subqu
15420 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
15430 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
15440 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
15450 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  ot.**        hav
15460 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
15470 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49  ..**.**  (20)  I
15480 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
15490 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
154a0 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75  lect, then it mu
154b0 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  st not use.**   
154c0 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59       an ORDER BY
154d0 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74   clause.  Ticket
154e0 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c   #3773.  We coul
154f0 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e  d relax this con
15500 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20  straint.**      
15510 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61    somewhat by sa
15520 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65  ying that the te
15530 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
15540 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a   BY clause must.
15550 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72  **        appear
15560 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72   as unmodified r
15570 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  esult columns in
15580 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
15590 2e 20 20 42 75 74 0a 2a 2a 20 20 20 20 20 20 20  .  But.**       
155a0 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69   have other opti
155b0 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e  mizations in min
155c0 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  d to deal with t
155d0 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  hat case..**.** 
155e0 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  In this routine,
155f0 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   the "p" paramet
15600 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
15610 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
15620 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75  ry..** The subqu
15630 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e  ery is p->pSrc->
15640 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67  a[iFrom].  isAgg
15650 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
15660 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75  outer query.** u
15670 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61  ses aggregates a
15680 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nd subqueryIsAgg
15690 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
156a0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
156b0 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
156c0 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
156d0 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20   not attempted, 
156e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
156f0 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75  a no-op and retu
15700 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61  rns 0..** If fla
15710 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d  ttening is attem
15720 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  pted this routin
15730 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a  e returns 1..**.
15740 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78  ** All of the ex
15750 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
15760 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20  s must occur on 
15770 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71  both the outer q
15780 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20  uery and.** the 
15790 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20  subquery before 
157a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
157b0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
157c0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
157d0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
157e0 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
157f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15800 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
15810 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
15820 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
15830 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
15840 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
15850 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
15860 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
15870 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
15880 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
15890 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20  isAgg,          
158a0 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
158b0 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
158c0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
158d0 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75  s */.  int subqu
158e0 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54  eryIsAgg    /* T
158f0 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
15900 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
15910 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
15920 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
15930 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65  *zSavedAuthConte
15940 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
15950 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c  thContext;.  Sel
15960 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20  ect *pParent;.  
15970 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
15980 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
15990 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
159a0 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ery" */.  Select
159b0 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a   *pSub1;      /*
159c0 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
159d0 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74  rightmost select
159e0 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f   in sub-query */
159f0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
15a00 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
15a10 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
15a20 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
15a30 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
15a40 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
15a50 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
15a60 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78  subquery */.  Ex
15a70 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
15a80 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
15a90 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72  set of the outer
15aa0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
15ab0 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
15ac0 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  /* VDBE cursor n
15ad0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75  umber of the pSu
15ae0 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d  b result set tem
15af0 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  p table */.  int
15b00 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
15b10 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
15b20 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
15b30 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
15b40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
15b50 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
15b60 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
15b70 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
15b80 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
15b90 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
15ba0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
15bb0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
15bc0 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
15bd0 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
15be0 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
15bf0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
15c00 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
15c10 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
15c20 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20  ;  /* Unable to 
15c30 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64  flatten compound
15c40 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 70 53   queries */.  pS
15c50 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
15c60 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20  assert( pSrc && 
15c70 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f  iFrom>=0 && iFro
15c80 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a  m<pSrc->nSrc );.
15c90 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53    pSubitem = &pS
15ca0 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20  rc->a[iFrom];.  
15cb0 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74  iParent = pSubit
15cc0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70  em->iCursor;.  p
15cd0 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Sub = pSubitem->
15ce0 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72  pSelect;.  asser
15cf0 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20  t( pSub!=0 );.  
15d00 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62  if( isAgg && sub
15d10 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
15d20 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
15d30 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
15d40 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20  ction (1)  */.  
15d50 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
15d60 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e  g && pSrc->nSrc>
15d70 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
15d80 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
15d90 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20  ction (2)  */.  
15da0 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
15db0 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
15dc0 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20  pSubSrc );.  /* 
15dd0 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e  Prior to version
15de0 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d   3.1.2, when LIM
15df0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61  IT and OFFSET ha
15e00 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63  d to be simple c
15e10 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e  onstants,.  ** n
15e20 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70  ot arbitrary exp
15e30 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c  resssions, we al
15e40 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69  lowed some combi
15e50 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e  ning of LIMIT an
15e60 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
15e70 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64  cause they could
15e80 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20   be computed at 
15e90 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42  compile-time.  B
15ea0 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  ut when LIMIT an
15eb0 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
15ec0 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65  came arbitrary e
15ed0 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77  xpressions, we w
15ee0 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64  ere forced to ad
15ef0 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  d restrictions (
15f00 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34  13).  ** and (14
15f10 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  ). */.  if( pSub
15f20 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
15f30 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
15f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
15f50 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
15f60 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  3) */.  if( pSub
15f70 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75  ->pOffset ) retu
15f80 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
15f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15fa0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
15fb0 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  4) */.  if( p->p
15fc0 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70 53 75  Rightmost && pSu
15fd0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53 75  b->pLimit && pSu
15fe0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
15ff0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
16000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
16030 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20  iction (15) */. 
16040 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63   }.  if( pSubSrc
16050 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
16060 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
16070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16080 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20  estriction (7)  
16090 2a 2f 0a 20 20 69 66 28 20 28 28 70 53 75 62 2d  */.  if( ((pSub-
160a0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
160b0 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70  istinct)!=0 || p
160c0 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20  Sub->pLimit) .  
160d0 20 20 20 20 20 20 20 26 26 20 28 70 53 72 63 2d         && (pSrc-
160e0 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
160f0 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a  ) ){          /*
16100 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34   Restrictions (4
16110 29 28 35 29 28 38 29 28 39 29 20 2a 2f 0a 20 20  )(5)(8)(9) */.  
16120 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
16130 20 20 20 0a 20 20 7d 0a 20 20 69 66 28 20 28 70     .  }.  if( (p
16140 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
16150 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20  Distinct)!=0 && 
16160 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
16170 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
16180 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
16190 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20  iction (6)  */. 
161a0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
161b0 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f  erBy && pSub->pO
161c0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72  rderBy ){.     r
161d0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16200 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
16210 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (11) */.  }.  
16220 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75  if( isAgg && pSu
16230 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
16240 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
16250 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
16260 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20  ction (16) */.  
16270 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
16280 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20   && p->pWhere ) 
16290 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
162a0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
162b0 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 0a 20  ction (19) */.. 
162c0 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d   /* OBSOLETE COM
162d0 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73  MENT 1:.  ** Res
162e0 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20  triction 3:  If 
162f0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
16300 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72  a join, make sur
16310 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
16320 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64  s .  ** not used
16330 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   as the right op
16340 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65  erand of an oute
16350 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65  r join.  Example
16360 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  s of why this.  
16370 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ** is not allowe
16380 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
16390 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
163a0 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e  ER JOIN (t2 JOIN
163b0 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   t3).  **.  ** I
163c0 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
163d0 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
163e0 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
163f0 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
16400 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a  OUTER JOIN t2) J
16410 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a  OIN t3.  **.  **
16420 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74   which is not at
16430 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68   all the same th
16440 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ing..  **.  ** O
16450 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20  BSOLETE COMMENT 
16460 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74  2:.  ** Restrict
16470 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20  ion 12:  If the 
16480 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
16490 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
164a0 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20   a left outer.  
164b0 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75  ** join, make su
164c0 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
164d0 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
164e0 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61  use..  ** An exa
164f0 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
16500 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  s is not allowed
16510 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
16520 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
16530 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a  R JOIN (SELECT *
16540 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
16550 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a  2.x>0).  **.  **
16560 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
16570 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
16580 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
16590 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
165a0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
165b0 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20   WHERE t2.x>0.  
165c0 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  **.  ** But the 
165d0 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c  t2.x>0 test will
165e0 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20   always fail on 
165f0 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32  a NULL row of t2
16600 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66  , which.  ** eff
16610 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74  ectively convert
16620 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e  s the OUTER JOIN
16630 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a   into an INNER J
16640 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  OIN..  **.  ** T
16650 48 49 53 20 4f 56 45 52 52 49 44 45 53 20 4f 42  HIS OVERRIDES OB
16660 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20  SOLETE COMMENTS 
16670 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20  1 AND 2 ABOVE:. 
16680 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33 30 30   ** Ticket #3300
16690 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c 61 74   shows that flat
166a0 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67 68 74  tening the right
166b0 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
166c0 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61  JOIN.  ** is fra
166d0 75 67 68 74 20 77 69 74 68 20 64 61 6e 67 65 72  ught with danger
166e0 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f 69 64  .  Best to avoid
166f0 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67   the whole thing
16700 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 73  .  If the.  ** s
16710 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
16720 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
16730 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64  EFT JOIN, then d
16740 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20  o not flatten.. 
16750 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69   */.  if( (pSubi
16760 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
16770 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
16780 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16790 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
167a0 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73  ion 17: If the s
167b0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
167c0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74  mpound SELECT, t
167d0 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a  hen it must.  **
167e0 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e   use only the UN
167f0 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
16800 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68  . And none of th
16810 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20  e simple select 
16820 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61  queries.  ** tha
16830 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f  t make up the co
16840 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72  mpound SELECT ar
16850 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  e allowed to be 
16860 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73  aggregate or dis
16870 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69  tinct.  ** queri
16880 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
16890 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
168a0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
168b0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72  derBy ){.      r
168c0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73  eturn 0;  /* Res
168d0 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20  triction 20 */. 
168e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41     }.    if( isA
168f0 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  gg || (p->selFla
16900 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
16910 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53  )!=0 || pSrc->nS
16920 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rc!=1 ){.      r
16930 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
16940 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75     for(pSub1=pSu
16950 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d  b; pSub1; pSub1=
16960 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a  pSub1->pPrior){.
16970 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16980 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
16990 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
169a0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
169b0 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
169c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
169d0 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
169e0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
169f0 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
16a00 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
16a10 20 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d       if( (pSub1-
16a20 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
16a30 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
16a40 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20  egate))!=0.     
16a50 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72    || (pSub1->pPr
16a60 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70  ior && pSub1->op
16a70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20  !=TK_ALL) .     
16a80 20 20 7c 7c 20 4e 45 56 45 52 28 70 53 75 62 31    || NEVER(pSub1
16a90 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 70 53  ->pSrc==0) || pS
16aa0 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21  ub1->pSrc->nSrc!
16ab0 3d 31 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =1.      ){.    
16ac0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16ad0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
16ae0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
16af0 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  18. */.    if( p
16b00 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
16b10 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
16b20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
16b30 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
16b40 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
16b50 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
16b60 79 2d 3e 61 5b 69 69 5d 2e 69 43 6f 6c 3d 3d 30  y->a[ii].iCol==0
16b70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
16b80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
16b90 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72    /***** If we r
16ba0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
16bb0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
16bc0 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f  ermitted. *****/
16bd0 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65  ..  /* Authorize
16be0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
16bf0 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
16c00 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74  Context = pSubit
16c10 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c  em->zName;.  sql
16c20 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
16c30 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
16c40 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ECT, 0, 0, 0);. 
16c50 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
16c60 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
16c70 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a  thContext;..  /*
16c80 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
16c90 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
16ca0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16cb0 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72  , then (by restr
16cc0 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20  ictions.  ** 17 
16cd0 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74  and 18 above) it
16ce0 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e   must be a UNION
16cf0 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72   ALL and the par
16d00 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a  ent query must .
16d10 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66    ** be of the f
16d20 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
16d30 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d     SELECT <expr-
16d40 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62  list> FROM (<sub
16d50 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d  -query>) <where-
16d60 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20  clause> .  **.  
16d70 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  ** followed by a
16d80 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
16d90 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54  IT and/or OFFSET
16da0 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62   clauses. This b
16db0 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65  lock.  ** create
16dc0 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20  s N-1 copies of 
16dd0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
16de0 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44   without any ORD
16df0 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20  ER BY, LIMIT or 
16e00 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61  .  ** OFFSET cla
16e10 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74  uses and joins t
16e20 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  hem to the left-
16e30 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65  hand-side of the
16e40 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75   original.  ** u
16e50 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f  sing UNION ALL o
16e60 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69  perators. In thi
16e70 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20  s case N is the 
16e80 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65  number of simple
16e90 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61  .  ** select sta
16ea0 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63  tements in the c
16eb0 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
16ec0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61  y..  **.  ** Exa
16ed0 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
16ee0 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46      SELECT a+1 F
16ef0 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20  ROM (.  **      
16f00 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
16f10 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
16f20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
16f30 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46        SELECT y F
16f40 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
16f50 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
16f60 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
16f70 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74   abs(z*2) FROM t
16f80 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57  ab2.  **     ) W
16f90 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20  HERE a!=5 ORDER 
16fa0 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  BY 1.  **.  ** T
16fb0 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
16fc0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
16fd0 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74  ELECT x+1 FROM t
16fe0 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a  ab WHERE x+1!=5.
16ff0 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
17000 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
17010 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT y+1 FROM tab 
17020 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a  WHERE y+1!=5.  *
17030 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
17040 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
17050 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20  abs(z*2)+1 FROM 
17060 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a  tab2 WHERE abs(z
17070 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  *2)+1!=5.  **   
17080 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a    ORDER BY 1.  *
17090 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74  *.  ** We call t
170a0 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e  his the "compoun
170b0 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
170c0 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66  ening"..  */.  f
170d0 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  or(pSub=pSub->pP
170e0 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62  rior; pSub; pSub
170f0 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
17100 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77      Select *pNew
17110 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
17120 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
17130 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72  rderBy;.    Expr
17140 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c   *pLimit = p->pL
17150 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  imit;.    Select
17160 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
17170 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rior;.    p->pOr
17180 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
17190 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20  ->pSrc = 0;.    
171a0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
171b0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
171c0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
171d0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
171e0 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  , p, 0);.    p->
171f0 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
17200 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
17210 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
17220 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b   p->pSrc = pSrc;
17230 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  .    p->op = TK_
17240 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67  ALL;.    p->pRig
17250 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20  htmost = 0;.    
17260 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
17270 20 20 20 20 20 70 4e 65 77 20 3d 20 70 50 72 69       pNew = pPri
17280 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  or;.    }else{. 
17290 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f       pNew->pPrio
172a0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
172b0 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f    pNew->pRightmo
172c0 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  st = 0;.    }.  
172d0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e    p->pPrior = pN
172e0 65 77 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  ew;.    if( db->
172f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
17300 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
17310 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e  /* Begin flatten
17320 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68  ing the iFrom-th
17330 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
17340 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20  OM clause .  ** 
17350 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
17360 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20  ry..  */.  pSub 
17370 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74  = pSub1 = pSubit
17380 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20  em->pSelect;..  
17390 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72  /* Delete the tr
173a0 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
173b0 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74  ructure associat
173c0 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
173d0 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20   subquery.  */. 
173e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
173f0 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  b, pSubitem->zDa
17400 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74  tabase);.  sqlit
17410 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
17420 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  bitem->zName);. 
17430 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
17440 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  b, pSubitem->zAl
17450 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  ias);.  pSubitem
17460 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b  ->zDatabase = 0;
17470 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  .  pSubitem->zNa
17480 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  me = 0;.  pSubit
17490 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a  em->zAlias = 0;.
174a0 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c    pSubitem->pSel
174b0 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  ect = 0;..  /* D
174c0 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  efer deleting th
174d0 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61  e Table object a
174e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
174f0 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
17500 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65   until code gene
17510 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  ration is.  ** c
17520 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74  omplete, since t
17530 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65  here may still e
17540 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65  xist Expr.pTab e
17550 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a  ntries that.  **
17560 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75   refer to the su
17570 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65  bquery even afte
17580 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54  r flattening.  T
17590 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a  icket #3346..  *
175a0 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d  *.  ** pSubitem-
175b0 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73 20  >pTab is always 
175c0 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74  non-NULL by test
175d0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e   restrictions an
175e0 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20  d tests above.. 
175f0 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
17600 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21  (pSubitem->pTab!
17610 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  =0) ){.    Table
17620 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53   *pTabToDel = pS
17630 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ubitem->pTab;.  
17640 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d    if( pTabToDel-
17650 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20  >nRef==1 ){.    
17660 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65    pTabToDel->pNe
17670 78 74 5a 6f 6d 62 69 65 20 3d 20 70 50 61 72 73  xtZombie = pPars
17680 65 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20  e->pZombieTab;. 
17690 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 5a 6f       pParse->pZo
176a0 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f  mbieTab = pTabTo
176b0 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Del;.    }else{.
176c0 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
176d0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20  >nRef--;.    }. 
176e0 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61     pSubitem->pTa
176f0 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b = 0;.  }..  /*
17700 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   The following l
17710 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f  oop runs once fo
17720 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61  r each term in a
17730 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
17740 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69  ry.  ** flatteni
17750 6e 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64  ng (as described
17760 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20   above).  If we 
17770 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66  are doing a diff
17780 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20  erent kind.  ** 
17790 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20  of flattening - 
177a0 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68  a flattening oth
177b0 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75  er than a compou
177c0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
177d0 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68  tening -.  ** th
177e0 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c  en this loop onl
177f0 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a  y runs once..  *
17800 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
17810 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68   moves all of th
17820 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
17830 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
17840 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  into the.  ** th
17850 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
17860 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17870 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  .  Before doing 
17880 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20  this, remember. 
17890 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
178a0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
178b0 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
178c0 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
178d0 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  in.  ** iParent.
178e0 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
178f0 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
17900 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
17910 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77  uent code.  ** w
17920 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73  ill scan express
17930 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ions looking for
17940 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e   iParent referen
17950 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a  ces and replace.
17960 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
17970 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
17980 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
17990 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
179a0 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c  ery FROM.  ** el
179b0 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
179c0 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
179d0 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74  */.  for(pParent
179e0 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61  =p; pParent; pPa
179f0 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50  rent=pParent->pP
17a00 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d  rior, pSub=pSub-
17a10 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e  >pPrior){.    in
17a20 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75  t nSubSrc;.    u
17a30 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  8 jointype = 0;.
17a40 20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53      pSubSrc = pS
17a50 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  ub->pSrc;     /*
17a60 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
17a70 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  subquery */.    
17a80 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
17a90 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d  c->nSrc;  /* Num
17aa0 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
17ab0 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  subquery FROM cl
17ac0 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63  ause */.    pSrc
17ad0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
17ae0 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
17af0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
17b00 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20  r query */..    
17b10 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20  if( pSrc ){.    
17b20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
17b30 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73  t==p );  /* Firs
17b40 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74  t time through t
17b50 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
17b60 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62   jointype = pSub
17b70 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  item->jointype;.
17b80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17b90 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
17ba0 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61  !=p );  /* 2nd a
17bb0 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69  nd subsequent ti
17bc0 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  mes through the 
17bd0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53  loop */.      pS
17be0 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
17bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
17c00 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c  istAppend(db, 0,
17c10 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
17c20 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( pSrc==0 ){.   
17c30 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
17c40 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
17c50 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
17c60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
17c70 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
17c80 72 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65  ry uses a single
17c90 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f   slot of the FRO
17ca0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
17cb0 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65  outer.    ** que
17cc0 72 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71  ry.  If the subq
17cd0 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68  uery has more th
17ce0 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69  an one element i
17cf0 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
17d00 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65  e,.    ** then e
17d10 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  xpand the outer 
17d20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70  query to make sp
17d30 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f  ace for it to ho
17d40 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a  ld all elements.
17d50 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75      ** of the su
17d60 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20  bquery..    **. 
17d70 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
17d80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
17d90 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
17da0 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52  bA, (SELECT * FR
17db0 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20  OM sub1, sub2), 
17dc0 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  tabB;.    **.   
17dd0 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75   ** The outer qu
17de0 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20  ery has 3 slots 
17df0 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75  in its FROM clau
17e00 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66  se.  One slot of
17e10 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
17e20 72 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64  r query (the mid
17e30 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65  dle slot) is use
17e40 64 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72  d by the subquer
17e50 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20  y.  The next.   
17e60 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64   ** block of cod
17e70 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68  e will expand th
17e80 65 20 6f 75 74 20 71 75 65 72 79 20 74 6f 20 34  e out query to 4
17e90 20 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69 64   slots.  The mid
17ea0 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20  dle.    ** slot 
17eb0 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74  is expanded to t
17ec0 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65  wo slots in orde
17ed0 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  r to make space 
17ee0 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  for the.    ** t
17ef0 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
17f00 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
17f10 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
17f20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
17f30 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  SubSrc>1 ){.    
17f40 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20    pParent->pSrc 
17f50 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  = pSrc = sqlite3
17f60 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
17f70 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63  b, pSrc, nSubSrc
17f80 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20  -1,iFrom+1);.   
17f90 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
17fa0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
17fb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17fc0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
17fd0 54 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f  Transfer the FRO
17fe0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  M clause terms f
17ff0 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79  rom the subquery
18000 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
18010 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
18020 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
18030 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
18040 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  ){.      pSrc->a
18050 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
18060 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
18070 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
18080 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
18090 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
180a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
180b0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e  c->a[iFrom].join
180c0 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
180d0 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
180e0 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
180f0 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
18100 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
18110 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
18120 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
18130 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
18140 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
18150 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
18160 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
18170 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
18180 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
18190 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
181a0 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
181b0 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
181c0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
181d0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
181e0 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
181f0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
18200 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
18210 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
18220 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
18230 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
18240 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18250 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
18260 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
18270 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
18280 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
18290 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
182a0 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
182b0 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
182c0 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
182d0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
182e0 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
182f0 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
18300 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72      pList = pPar
18310 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ent->pEList;.   
18320 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
18330 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
18340 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
18350 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29  >a[i].zName==0 )
18360 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
18370 63 68 61 72 20 2a 7a 53 70 61 6e 20 3d 20 70 4c  char *zSpan = pL
18380 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b  ist->a[i].zSpan;
18390 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 70  .        if( zSp
183a0 61 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  an ){.          
183b0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
183c0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
183d0 44 75 70 28 64 62 2c 20 7a 53 70 61 6e 29 3b 0a  Dup(db, zSpan);.
183e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
183f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73  }.    }.    subs
18400 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50  tExprList(db, pP
18410 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69  arent->pEList, i
18420 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
18430 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69  List);.    if( i
18440 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75  sAgg ){.      su
18450 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
18460 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
18470 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
18480 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
18490 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
184a0 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
184b0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
184c0 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
184d0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
184e0 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  }.    if( pSub->
184f0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
18500 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
18510 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
18520 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
18530 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  >pOrderBy = pSub
18540 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
18550 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
18560 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
18570 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  if( pParent->pOr
18580 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
18590 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
185a0 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
185b0 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
185c0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
185d0 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  }.    if( pSub->
185e0 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20  pWhere ){.      
185f0 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
18600 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
18610 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  ->pWhere, 0);.  
18620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
18630 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d  Where = 0;.    }
18640 0a 20 20 20 20 69 66 28 20 73 75 62 71 75 65 72  .    if( subquer
18650 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20  yIsAgg ){.      
18660 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
18670 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
18680 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
18690 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d  aving = pParent-
186a0 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70  >pWhere;.      p
186b0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
186c0 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70   pWhere;.      p
186d0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
186e0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
186f0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
18700 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
18710 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
18720 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
18730 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
18740 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  d(db, pParent->p
18750 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20  Having, .       
18760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18770 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
18780 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
18790 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 29  ub->pHaving, 0))
187a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
187b0 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
187c0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  y==0 );.      pP
187d0 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20  arent->pGroupBy 
187e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
187f0 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  tDup(db, pSub->p
18800 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20  GroupBy, 0);.   
18810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
18820 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
18830 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
18840 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69  arent->pWhere, i
18850 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
18860 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61  List);.      pPa
18870 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73  rent->pWhere = s
18880 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
18890 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
188a0 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20  e, pWhere);.    
188b0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  }.  .    /* The 
188c0 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
188d0 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
188e0 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
188f0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  or the.    ** ou
18900 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73  ter query is dis
18910 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20  tinct. .    */. 
18920 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46     pParent->selF
18930 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65  lags |= pSub->se
18940 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
18950 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a  inct;.  .    /*.
18960 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e      ** SELECT ..
18970 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  . FROM (SELECT .
18980 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45  .. LIMIT a OFFSE
18990 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46  T b) LIMIT x OFF
189a0 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20  SET y;.    **.  
189b0 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
189c0 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
189d0 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
189e0 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
189f0 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a    But this.    *
18a00 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  * does not work 
18a10 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20  if either limit 
18a20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20  is negative..   
18a30 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
18a40 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
18a50 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69    pParent->pLimi
18a60 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  t = pSub->pLimit
18a70 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c  ;.      pSub->pL
18a80 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  imit = 0;.    }.
18a90 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c    }..  /* Finial
18aa0 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20  ly, delete what 
18ab0 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73  is left of the s
18ac0 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75  ubquery and retu
18ad0 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e  rn.  ** success.
18ae0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
18af0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
18b00 70 53 75 62 31 29 3b 0a 0a 20 20 72 65 74 75 72  pSub1);..  retur
18b10 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
18b20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
18b30 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
18b40 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
18b50 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
18b60 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
18b70 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
18b80 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61  ment passed as a
18b90 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65  n argument to se
18ba0 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20  e if it.** is a 
18bb0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
18bc0 75 65 72 79 2e 20 52 65 74 75 72 6e 20 57 48 45  uery. Return WHE
18bd0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f  RE_ORDERBY_MIN o
18be0 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  r WHERE_ORDERBY_
18bf0 4d 41 58 20 69 66 20 0a 2a 2a 20 69 74 20 69 73  MAX if .** it is
18c00 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65  , or 0 otherwise
18c10 2e 20 41 74 20 70 72 65 73 65 6e 74 2c 20 61 20  . At present, a 
18c20 71 75 65 72 79 20 69 73 20 63 6f 6e 73 69 64 65  query is conside
18c30 72 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d  red to be.** a m
18c40 69 6e 28 29 2f 6d 61 78 28 29 20 71 75 65 72 79  in()/max() query
18c50 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20   if:.**.**   1. 
18c60 54 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c  There is a singl
18c70 65 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  e object in the 
18c80 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
18c90 2a 2a 20 20 20 32 2e 20 54 68 65 72 65 20 69 73  **   2. There is
18ca0 20 61 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73   a single expres
18cb0 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75  sion in the resu
18cc0 6c 74 20 73 65 74 2c 20 61 6e 64 20 69 74 20 69  lt set, and it i
18cd0 73 0a 2a 2a 20 20 20 20 20 20 65 69 74 68 65 72  s.**      either
18ce0 20 6d 69 6e 28 78 29 20 6f 72 20 6d 61 78 28 78   min(x) or max(x
18cf0 29 2c 20 77 68 65 72 65 20 78 20 69 73 20 61 20  ), where x is a 
18d00 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65  column reference
18d10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d  ..*/.static u8 m
18d20 69 6e 4d 61 78 51 75 65 72 79 28 53 65 6c 65 63  inMaxQuery(Selec
18d30 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70  t *p){.  Expr *p
18d40 45 78 70 72 3b 0a 20 20 45 78 70 72 4c 69 73 74  Expr;.  ExprList
18d50 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45   *pEList = p->pE
18d60 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c  List;..  if( pEL
18d70 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
18d80 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  return WHERE_ORD
18d90 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70  ERBY_NORMAL;.  p
18da0 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Expr = pEList->a
18db0 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
18dc0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
18dd0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
18de0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45  turn 0;.  if( NE
18df0 56 45 52 28 45 78 70 72 48 61 73 50 72 6f 70 65  VER(ExprHasPrope
18e00 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
18e10 73 53 65 6c 65 63 74 29 29 20 29 20 72 65 74 75  sSelect)) ) retu
18e20 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d  rn 0;.  pEList =
18e30 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
18e40 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
18e50 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   || pEList->nExp
18e60 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
18e70 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61  .  if( pEList->a
18e80 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54  [0].pExpr->op!=T
18e90 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72  K_AGG_COLUMN ) r
18ea0 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
18eb0 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66  RBY_NORMAL;.  if
18ec0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
18ed0 28 70 45 78 70 72 2d 3e 7a 54 6f 6b 65 6e 2c 22  (pExpr->zToken,"
18ee0 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  min")==0 ){.    
18ef0 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  return WHERE_ORD
18f00 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73  ERBY_MIN;.  }els
18f10 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
18f20 49 43 6d 70 28 70 45 78 70 72 2d 3e 7a 54 6f 6b  ICmp(pExpr->zTok
18f30 65 6e 2c 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a  en,"max")==0 ){.
18f40 20 20 20 20 72 65 74 75 72 6e 20 57 48 45 52 45      return WHERE
18f50 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20  _ORDERBY_MAX;.  
18f60 7d 0a 20 20 72 65 74 75 72 6e 20 57 48 45 52 45  }.  return WHERE
18f70 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
18f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
18f90 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
18fa0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
18fb0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
18fc0 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
18fd0 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  y..** The second
18fe0 20 61 72 67 6d 65 6e 74 20 69 73 20 74 68 65 20   argment is the 
18ff0 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65  associated aggre
19000 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74  gate-info object
19010 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
19020 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65  ion tests if the
19030 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68   SELECT is of th
19040 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
19050 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
19060 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a  FROM <tbl>.**.**
19070 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20   where table is 
19080 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
19090 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65  , not a sub-sele
190a0 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74  ct or view. If t
190b0 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73  he query.** does
190c0 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74   match this patt
190d0 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e  ern, then a poin
190e0 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ter to the Table
190f0 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e   object represen
19100 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73  ting.** <tbl> is
19110 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
19120 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
19130 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  ned..*/.static T
19140 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f  able *isSimpleCo
19150 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41  unt(Select *p, A
19160 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
19170 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
19180 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  ;.  Expr *pExpr;
19190 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e  ..  assert( !p->
191a0 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69  pGroupBy );..  i
191b0 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20  f( p->pWhere || 
191c0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
191d0 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53  !=1 .   || p->pS
191e0 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70  rc->nSrc!=1 || p
191f0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
19200 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65  lect.  ){.    re
19210 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
19220 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
19230 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72  0].pTab;.  pExpr
19240 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
19250 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  0].pExpr;.  asse
19260 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61  rt( pTab && !pTa
19270 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45  b->pSelect && pE
19280 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73  xpr );..  if( Is
19290 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
192a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
192b0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
192c0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
192d0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41  urn 0;.  if( (pA
192e0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
192f0 2e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 26 53 51  .pFunc->flags&SQ
19300 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29  LITE_FUNC_COUNT)
19310 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
19320 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
19330 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29  gs&EP_Distinct )
19340 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65   return 0;..  re
19350 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
19360 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63  .** If the sourc
19370 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73  e-list item pass
19380 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
19390 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20  t was augmented 
193a0 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58  with an.** INDEX
193b0 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
193c0 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65  en try to locate
193d0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69   the specified i
193e0 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a  ndex. If there.*
193f0 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61  * was such a cla
19400 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65  use and the name
19410 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62  d index cannot b
19420 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
19430 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
19440 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72   and leave an er
19450 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f  ror in pParse. O
19460 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61  therwise, popula
19470 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49  te .** pFrom->pI
19480 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20  ndex and return 
19490 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
194a0 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  t sqlite3Indexed
194b0 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a  ByLookup(Parse *
194c0 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
194d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
194e0 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d  om){.  if( pFrom
194f0 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d  ->pTab && pFrom-
19500 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54  >zIndex ){.    T
19510 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
19520 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68  om->pTab;.    ch
19530 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72  ar *zIndex = pFr
19540 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20  om->zIndex;.    
19550 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
19560 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
19570 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20  pIndex; .       
19580 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33   pIdx && sqlite3
19590 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e  StrICmp(pIdx->zN
195a0 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20  ame, zIndex); . 
195b0 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78         pIdx=pIdx
195c0 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20  ->pNext.    );. 
195d0 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a     if( !pIdx ){.
195e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
195f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
19600 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73  o such index: %s
19610 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20  ", zIndex, 0);. 
19620 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19630 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
19640 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65      pFrom->pInde
19650 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20  x = pIdx;.  }.  
19660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
19680 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c  routine is a Wal
19690 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ker callback for
196a0 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53   "expanding" a S
196b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
196c0 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20  .** "Expanding" 
196d0 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20  means to do the 
196e0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
196f0 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75      (1)  Make su
19700 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  re VDBE cursor n
19710 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
19720 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65   assigned to eve
19730 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c  ry.**         el
19740 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f  ement of the FRO
19750 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
19760 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20     (2)  Fill in 
19770 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  the pTabList->a[
19780 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e  ].pTab fields in
19790 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
197a0 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  t .**         de
197b0 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73  fines FROM claus
197c0 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61  e.  When views a
197d0 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
197e0 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20  M clause,.**    
197f0 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69       fill pTabLi
19800 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20  st->a[].pSelect 
19810 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
19820 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
19830 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  ent.**         t
19840 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
19850 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79  he view.  A copy
19860 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
19870 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a  view's SELECT.**
19880 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
19890 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  nt so that we ca
198a0 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20  n freely modify 
198b0 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73  or delete that s
198c0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
198d0 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72      without worr
198e0 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69  ying about messi
198f0 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73  ng up the presis
19900 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  tent representat
19910 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ion.**         o
19920 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a  f the view..**.*
19930 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65  *    (3)  Add te
19940 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
19950 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
19960 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
19970 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
19980 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
19990 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
199a0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
199b0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
199c0 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
199d0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
199e0 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
199f0 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
19a00 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
19a10 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
19a20 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
19a30 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
19a40 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
19a50 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
19a60 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
19a70 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
19a80 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
19a90 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
19aa0 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
19ab0 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
19ac0 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
19ad0 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57  selectExpander(W
19ae0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
19af0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
19b00 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
19b10 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
19b20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20   int i, j, k;.  
19b30 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
19b40 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
19b50 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
19b60 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
19b70 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
19b80 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
19b90 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
19ba0 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20  ocFailed  ){.   
19bb0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
19bc0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56  t;.  }.  if( NEV
19bd0 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c  ER(p->pSrc==0) |
19be0 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
19bf0 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30   SF_Expanded)!=0
19c00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
19c10 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
19c20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
19c30 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 70 54  F_Expanded;.  pT
19c40 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
19c50 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
19c60 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61  pEList;..  /* Ma
19c70 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e  ke sure cursor n
19c80 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
19c90 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
19ca0 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a   entries in.  **
19cb0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19cc0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
19cd0 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
19ce0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
19cf0 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
19d00 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  rse, pTabList);.
19d10 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
19d20 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
19d30 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
19d40 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
19d50 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
19d60 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
19d70 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
19d80 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
19d90 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
19da0 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
19db0 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
19dc0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
19dd0 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
19de0 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
19df0 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
19e00 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
19e10 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
19e20 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
19e30 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
19e40 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
19e50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
19e60 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68  This statement h
19e70 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
19e80 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65  prepared.  There
19e90 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
19ea0 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68    ** to go furth
19eb0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  er. */.      ass
19ec0 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ert( i==0 );.   
19ed0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
19ee0 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  une;.    }.    i
19ef0 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
19f00 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
19f10 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
19f20 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  RY.      Select 
19f30 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
19f40 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a  Select;.      /*
19f50 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
19f60 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
19f70 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
19f80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
19f90 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  l!=0 );.      as
19fa0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
19fb0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  b==0 );.      sq
19fc0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
19fd0 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
19fe0 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
19ff0 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
1a000 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1a010 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
1a020 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
1a030 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
1a040 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
1a050 54 61 62 2d 3e 64 62 4d 65 6d 20 3d 20 64 62 2d  Tab->dbMem = db-
1a060 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
1a070 6c 65 64 20 3f 20 64 62 20 3a 20 30 3b 0a 20 20  led ? db : 0;.  
1a080 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d      pTab->nRef =
1a090 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   1;.      pTab->
1a0a0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
1a0b0 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
1a0c0 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22  te_subquery_%p_"
1a0d0 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a  , (void*)pTab);.
1a0e0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
1a0f0 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65  l->pPrior ){ pSe
1a100 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
1a110 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74  ; }.      select
1a120 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
1a130 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
1a140 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
1a150 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
1a160 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ol);.      pTab-
1a170 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
1a180 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
1a190 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
1a1a0 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  l;.#endif.    }e
1a1b0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
1a1c0 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
1a1d0 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20  or view name in 
1a1e0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1a1f0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1a200 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
1a210 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
1a220 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
1a230 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
1a240 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
1a250 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c  ,0,pFrom->zName,
1a260 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pFrom->zDatabase
1a270 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
1a280 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
1a290 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
1a2a0 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66  Tab->nRef++;.#if
1a2b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1a2c0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
1a2d0 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f  defined (SQLITE_
1a2e0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1a2f0 45 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  E).      if( pTa
1a300 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73  b->pSelect || Is
1a310 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
1a320 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72  .        /* We r
1a330 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65  each here if the
1a340 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20   named table is 
1a350 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20  a really a view 
1a360 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
1a370 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
1a380 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
1a390 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   pTab) ) return 
1a3a0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
1a3b0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
1a3c0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a  ->pSelect==0 );.
1a3d0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
1a3e0 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
1a3f0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
1a400 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  ab->pSelect, 0);
1a410 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a420 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
1a430 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  er, pFrom->pSele
1a440 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ct);.      }.#en
1a450 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
1a460 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  * Locate the ind
1a470 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20  ex named by the 
1a480 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
1a490 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  e, if any. */.  
1a4a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64    if( sqlite3Ind
1a4b0 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61  exedByLookup(pPa
1a4c0 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20  rse, pFrom) ){. 
1a4d0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
1a4e0 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  Abort;.    }.  }
1a4f0 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
1a500 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
1a510 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
1a520 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
1a530 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ns..  */.  if( d
1a540 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a550 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  || sqliteProcess
1a560 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
1a570 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
1a580 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
1a590 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22  /* For every "*"
1a5a0 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
1a5b0 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
1a5c0 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
1a5d0 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f  s of.  ** all co
1a5e0 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
1a5f0 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76  les.  And for ev
1a600 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65  ery TABLE.* inse
1a610 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a  rt the names.  *
1a620 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  * of all columns
1a630 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20   in TABLE.  The 
1a640 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20  parser inserted 
1a650 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73  a special expres
1a660 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74  sion.  ** with t
1a670 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74  he TK_ALL operat
1a680 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
1a690 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
1a6a0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
1a6b0 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  ** The follo
1a6c0 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
1a6d0 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
1a6e0 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69   TK_ALL expressi
1a6f0 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20  ons and expand. 
1a700 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20   ** each one to 
1a710 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
1a720 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
1a730 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
1a740 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20   The first loop 
1a750 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73  just checks to s
1a760 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
1a770 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  any "*" operator
1a780 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64  s.  ** that need
1a790 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f   expanding..  */
1a7a0 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45  .  for(k=0; k<pE
1a7b0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
1a7c0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
1a7d0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  = pEList->a[k].p
1a7e0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
1a7f0 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
1a800 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74  reak;.    assert
1a810 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
1a820 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d   || pE->pRight!=
1a830 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1a840 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
1a850 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30  || (pE->pLeft!=0
1a860 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f   && pE->pLeft->o
1a870 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20  p==TK_ID) );.   
1a880 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
1a890 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
1a8a0 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20  t->op==TK_ALL ) 
1a8b0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
1a8c0 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
1a8d0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
1a8e0 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
1a8f0 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
1a900 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
1a910 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
1a920 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
1a930 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
1a940 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
1a950 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
1a960 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
1a970 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
1a980 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
1a990 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
1a9a0 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
1a9b0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1a9c0 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
1a9d0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
1a9e0 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ew = 0;.    int 
1a9f0 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e  flags = pParse->
1aa00 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69  db->flags;.    i
1aa10 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28  nt longNames = (
1aa20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
1aa30 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a  ullColNames)!=0.
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa50 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20        && (flags 
1aa60 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
1aa70 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20  lNames)==0;..   
1aa80 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
1aa90 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
1aaa0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
1aab0 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
1aac0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
1aad0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
1aae0 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ->pRight!=0 );. 
1aaf0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
1ab00 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e  =TK_ALL && (pE->
1ab10 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
1ab20 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  ->pRight->op!=TK
1ab30 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
1ab40 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
1ab50 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
1ab60 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1ab70 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
1ab80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1ab90 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
1aba0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1abb0 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
1abc0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1abd0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
1abe0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
1abf0 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
1ac00 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
1ac10 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
1ac20 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
1ac30 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a  ].zSpan = a[k].z
1ac40 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  Span;.          
1ac50 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
1ac60 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
1ac70 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Span = 0;.      
1ac80 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
1ac90 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
1aca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1acb0 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
1acc0 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
1acd0 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
1ace0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
1acf0 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
1ad00 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
1ad10 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
1ad20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
1ad30 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
1ad40 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
1ad50 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20  ar *zTName;     
1ad60 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
1ad70 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
1ad80 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1ad90 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  E->op==TK_DOT ){
1ada0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1adb0 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  t( pE->pLeft!=0 
1adc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  );.          zTN
1add0 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d  ame = pE->pLeft-
1ade0 3e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  >zToken;.       
1adf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ae00 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20    zTName = 0;.  
1ae10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ae20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
1ae30 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
1ae40 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1ae50 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
1ae60 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
1ae70 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
1ae80 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
1ae90 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72   *zTabName = pFr
1aea0 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  om->zAlias;.    
1aeb0 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
1aec0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
1aed0 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
1aee0 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
1aef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1af00 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
1af10 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
1af20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
1af30 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  TName && sqlite3
1af40 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
1af50 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  zTabName)!=0 ){.
1af60 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1af70 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1af80 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c  }.          tabl
1af90 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  eSeen = 1;.     
1afa0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1afb0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
1afc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
1afd0 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67  pr *pExpr, *pRig
1afe0 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
1aff0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
1b000 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
1b010 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e;.            c
1b020 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20  har *zColname;  
1b030 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20  /* The computed 
1b040 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
1b050 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
1b060 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d  *zToFree;   /* M
1b070 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74  alloced string t
1b080 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
1b090 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  freed */.       
1b0a0 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e       Token sColn
1b0b0 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ame;  /* Compute
1b0c0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73  d column name as
1b0d0 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20   a token */..   
1b0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
1b0f0 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65   column is marke
1b100 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28 63  d as 'hidden' (c
1b110 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f  urrently only po
1b120 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20  ssible.         
1b130 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61     ** for virtua
1b140 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f  l tables), do no
1b150 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20  t include it in 
1b160 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20  the expanded.   
1b170 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75           ** resu
1b180 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20  lt-set list..   
1b190 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1b1a0 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69          if( IsHi
1b1b0 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
1b1c0 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20  ->aCol[j]) ){.  
1b1d0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1b1e0 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54 61  rt(IsVirtual(pTa
1b1f0 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b));.           
1b200 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1b210 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
1b220 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
1b230 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a  && zTName==0 ){.
1b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
1b250 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1b260 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62  m *pLeft = &pTab
1b270 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20  List->a[i-1];.  
1b280 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b290 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79  (pLeft[1].jointy
1b2a0 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29  pe & JT_NATURAL)
1b2b0 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
1b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1b2d0 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74  olumnIndex(pLeft
1b2e0 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d  ->pTab, zName)>=
1b2f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1b300 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
1b310 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
1b320 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
1b330 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
1b340 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
1b350 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
1b360 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1b370 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1b380 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1b390 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b3a0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
1b3b0 65 78 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69  ex(pLeft[1].pUsi
1b3c0 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
1b3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b3e0 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69   /* In a join wi
1b3f0 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  th a USING claus
1b400 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20  e, omit columns 
1b410 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1b420 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
1b430 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
1b440 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
1b450 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
1b460 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1b470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1b480 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1b490 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
1b4a0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
1b4b0 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65  db, TK_ID, zName
1b4c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
1b4d0 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  Colname = zName;
1b4e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f  .            zTo
1b4f0 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
1b500 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
1b510 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
1b520 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  >nSrc>1 ){.     
1b530 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
1b540 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
1b550 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
1b560 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
1b570 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20  D, zTabName);.  
1b580 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1b590 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
1b5a0 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
1b5b0 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
1b5c0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
1b5d0 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
1b5e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1b5f0 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71     zColname = sq
1b600 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1b610 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61   "%s.%s", zTabNa
1b620 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
1b630 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
1b640 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  ree = zColname;.
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1b660 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1b670 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
1b680 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
1b690 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1b6a0 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
1b6b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1b6c0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1b6d0 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  pNew, pExpr);.  
1b6e0 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61            sColna
1b6f0 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b  me.z = zColname;
1b700 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f  .            sCo
1b710 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65  lname.n = sqlite
1b720 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61  3Strlen30(zColna
1b730 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1b740 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1b750 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
1b760 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c  pNew, &sColname,
1b770 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
1b780 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1b790 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20  b, zToFree);.   
1b7a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b7b0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
1b7c0 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
1b7d0 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
1b7e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1b7f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1b800 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
1b810 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54  h table: %s", zT
1b820 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
1b830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b840 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1b850 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
1b860 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
1b870 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
1b880 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b890 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1b8a0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
1b8b0 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20  e(db, pEList);. 
1b8c0 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
1b8d0 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  New;.  }.#if SQL
1b8e0 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20  ITE_MAX_COLUMN. 
1b8f0 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26   if( p->pEList &
1b900 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  & p->pEList->nEx
1b910 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  pr>db->aLimit[SQ
1b920 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
1b930 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
1b940 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1b950 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
1b960 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
1b970 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t");.  }.#endif.
1b980 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1b990 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
1b9a0 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
1b9b0 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
1b9c0 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   walker..**.** W
1b9d0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1b9e0 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78   is the Walker.x
1b9f0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
1ba00 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
1ba10 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64  es.** are walked
1ba20 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74   without any act
1ba30 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e  ions being taken
1ba40 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20   at each node.  
1ba50 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77  Presumably,.** w
1ba60 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1ba70 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c   is used for Wal
1ba80 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
1ba90 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65  k then .** Walke
1baa0 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
1bab0 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73  k is set to do s
1bac0 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20  omething useful 
1bad0 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75  for every .** su
1bae0 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
1baf0 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74  rser tree..*/.st
1bb00 61 74 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c  atic int exprWal
1bb10 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
1bb20 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74  tUsed, Expr *Not
1bb30 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
1bb40 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
1bb50 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
1bb60 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1bb70 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
1bb80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78  This routine "ex
1bb90 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20  pands" a SELECT 
1bba0 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c  statement and al
1bbb0 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72  l of its subquer
1bbc0 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69  ies..** For addi
1bbd0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1bbe0 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65  on on what it me
1bbf0 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20  ans to "expand" 
1bc00 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  a SELECT.** stat
1bc10 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63  ement, see the c
1bc20 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65  omment on the se
1bc30 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65  lectExpand worke
1bc40 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65  r callback above
1bc50 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e  ..**.** Expandin
1bc60 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  g a SELECT state
1bc70 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
1bc80 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73  t step in proces
1bc90 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54  sing a.** SELECT
1bca0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
1bcb0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1bcc0 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64  t must be expand
1bcd0 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d  ed before.** nam
1bce0 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20  e resolution is 
1bcf0 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a  performed..**.**
1bd00 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
1bd10 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f  s wrong, an erro
1bd20 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
1bd30 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65  tten into pParse
1bd40 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  ..** The calling
1bd50 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65   function can de
1bd60 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d  tect the problem
1bd70 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70   by looking at p
1bd80 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61  Parse->nErr.** a
1bd90 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62  nd/or pParse->db
1bda0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a  ->mallocFailed..
1bdb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1bdc0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
1bdd0 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
1bde0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
1bdf0 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
1be00 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
1be10 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61  ack = selectExpa
1be20 6e 64 65 72 3b 0a 20 20 77 2e 78 45 78 70 72 43  nder;.  w.xExprC
1be30 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61  allback = exprWa
1be40 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
1be50 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
1be60 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
1be70 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d  (&w, pSelect);.}
1be80 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
1be90 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1bea0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
1beb0 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
1bec0 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20  llback callback 
1bed0 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53  for the sqlite3S
1bee0 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a  electTypeInfo().
1bef0 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
1bf00 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f  .** For each FRO
1bf10 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
1bf20 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54  y, add Column.zT
1bf30 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a  ype and Column.z
1bf40 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  Coll.** informat
1bf50 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ion to the Table
1bf60 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1bf70 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
1bf80 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20  esult set.** of 
1bf90 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a  that subquery..*
1bfa0 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
1bfb0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
1bfc0 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
1bfd0 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73  ult set was cons
1bfe0 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65  tructed.** by se
1bff0 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62  lectExpander() b
1c000 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ut the type and 
1c010 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
1c020 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65  ation was omitte
1c030 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69  d.** at that poi
1c040 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74  nt because ident
1c050 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79  ifiers had not y
1c060 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  et been resolved
1c070 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
1c080 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
1c090 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65  er identifier re
1c0a0 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
1c0b0 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 41 64  tic int selectAd
1c0c0 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
1c0d0 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  o(Walker *pWalke
1c0e0 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
1c0f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
1c100 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69    int i;.  SrcLi
1c110 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
1c120 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1c130 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61  tem *pFrom;..  a
1c140 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
1c150 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64  gs & SF_Resolved
1c160 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
1c170 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1c180 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20  HasTypeInfo)==0 
1c190 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  );.  p->selFlags
1c1a0 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e   |= SF_HasTypeIn
1c1b0 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70  fo;.  pParse = p
1c1c0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
1c1d0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
1c1e0 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  pSrc;.  for(i=0,
1c1f0 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
1c200 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
1c210 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
1c220 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
1c230 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
1c240 61 62 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41  ab;.    if( ALWA
1c250 59 53 28 70 54 61 62 21 3d 30 29 20 26 26 20 28  YS(pTab!=0) && (
1c260 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
1c270 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
1c280 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
1c290 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
1c2a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1c2b0 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
1c2c0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
1c2d0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
1c2e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c2f0 53 65 6c 20 29 3b 0a 20 20 20 20 20 20 77 68 69  Sel );.      whi
1c300 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
1c310 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e   ) pSel = pSel->
1c320 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 65  pPrior;.      se
1c330 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
1c340 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
1c350 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  arse, pTab->nCol
1c360 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53  , pTab->aCol, pS
1c370 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  el);.    }.  }. 
1c380 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1c390 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  inue;.}.#endif..
1c3a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1c3b0 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70  ine adds datatyp
1c3c0 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  e and collating 
1c3d0 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61  sequence informa
1c3e0 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54  tion to.** the T
1c3f0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20  able structures 
1c400 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  of all FROM-clau
1c410 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  se subqueries in
1c420 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
1c430 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73  tement..**.** Us
1c440 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  e this routine a
1c450 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
1c460 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1c470 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1c480 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61  ctAddTypeInfo(Pa
1c490 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
1c4a0 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23  ect *pSelect){.#
1c4b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c4c0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61  IT_SUBQUERY.  Wa
1c4d0 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c  lker w;.  w.xSel
1c4e0 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
1c4f0 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
1c500 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78  ypeInfo;.  w.xEx
1c510 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
1c520 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
1c530 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
1c540 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
1c550 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
1c560 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
1c570 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c580 73 65 74 73 20 6f 66 20 61 20 53 45 4c 45 43 54  sets of a SELECT
1c590 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
1c5a0 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
1c5b0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
1c5c0 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
1c5d0 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
1c5e0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
1c5f0 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
1c600 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
1c610 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
1c620 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
1c630 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
1c640 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
1c650 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
1c660 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
1c670 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1c680 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
1c690 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
1c6a0 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
1c6b0 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
1c6c0 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
1c6d0 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
1c6e0 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
1c6f0 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
1c700 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
1c710 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
1c720 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1c730 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
1c740 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
1c750 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
1c760 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
1c770 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
1c780 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
1c790 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1c7a0 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
1c7b0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
1c7c0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1c7d0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
1c7e0 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
1c7f0 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
1c800 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
1c810 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
1c820 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
1c830 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
1c840 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45   *db;.  if( NEVE
1c850 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
1c860 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
1c870 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  >db;.  if( p->se
1c880 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
1c890 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
1c8a0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1c8b0 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20  tExpand(pParse, 
1c8c0 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p);.  if( pParse
1c8d0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
1c8e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1c8f0 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  urn;.  sqlite3Re
1c900 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73  solveSelectNames
1c910 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74  (pParse, p, pOut
1c920 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61  erNC);.  if( pPa
1c930 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1c940 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1c950 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1c960 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
1c970 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d  fo(pParse, p);.}
1c980 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
1c990 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
1c9a0 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
1c9b0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
1c9c0 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
1c9d0 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
1c9e0 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
1c9f0 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
1ca00 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
1ca10 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
1ca20 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
1ca30 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72  tine simply stor
1ca40 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20  es NULLs in all 
1ca50 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20  of those memory 
1ca60 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
1ca70 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
1ca80 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
1ca90 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
1caa0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
1cab0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1cac0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
1cad0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
1cae0 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66  unc *pFunc;.  if
1caf0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
1cb00 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  c+pAggInfo->nCol
1cb10 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  umn==0 ){.    re
1cb20 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  turn;.  }.  for(
1cb30 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
1cb40 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
1cb50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cb60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1cb70 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61  , 0, pAggInfo->a
1cb80 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20  Col[i].iMem);.  
1cb90 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41  }.  for(pFunc=pA
1cba0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69  ggInfo->aFunc, i
1cbb0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
1cbc0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e  nFunc; i++, pFun
1cbd0 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c++){.    sqlite
1cbe0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cbf0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63  P_Null, 0, pFunc
1cc00 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28  ->iMem);.    if(
1cc10 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
1cc20 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  t>=0 ){.      Ex
1cc30 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e  pr *pE = pFunc->
1cc40 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1cc50 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1cc60 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73  perty(pE, EP_xIs
1cc70 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
1cc80 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74   if( pE->x.pList
1cc90 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69  ==0 || pE->x.pLi
1cca0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
1ccb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ccc0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1ccd0 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67  "DISTINCT aggreg
1cce0 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65  ates must have e
1ccf0 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20  xactly one ".   
1cd00 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e          "argumen
1cd10 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75  t");.        pFu
1cd20 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  nc->iDistinct = 
1cd30 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
1cd40 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
1cd50 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79   *pKeyInfo = key
1cd60 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
1cd70 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70  (pParse, pE->x.p
1cd80 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73  List);.        s
1cd90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1cda0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
1cdb0 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69  eral, pFunc->iDi
1cdc0 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cde0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1cdf0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
1ce00 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
1ce10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ce20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
1ce30 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69  the OP_AggFinali
1ce40 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76  ze opcode for ev
1ce50 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75  ery aggregate fu
1ce60 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  nction.** in the
1ce70 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
1ce80 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
1ce90 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75  id finalizeAggFu
1cea0 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70  nctions(Parse *p
1ceb0 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
1cec0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
1ced0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1cee0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
1cef0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1cf00 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28  func *pF;.  for(
1cf10 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
1cf20 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
1cf30 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
1cf40 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   pF++){.    Expr
1cf50 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
1cf60 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ->pExpr->x.pList
1cf70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
1cf80 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1cf90 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  F->pExpr, EP_xIs
1cfa0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73  Select) );.    s
1cfb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1cfc0 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c  (v, OP_AggFinal,
1cfd0 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74   pF->iMem, pList
1cfe0 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
1cff0 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  : 0, 0,.        
1d000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1d010 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
1d020 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d  P4_FUNCDEF);.  }
1d030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
1d040 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
1d050 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
1d060 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62  r an aggregate b
1d070 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  ased on.** the c
1d080 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
1d090 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  sition..*/.stati
1d0a0 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63  c void updateAcc
1d0b0 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
1d0c0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
1d0d0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
1d0e0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1d0f0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
1d100 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1d110 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72  _func *pF;.  str
1d120 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
1d130 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f  *pC;..  pAggInfo
1d140 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  ->directMode = 1
1d150 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
1d160 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
1d170 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  );.  for(i=0, pF
1d180 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
1d190 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
1d1a0 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
1d1b0 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
1d1c0 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20     int addrNext 
1d1d0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  = 0;.    int reg
1d1e0 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Agg;.    ExprLis
1d1f0 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
1d200 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1d210 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1d220 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
1d230 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1d240 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
1d250 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
1d260 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Arg = pList->nEx
1d270 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67  pr;.      regAgg
1d280 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1d290 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1d2a0 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Arg);.      sqli
1d2b0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
1d2c0 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
1d2d0 74 2c 20 72 65 67 41 67 67 2c 20 30 29 3b 0a 20  t, regAgg, 0);. 
1d2e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d2f0 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nArg = 0;.      
1d300 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  regAgg = 0;.    
1d310 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
1d320 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
1d330 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
1d340 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1d350 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73  bel(v);.      as
1d360 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
1d370 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
1d380 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e  nct(pParse, pF->
1d390 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
1d3a0 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b  ext, 1, regAgg);
1d3b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1d3c0 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20  F->pFunc->flags 
1d3d0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
1d3e0 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
1d3f0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
1d400 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
1d410 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1d420 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
1d430 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
1d440 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
1d450 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
1d460 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44  ->pFunc has NEED
1d470 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f  COLL */.      fo
1d480 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
1d490 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
1d4a0 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
1d4b0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
1d4c0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1d4d0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1d4e0 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
1d4f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d500 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
1d510 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
1d520 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
1d530 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
1d540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d550 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
1d560 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  eq, 0, 0, 0, (ch
1d570 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
1d580 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
1d590 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d5a0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74  dOp4(v, OP_AggSt
1d5b0 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70  ep, 0, regAgg, p
1d5c0 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20  F->iMem,.       
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1d5e0 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
1d5f0 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
1d600 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1d610 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72  ngeP5(v, (u8)nAr
1d620 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
1d630 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
1d640 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
1d650 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
1d660 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1d670 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
1d680 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
1d690 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78  .    if( addrNex
1d6a0 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
1d6b0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1d6c0 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b  el(v, addrNext);
1d6d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1d6e0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
1d6f0 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
1d700 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41    for(i=0, pC=pA
1d710 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c  ggInfo->aCol; i<
1d720 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
1d730 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b  ulator; i++, pC+
1d740 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
1d750 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1d760 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69  pC->pExpr, pC->i
1d770 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67  Mem);.  }.  pAgg
1d780 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
1d790 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
1d7a0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
1d7b0 61 72 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  arse);.}../*.** 
1d7c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1d7d0 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  r the SELECT sta
1d7e0 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20  tement given in 
1d7f0 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20  the p argument. 
1d800 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
1d810 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75  lts are distribu
1d820 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77  ted in various w
1d830 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ays depending on
1d840 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
1d850 20 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65   of the SelectDe
1d860 73 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  st structure poi
1d870 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d  nted to by argum
1d880 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20  ent pDest.** as 
1d890 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1d8a0 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20     pDest->eDest 
1d8b0 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20     Result.**    
1d8c0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20   ------------   
1d8d0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
1d8e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d8f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
1d900 20 20 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20      SRT_Output  
1d910 20 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 72      Generate a r
1d920 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73  ow of output (us
1d930 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c  ing the OP_Resul
1d940 74 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  tRow.**         
1d950 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f              opco
1d960 64 65 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77  de) for each row
1d970 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
1d980 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  et..**.**     SR
1d990 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e  T_Mem         On
1d9a0 6c 79 20 76 61 6c 69 64 20 69 66 20 74 68 65 20  ly valid if the 
1d9b0 72 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67  result is a sing
1d9c0 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20  le column..**   
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9e0 20 20 53 74 6f 72 65 20 74 68 65 20 66 69 72 73    Store the firs
1d9f0 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
1da00 66 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77  first result row
1da10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1da20 20 20 20 20 20 20 20 20 69 6e 20 72 65 67 69 73          in regis
1da30 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ter pDest->iParm
1da40 20 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74 68   then abandon th
1da50 65 20 72 65 73 74 0a 2a 2a 20 20 20 20 20 20 20  e rest.**       
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
1da70 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69   the query.  Thi
1da80 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 6d  s destination im
1da90 70 6c 69 65 73 20 22 4c 49 4d 49 54 20 31 22 2e  plies "LIMIT 1".
1daa0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53  .**.**     SRT_S
1dab0 65 74 20 20 20 20 20 20 20 20 20 54 68 65 20 72  et         The r
1dac0 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 61 20  esult must be a 
1dad0 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20  single column.  
1dae0 53 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20 20  Store each.**   
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db00 20 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 20    row of result 
1db10 61 73 20 74 68 65 20 6b 65 79 20 69 6e 20 74 61  as the key in ta
1db20 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
1db30 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  . .**           
1db40 20 20 20 20 20 20 20 20 20 20 41 70 70 6c 79 20            Apply 
1db50 74 68 65 20 61 66 66 69 6e 69 74 79 20 70 44 65  the affinity pDe
1db60 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 62 65 66  st->affinity bef
1db70 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a 2a 20 20  ore storing.**  
1db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db90 20 20 20 72 65 73 75 6c 74 73 2e 20 20 55 73 65     results.  Use
1dba0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22  d to implement "
1dbb0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
1dbc0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1dbd0 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
1dbe0 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
1dbf0 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
1dc00 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
1dc10 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
1dc20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20  SRT_Except      
1dc30 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66  Remove results f
1dc40 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rom the temporar
1dc50 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
1dc60 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
1dc70 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20  SRT_Table       
1dc80 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e  Store results in
1dc90 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1dca0 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
1dcb0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1dcc0 20 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69        This is li
1dcd0 6b 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20  ke SRT_EphemTab 
1dce0 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
1dcf0 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
1dd10 61 73 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61  assumed to alrea
1dd20 64 79 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a  dy be open..**.*
1dd30 2a 20 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54  *     SRT_EphemT
1dd40 61 62 20 20 20 20 43 72 65 61 74 65 20 61 6e 20  ab    Create an 
1dd50 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1dd60 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 61 6e 64  pDest->iParm and
1dd70 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20   store.**       
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
1dd90 65 20 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20  e result there. 
1dda0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1ddb0 66 74 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a  ft open after.**
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddd0 20 20 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 20       returning. 
1dde0 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52   This is like SR
1ddf0 54 5f 54 61 62 6c 65 20 65 78 63 65 70 74 20 74  T_Table except t
1de00 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1de10 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 20             this 
1de20 64 65 73 74 69 6e 61 74 69 6f 6e 20 75 73 65 73  destination uses
1de30 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1de40 6c 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 20  l to create.**  
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 20 20 74 68 65 20 74 61 62 6c 65 20 66 69 72     the table fir
1de70 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  st..**.**     SR
1de80 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 47 65  T_Coroutine   Ge
1de90 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74  nerate a co-rout
1dea0 69 6e 65 20 74 68 61 74 20 72 65 74 75 72 6e 73  ine that returns
1deb0 20 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a 2a   a new row of.**
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ded0 20 20 20 20 20 72 65 73 75 6c 74 73 20 65 61 63       results eac
1dee0 68 20 74 69 6d 65 20 69 74 20 69 73 20 69 6e 76  h time it is inv
1def0 6f 6b 65 64 2e 20 20 54 68 65 20 65 6e 74 72 79  oked.  The entry
1df00 20 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20   point.**       
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
1df20 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
1df30 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
1df40 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61  ister pDest->iPa
1df50 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
1df60 54 5f 45 78 69 73 74 73 20 20 20 20 20 20 53 74  T_Exists      St
1df70 6f 72 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72  ore a 1 in memor
1df80 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50  y cell pDest->iP
1df90 61 72 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c  arm if the resul
1dfa0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1dfb0 20 20 20 20 20 20 20 20 20 73 65 74 20 69 73 20           set is 
1dfc0 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a  not empty..**.**
1dfd0 20 20 20 20 20 53 52 54 5f 44 69 73 63 61 72 64       SRT_Discard
1dfe0 20 20 20 20 20 54 68 72 6f 77 20 74 68 65 20 72       Throw the r
1dff0 65 73 75 6c 74 73 20 61 77 61 79 2e 20 20 54 68  esults away.  Th
1e000 69 73 20 69 73 20 75 73 65 64 20 62 79 20 53 45  is is used by SE
1e010 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
1e020 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74              stat
1e030 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72  ements within tr
1e040 69 67 67 65 72 73 20 77 68 6f 73 65 20 6f 6e 6c  iggers whose onl
1e050 79 20 70 75 72 70 6f 73 65 20 69 73 0a 2a 2a 20  y purpose is.** 
1e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e070 20 20 20 20 74 68 65 20 73 69 64 65 2d 65 66 66      the side-eff
1e080 65 63 74 73 20 6f 66 20 66 75 6e 63 74 69 6f 6e  ects of function
1e090 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1e0a0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1e0b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1e0c0 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
1e0d0 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
1e0e0 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
1e0f0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
1e100 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
1e110 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
1e120 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
1e130 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
1e140 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
1e150 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
1e160 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
1e170 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1e180 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
1e190 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  at..*/.int sqlit
1e1a0 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
1e1b0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1e1c0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
1e1d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
1e1e0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
1e1f0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
1e200 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
1e210 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53  ng coded. */.  S
1e220 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
1e230 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
1e240 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65   do with the que
1e250 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
1e260 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
1e270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1e280 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1e290 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1e2a0 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  o;     /* Return
1e2b0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65   from sqlite3Whe
1e2c0 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56  reBegin() */.  V
1e2d0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
1e2e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
1e2f0 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
1e300 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1e310 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20  */.  int isAgg; 
1e320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e330 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c  rue for select l
1e340 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74  ists like "count
1e350 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69  (*)" */.  ExprLi
1e360 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
1e370 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
1e380 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20  mns to extract. 
1e390 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
1e3a0 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c  abList;     /* L
1e3b0 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ist of tables to
1e3c0 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a   select from */.
1e3d0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
1e3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e3f0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
1e400 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1e410 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1e420 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  By;    /* The OR
1e430 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
1e440 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1e450 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
1e460 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
1e470 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
1e480 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
1e490 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
1e4a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e4b0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
1e4c0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1e4d0 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b   int isDistinct;
1e4e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e4f0 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
1e500 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
1e510 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74  nt */.  int dist
1e520 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f  inct;          /
1e530 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66  * Table to use f
1e540 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
1e550 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  set */.  int rc 
1e560 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1e570 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
1e580 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
1e590 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
1e5a0 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20  ddrSortIndex;   
1e5b0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1e5c0 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  an OP_OpenEpheme
1e5d0 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
1e5e0 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
1e5f0 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
1e600 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
1e610 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
1e620 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
1e630 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
1e640 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1e650 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
1e660 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
1e670 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
1e680 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1e690 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
1e6a0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1e6b0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
1e6c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1e6d0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1e6e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1e6f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
1e700 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1e710 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
1e720 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
1e730 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
1e740 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
1e750 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
1e760 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72 61  );..  if( Ignora
1e770 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
1e780 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
1e790 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1e7a0 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
1e7b0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
1e7c0 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
1e7d0 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
1e7e0 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
1e7f0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1e800 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20 2f  _Discard);.    /
1e810 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61  * If ORDER BY ma
1e820 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63  kes no differenc
1e830 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  e in the output 
1e840 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65  then neither doe
1e850 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43  s.    ** DISTINC
1e860 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72  T so it can be r
1e870 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20  emoved too. */. 
1e880 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
1e890 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
1e8a0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70  pOrderBy);.    p
1e8b0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
1e8c0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
1e8d0 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
1e8e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
1e8f0 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
1e900 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65 72   p, 0);.  pOrder
1e910 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1e920 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
1e930 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
1e940 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
1e950 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1e960 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1e970 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
1e980 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
1e990 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73  .  isAgg = (p->s
1e9a0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
1e9b0 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73  regate)!=0;.  as
1e9c0 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
1e9d0 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  );..  /* Begin g
1e9e0 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a  enerating code..
1e9f0 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
1ea00 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1ea10 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
1ea20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1ea30 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1ea40 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
1ea50 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
1ea60 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
1ea70 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1ea80 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1ea90 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1eaa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1eab0 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d  ).  for(i=0; !p-
1eac0 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61  >pPrior && i<pTa
1ead0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1eae0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
1eaf0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1eb00 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
1eb10 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  [i];.    SelectD
1eb20 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65  est dest;.    Se
1eb30 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74  lect *pSub = pIt
1eb40 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
1eb50 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a   int isAggSub;..
1eb60 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
1eb70 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75  || pItem->isPopu
1eb80 6c 61 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65  lated ) continue
1eb90 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  ;..    /* Increm
1eba0 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
1ebb0 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
1ebc0 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
1ebd0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
1ebe0 20 74 72 65 65 20 72 65 66 65 72 65 64 20 74 6f   tree refered to
1ebf0 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61   by this, the pa
1ec00 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65  rent select. The
1ec10 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20   child select.  
1ec20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e    ** may contain
1ec30 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1ec40 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20  s of at most.   
1ec50 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f   ** (SQLITE_MAX_
1ec60 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65  EXPR_DEPTH-Parse
1ec70 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74  .nHeight) height
1ec80 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a  . This is a bit.
1ec90 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73      ** more cons
1eca0 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65  ervative than ne
1ecb0 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63  cessary, but muc
1ecc0 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e  h easier than en
1ecd0 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61  forcing.    ** a
1ece0 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20  n exact limit.. 
1ecf0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65     */.    pParse
1ed00 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c  ->nHeight += sql
1ed10 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
1ed20 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  ight(p);..    /*
1ed30 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1ed40 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63 61   the subquery ca
1ed50 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e  n be absorbed in
1ed60 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a  to the parent. *
1ed70 2f 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d  /.    isAggSub =
1ed80 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
1ed90 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
1eda0 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  !=0;.    if( fla
1edb0 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
1edc0 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
1edd0 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20  , isAggSub) ){. 
1ede0 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75       if( isAggSu
1edf0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41  b ){.        isA
1ee00 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  gg = 1;.        
1ee10 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
1ee20 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20  F_Aggregate;.   
1ee30 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d     }.      i = -
1ee40 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1ee50 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1ee60 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
1ee70 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
1ee80 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
1ee90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1eea0 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64  tem->isPopulated
1eeb0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1eec0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
1eed0 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
1eee0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73  .      pItem->is
1eef0 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20  Populated = 1;. 
1ef00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70     }.    if( /*p
1ef10 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f  Parse->nErr ||*/
1ef20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1ef30 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  d ){.      goto 
1ef40 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
1ef50 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  }.    pParse->nH
1ef60 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33  eight -= sqlite3
1ef70 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
1ef80 28 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  (p);.    pTabLis
1ef90 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
1efa0 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f   if( !IgnorableO
1efb0 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
1efc0 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
1efd0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
1efe0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73     }.  }.  pELis
1eff0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23  t = p->pEList;.#
1f000 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d  endif.  pWhere =
1f010 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47   p->pWhere;.  pG
1f020 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
1f030 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20  upBy;.  pHaving 
1f040 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
1f050 69 73 44 69 73 74 69 6e 63 74 20 3d 20 28 70 2d  isDistinct = (p-
1f060 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1f070 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69  istinct)!=0;..#i
1f080 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f090 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
1f0a0 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  T.  /* If there 
1f0b0 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63  is are a sequenc
1f0c0 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f  e of queries, do
1f0d0 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65   the earlier one
1f0e0 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20  s first..  */.  
1f0f0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
1f100 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67  .    if( p->pRig
1f110 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20  htmost==0 ){.   
1f120 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
1f130 2c 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20  , *pRight = 0;. 
1f140 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30       int cnt = 0
1f150 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65  ;.      int mxSe
1f160 6c 65 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  lect;.      for(
1f170 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
1f180 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
1f190 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20  ior, cnt++){.   
1f1a0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67       pLoop->pRig
1f1b0 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20  htmost = p;.    
1f1c0 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74      pLoop->pNext
1f1d0 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
1f1e0 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f     pRight = pLoo
1f1f0 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
1f200 20 6d 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e   mxSelect = db->
1f210 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
1f220 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
1f230 45 43 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ECT];.      if( 
1f240 6d 78 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e  mxSelect && cnt>
1f250 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  mxSelect ){.    
1f260 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1f270 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
1f280 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63   many terms in c
1f290 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29  ompound SELECT")
1f2a0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f2b0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1f2c0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  }.    return mul
1f2d0 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
1f2e0 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a   p, pDest);.  }.
1f2f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1f300 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72  writing to memor
1f310 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  y or generating 
1f320 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20  a set.  ** only 
1f330 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
1f340 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  may be output.. 
1f350 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1f360 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1f370 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d  .  if( checkForM
1f380 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74  ultiColumnSelect
1f390 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44  Error(pParse, pD
1f3a0 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  est, pEList->nEx
1f3b0 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  pr) ){.    goto 
1f3c0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
1f3d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1f3e0 70 6f 73 73 69 62 6c 65 2c 20 72 65 77 72 69 74  possible, rewrit
1f3f0 65 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 75  e the query to u
1f400 73 65 20 47 52 4f 55 50 20 42 59 20 69 6e 73 74  se GROUP BY inst
1f410 65 61 64 20 6f 66 20 44 49 53 54 49 4e 43 54 2e  ead of DISTINCT.
1f420 0a 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d  .  ** GROUP BY m
1f430 69 67 68 74 20 75 73 65 20 61 6e 20 69 6e 64 65  ight use an inde
1f440 78 2c 20 44 49 53 54 49 4e 43 54 20 6e 65 76 65  x, DISTINCT neve
1f450 72 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 61  r does..  */.  a
1f460 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
1f470 42 79 3d 3d 30 20 7c 7c 20 28 70 2d 3e 73 65 6c  By==0 || (p->sel
1f480 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
1f490 67 61 74 65 29 21 3d 30 20 29 3b 0a 20 20 69 66  gate)!=0 );.  if
1f4a0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1f4b0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
1f4c0 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
1f4d0 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
1f4e0 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
1f4f0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
1f500 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
1f510 20 30 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42   0);.    pGroupB
1f520 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
1f530 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
1f540 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
1f550 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74  ;.    isDistinct
1f560 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1f570 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
1f580 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
1f590 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e  then this sortin
1f5a0 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67  g.  ** index mig
1f5b0 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
1f5c0 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61  unused if the da
1f5d0 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20  ta can be .  ** 
1f5e0 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65  extracted in pre
1f5f0 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20  -sorted order.  
1f600 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
1f610 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ase, then the.  
1f620 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  ** OP_OpenEpheme
1f630 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
1f640 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1f650 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
1f660 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72  ce.  ** we figur
1f670 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73  e out that the s
1f680 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20  orting index is 
1f690 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
1f6a0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20   addrSortIndex. 
1f6b0 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
1f6c0 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
1f6d0 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  te that change..
1f6e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
1f6f0 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
1f700 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
1f710 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
1f720 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
1f730 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
1f740 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79  y);.    pOrderBy
1f750 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  ->iECursor = pPa
1f760 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
1f770 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
1f780 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e  [2] = addrSortIn
1f790 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  dex =.      sqli
1f7a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1f7b0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1f7c0 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
1f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
1f7e0 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
1f7f0 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
1f800 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  r+2, 0,.        
1f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f820 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
1f830 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
1f840 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65  ANDOFF);.  }else
1f850 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e  {.    addrSortIn
1f860 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  dex = -1;.  }.. 
1f870 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
1f880 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
1f890 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
1f8a0 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
1f8b0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
1f8c0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1f8d0 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
1f8e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f8f0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
1f900 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d  phemeral, pDest-
1f910 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e  >iParm, pEList->
1f920 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nExpr);.  }..  /
1f930 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
1f940 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d  r..  */.  iEnd =
1f950 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1f960 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70  Label(v);.  comp
1f970 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
1f980 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e  s(pParse, p, iEn
1f990 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61  d);..  /* Open a
1f9a0 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
1f9b0 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
1f9c0 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
1f9d0 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63  .  if( isDistinc
1f9e0 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  t ){.    KeyInfo
1f9f0 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
1fa00 61 73 73 65 72 74 28 20 69 73 41 67 67 20 7c 7c  assert( isAgg ||
1fa10 20 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20   pGroupBy );.   
1fa20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72   distinct = pPar
1fa30 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1fa40 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
1fa50 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
1fa60 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
1fa70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1fa80 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
1fa90 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 69  penEphemeral, di
1faa0 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fac0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
1fad0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
1fae0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65  O_HANDOFF);.  }e
1faf0 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  lse{.    distinc
1fb00 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  t = -1;.  }..  /
1fb10 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e 64 20  * Aggregate and 
1fb20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
1fb30 65 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65  eries are handle
1fb40 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f  d differently */
1fb50 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26  .  if( !isAgg &&
1fb60 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
1fb70 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
1fb80 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72   is for non-aggr
1fb90 65 67 61 74 65 20 71 75 65 72 69 65 73 0a 20 20  egate queries.  
1fba0 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65 20 64    ** Begin the d
1fbb0 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 20  atabase scan.   
1fbc0 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d   */.    pWInfo =
1fbd0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1fbe0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
1fbf0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f  ist, pWhere, &pO
1fc00 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20  rderBy, 0);.    
1fc10 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
1fc20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1fc30 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
1fc40 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
1fc50 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
1fc60 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  prior OP_OpenEph
1fc70 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69  emeral .    ** i
1fc80 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64  nstruction ended
1fc90 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65   up not being ne
1fca0 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67  eded, then chang
1fcb0 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
1fcc0 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  emeral.    ** in
1fcd0 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20  to an OP_Noop.. 
1fce0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64     */.    if( ad
1fcf0 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26  drSortIndex>=0 &
1fd00 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  & pOrderBy==0 ){
1fd10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1fd20 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
1fd30 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c  , addrSortIndex,
1fd40 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64   1);.      p->ad
1fd50 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
1fd60 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  -1;.    }..    /
1fd70 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
1fd80 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20  rd inner loop.  
1fd90 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1fda0 21 69 73 44 69 73 74 69 6e 63 74 29 3b 0a 20 20  !isDistinct);.  
1fdb0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
1fdc0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
1fdd0 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
1fde0 72 42 79 2c 20 2d 31 2c 20 70 44 65 73 74 2c 0a  rBy, -1, pDest,.
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e      pWInfo->iCon
1fe10 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  tinue, pWInfo->i
1fe20 42 72 65 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20  Break);..    /* 
1fe30 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
1fe40 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
1fe50 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
1fe60 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
1fe70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1fe80 54 68 69 73 20 69 73 20 74 68 65 20 70 72 6f 63  This is the proc
1fe90 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
1fea0 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
1feb0 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
1fec0 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
1fed0 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
1fee0 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
1fef0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
1ff00 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
1ff10 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1ff20 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
1ff30 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
1ff40 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
1ff50 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
1ff60 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
1ff70 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
1ff80 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
1ff90 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
1ffa0 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
1ffb0 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
1ffc0 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
1ffd0 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fff0 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
20000 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
20010 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
20020 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
20030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20040 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
20050 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
20060 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
20070 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
20080 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
20090 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
200a0 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
200b0 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
200c0 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
200d0 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
200e0 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
200f0 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
20100 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
20110 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
20120 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  LECT */..    /* 
20130 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61  Remove any and a
20140 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65  ll aliases betwe
20150 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  en the result se
20160 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  t and the.    **
20170 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
20180 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
20190 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
201a0 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20     int k;       
201b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201c0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
201d0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
201e0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
201f0 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c  pItem;  /* For l
20200 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72  ooping over expr
20210 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74  ession in a list
20220 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b   */..      for(k
20230 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
20240 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69  r, pItem=p->pELi
20250 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  st->a; k>0; k--,
20260 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
20270 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73     pItem->iAlias
20280 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
20290 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70      for(k=pGroup
202a0 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  By->nExpr, pItem
202b0 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e  =pGroupBy->a; k>
202c0 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
202d0 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
202e0 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  >iAlias = 0;.   
202f0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 0a 20 20     }.    }.. .  
20300 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61    /* Create a la
20310 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77  bel to jump to w
20320 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61  hen we want to a
20330 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a  bort the query *
20340 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20  /.    addrEnd = 
20350 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
20360 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
20370 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55   Convert TK_COLU
20380 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b  MN nodes into TK
20390 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  _AGG_COLUMN and 
203a0 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a  make entries in.
203b0 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20      ** sAggInfo 
203c0 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46  for all TK_AGG_F
203d0 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
203e0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
203f0 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43  the.    ** SELEC
20400 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  T statement..   
20410 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
20420 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
20430 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50  NC));.    sNC.pP
20440 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
20450 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
20460 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  = pTabList;.    
20470 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26  sNC.pAggInfo = &
20480 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41  sAggInfo;.    sA
20490 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
204a0 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79  olumn = pGroupBy
204b0 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   ? pGroupBy->nEx
204c0 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41  pr+1 : 0;.    sA
204d0 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20  ggInfo.pGroupBy 
204e0 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = pGroupBy;.    
204f0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
20500 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
20510 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
20520 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
20530 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72  ggList(&sNC, pOr
20540 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
20550 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
20560 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
20570 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
20580 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
20590 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
205a0 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
205b0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
205c0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
205d0 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
205e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
205f0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
20600 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
20610 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
20620 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
20630 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20640 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
20650 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61  &sNC, sAggInfo.a
20660 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78  Func[i].pExpr->x
20670 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
20680 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
20690 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
206a0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20  elect_end;..    
206b0 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f  /* Processing fo
206c0 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  r aggregates wit
206d0 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65  h GROUP BY is ve
206e0 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64  ry different and
206f0 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72  .    ** much mor
20700 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61  e complex than a
20710 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75  ggregates withou
20720 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20  t a GROUP BY..  
20730 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
20740 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b  oupBy ){.      K
20750 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
20760 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66  ;  /* Keying inf
20770 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
20780 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
20790 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31   */.      int j1
207a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
207b0 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73   A-vs-B comparis
207c0 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20  ion jump */.    
207d0 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74    int addrOutput
207e0 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  Row;  /* Start o
207f0 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  f subroutine tha
20800 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75  t outputs a resu
20810 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  lt row */.      
20820 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77  int regOutputRow
20830 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64  ;   /* Return ad
20840 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
20850 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  or output subrou
20860 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
20870 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20  t addrSetAbort; 
20880 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f    /* Set the abo
20890 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75  rt flag and retu
208a0 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rn */.      int 
208b0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
208c0 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
208d0 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
208e0 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e    int addrSortin
208f0 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f  gIdx; /* The OP_
20900 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f  OpenEphemeral fo
20910 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
20920 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
20930 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20   addrReset;     
20940 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66   /* Subroutine f
20950 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65  or resetting the
20960 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a   accumulator */.
20970 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73        int regRes
20980 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74  et;       /* Ret
20990 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
209a0 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73  ster for reset s
209b0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  ubroutine */..  
209c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
209d0 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  is a GROUP BY cl
209e0 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65  ause we might ne
209f0 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  ed a sorting ind
20a00 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69  ex to.      ** i
20a10 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c  mplement it.  Al
20a20 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74  locate that sort
20a30 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20  ing index now.  
20a40 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a  If it turns out.
20a50 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
20a60 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20   do not need it 
20a70 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f  after all, the O
20a80 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
20a90 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  truction.      *
20aa0 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  * will be conver
20ab0 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e  ted into a Noop.
20ac0 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
20ad0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
20ae0 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ngIdx = pParse->
20af0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b  nTab++;.      pK
20b00 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
20b10 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
20b20 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a  rse, pGroupBy);.
20b30 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
20b40 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
20b50 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
20b60 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20  penEphemeral, . 
20b70 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
20b80 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41  o.sortingIdx, sA
20b90 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
20ba0 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20  olumn, .        
20bb0 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79    0, (char*)pKey
20bc0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
20bd0 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20  _HANDOFF);..    
20be0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
20bf0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
20c00 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
20c10 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
20c20 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
20c30 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
20c40 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
20c50 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
20c60 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
20c70 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74  em;.      regOut
20c80 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73  putRow = ++pPars
20c90 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
20ca0 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
20cb0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
20cc0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65  bel(v);.      re
20cd0 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  gReset = ++pPars
20ce0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
20cf0 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
20d00 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
20d10 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  v);.      iAMem 
20d20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
20d30 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
20d40 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
20d50 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
20d60 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
20d70 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
20d80 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
20d90 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
20da0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20db0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20dc0 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f  Integer, 0, iAbo
20dd0 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
20de0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
20df0 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
20e00 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
20e10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20e20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
20e30 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
20e40 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
20e50 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75  "indicate accumu
20e60 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a  lator empty"));.
20e70 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  .      /* Begin 
20e80 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
20e90 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75   extract all sou
20ea0 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55  rce rows in GROU
20eb0 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20  P BY order..    
20ec0 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
20ed0 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61  involve two sepa
20ee0 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20  rate loops with 
20ef0 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65  an OP_Sort in be
20f00 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20  tween, or.      
20f10 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ** it might be a
20f20 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61   single loop tha
20f30 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20  t uses an index 
20f40 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72  to extract infor
20f50 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  mation.      ** 
20f60 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64  in the right ord
20f70 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  er to begin with
20f80 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
20f90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20fa0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
20fb0 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
20fc0 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  set);.      pWIn
20fd0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
20fe0 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
20ff0 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
21000 20 26 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a   &pGroupBy, 0);.
21010 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
21020 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
21030 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28  t_end;.      if(
21040 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
21050 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
21060 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65  ptimizer is able
21070 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73   to deliver rows
21080 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64   in group by ord
21090 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a  er so.        **
210a0 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
210b0 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50  to sort.  The OP
210c0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74  _OpenEphemeral t
210d0 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  able will be.   
210e0 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65       ** cancelle
210f0 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20  d later because 
21100 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
21110 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66   use the pKeyInf
21120 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  o.        */.   
21130 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20       pGroupBy = 
21140 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
21150 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
21160 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
21170 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  e{.        /* Ro
21180 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75  ws are coming ou
21190 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65  t in undetermine
211a0 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76  d order.  We hav
211b0 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20  e to push.      
211c0 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e    ** each row in
211d0 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
211e0 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ex, terminate th
211f0 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20  e first loop,.  
21200 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f        ** then lo
21210 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74  op over the sort
21220 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64  ing index in ord
21230 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75  er to get the ou
21240 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  tput.        ** 
21250 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a  in sorted order.
21260 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21270 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a     int regBase;.
21280 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52          int regR
21290 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69  ecord;.        i
212a0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt nCol;.       
212b0 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a   int nGroupBy;..
212c0 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
212d0 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
212e0 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f   nGroupBy = pGro
212f0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
21300 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f       nCol = nGro
21310 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20  upBy + 1;.      
21320 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
21330 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
21340 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
21350 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
21360 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
21370 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
21380 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
21390 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
213a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
213b0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
213c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
213d0 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
213e0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
213f0 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
21400 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
21410 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
21420 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
21430 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
21440 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
21450 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65  GroupBy, regBase
21460 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
21470 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21480 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
21490 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
214a0 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f  Idx,regBase+nGro
214b0 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a  upBy);.        j
214c0 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20   = nGroupBy+1;. 
214d0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
214e0 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
214f0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
21500 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
21510 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
21520 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
21530 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
21540 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
21550 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
21560 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a        int r1 = j
21570 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20   + regBase;.    
21580 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a          int r2;.
21590 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32 20  .            r2 
215a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
215b0 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
215c0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
215d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215e0 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70     pCol->pTab, p
215f0 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43  Col->iColumn, pC
21600 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20  ol->iTable, r1, 
21610 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
21620 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20  if( r1!=r2 ){.  
21630 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21640 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21650 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72   OP_SCopy, r2, r
21660 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
21670 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  }.            j+
21680 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
21690 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
216a0 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
216b0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
216c0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
216d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
216e0 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
216f0 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
21700 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
21710 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21720 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
21730 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e  dxInsert, sAggIn
21740 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72  fo.sortingIdx, r
21750 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
21760 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
21770 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
21780 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
21790 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
217a0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
217b0 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
217c0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
217d0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
217e0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  nfo);.        sq
217f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21800 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67  v, OP_Sort, sAgg
21810 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
21820 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
21830 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
21840 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72  v, "GROUP BY sor
21850 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41  t"));.        sA
21860 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e  ggInfo.useSortin
21870 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  gIdx = 1;.      
21880 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
21890 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
218a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
218b0 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
218c0 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
218d0 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
218e0 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
218f0 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
21900 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
21910 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
21920 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
21930 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
21940 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
21950 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
21960 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
21970 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
21980 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
21990 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
219a0 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
219b0 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
219c0 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
219d0 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
219e0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
219f0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
21a00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21a10 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
21a20 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  e);.      for(j=
21a30 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
21a40 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
21a50 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
21a60 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
21a70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21a80 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
21a90 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
21aa0 67 49 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a  gIdx, j, iBMem+j
21ab0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
21ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67  {.          sAgg
21ad0 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20  Info.directMode 
21ae0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 1;.          s
21af0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
21b00 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
21b10 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d  >a[j].pExpr, iBM
21b20 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
21b30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
21b40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
21b50 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
21b60 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47  iAMem, iBMem, pG
21b70 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20  roupBy->nExpr,. 
21b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b90 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
21ba0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
21bb0 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20  INFO);.      j1 
21bc0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
21bd0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
21be0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21bf0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
21c00 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b   j1+1, 0, j1+1);
21c10 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
21c20 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75  ate code that ru
21c30 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ns whenever the 
21c40 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73  GROUP BY changes
21c50 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67  ..      ** Chang
21c60 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  es in the GROUP 
21c70 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20  BY are detected 
21c80 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
21c90 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c  code.      ** bl
21ca0 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77  ock.  If there w
21cb0 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20  ere no changes, 
21cc0 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b  this block is sk
21cd0 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ipped..      **.
21ce0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
21cf0 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e  de copies curren
21d00 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73  t group by terms
21d10 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e   in b0,b1,b2,...
21d20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  .      ** over t
21d30 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20  o a0,a1,a2.  It 
21d40 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f  then calls the o
21d50 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
21d60 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
21d70 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61  sets the aggrega
21d80 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  te accumulator r
21d90 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70  egisters in prep
21da0 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  aration.      **
21db0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52   for the next GR
21dc0 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20  OUP BY batch..  
21dd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
21de0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
21df0 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20  (pParse, iBMem, 
21e00 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iAMem, pGroupBy-
21e10 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  >nExpr);.      s
21e20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21e30 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
21e40 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
21e50 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
21e60 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
21e70 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  , "output one ro
21e80 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w"));.      sqli
21e90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21ea0 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72   OP_IfPos, iAbor
21eb0 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b  tFlag, addrEnd);
21ec0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
21ed0 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62  nt((v, "check ab
21ee0 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
21ef0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21f00 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
21f10 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
21f20 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  Reset);.      Vd
21f30 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
21f40 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72  eset accumulator
21f50 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  "));..      /* U
21f60 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67  pdate the aggreg
21f70 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73  ate accumulators
21f80 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
21f90 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a  ntent of.      *
21fa0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  * the current ro
21fb0 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  w.      */.     
21fc0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
21fd0 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
21fe0 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
21ff0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
22000 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
22010 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22020 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
22030 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  1, iUseFlag);.  
22040 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22050 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61  (v, "indicate da
22060 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f  ta in accumulato
22070 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
22080 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  End of the loop.
22090 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
220a0 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
220b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
220c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
220d0 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  P_Next, sAggInfo
220e0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
220f0 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
22100 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22110 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
22120 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
22130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
22140 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
22150 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29  drSortingIdx, 1)
22160 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
22170 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
22180 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
22190 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
221a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
221b0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
221c0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
221d0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
221e0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
221f0 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e  ((v, "output fin
22200 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20  al row"));..    
22210 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74    /* Jump over t
22220 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20  he subroutines. 
22230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
22240 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22250 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
22260 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ddrEnd);..      
22270 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
22280 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
22290 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72  tputs a single r
222a0 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
222b0 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20  .      ** set.  
222c0 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  This subroutine 
222d0 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74  first looks at t
222e0 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66  he iUseFlag.  If
222f0 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20   iUseFlag.      
22300 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
22310 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
22320 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
22330 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
22340 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
22350 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66  ocessing calls f
22360 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
22370 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72  abort, this subr
22380 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
22390 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69  increments the i
223a0 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79  AbortFlag memory
223b0 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
223c0 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20   returning in.  
223d0 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20      ** order to 
223e0 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65  signal the calle
223f0 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20  r to abort..    
22400 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53    */.      addrS
22410 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65  etAbort = sqlite
22420 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
22430 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
22440 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22450 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
22460 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
22470 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
22480 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61  , "set abort fla
22490 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
224a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
224b0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
224c0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
224d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
224e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
224f0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
22500 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
22510 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
22520 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
22530 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22540 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
22550 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
22560 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20  OutputRow+2);.  
22570 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22580 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73  (v, "Groupby res
22590 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e  ult generator en
225a0 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20  try point"));.  
225b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
225c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
225d0 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
225e0 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
225f0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
22600 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
22610 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 61 76  ;.      if( pHav
22620 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
22630 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
22640 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
22650 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
22660 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  +1, SQLITE_JUMPI
22670 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
22680 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
22690 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
226a0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
226b0 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , pOrderBy,.    
226c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226d0 20 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65 73    distinct, pDes
226e0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
226f0 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
22700 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
22710 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73  tAbort);.      s
22720 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
22730 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
22740 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
22750 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22760 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79  (v, "end groupby
22770 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
22780 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
22790 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
227a0 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
227b0 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
227c0 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
227d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
227e0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
227f0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73  Label(v, addrRes
22800 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  et);.      reset
22810 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
22820 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
22830 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22840 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
22850 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b  turn, regReset);
22860 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20  .     .    } /* 
22870 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20  endif pGroupBy. 
22880 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65   Begin aggregate
22890 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74   queries without
228a0 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20   GROUP BY: */.  
228b0 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45    else {.      E
228c0 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20  xprList *pDel = 
228d0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
228e0 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
228f0 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  T.      Table *p
22900 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Tab;.      if( (
22910 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43  pTab = isSimpleC
22920 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66  ount(p, &sAggInf
22930 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  o))!=0 ){.      
22940 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65    /* If isSimple
22950 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20  Count() returns 
22960 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
22970 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  able structure, 
22980 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
22990 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
229a0 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
229b0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
229c0 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
229d0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
229e0 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  tbl>.        **.
229f0 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65          ** where
22a00 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
22a10 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65  ture returned re
22a20 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c  presents table <
22a30 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tbl>..        **
22a40 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
22a50 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f   statement is so
22a60 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20   common that it 
22a70 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65  is optimized spe
22a80 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20  cially. The.    
22a90 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20      ** OP_Count 
22aa0 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65  instruction is e
22ab0 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f  xecuted either o
22ac0 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62  n the intkey tab
22ad0 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  le that.        
22ae0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
22af0 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c  data for table <
22b00 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f  tbl> or on one o
22b10 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49  f its indexes. I
22b20 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  t.        ** is 
22b30 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74  better to execut
22b40 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69  e the op on an i
22b50 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73  ndex, as indexes
22b60 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20   are almost.    
22b70 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70      ** always sp
22b80 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73  read across less
22b90 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69   pages than thei
22ba0 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
22bb0 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20  tables..        
22bc0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
22bd0 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
22be0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
22bf0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
22c00 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
22c10 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43      const int iC
22c20 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  sr = pParse->nTa
22c30 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73  b++;     /* Curs
22c40 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65  or to scan b-tre
22c50 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  e */.        Ind
22c60 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
22c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c80 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
22c90 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
22ca0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
22cb0 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nfo = 0;        
22cc0 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66         /* Keyinf
22cd0 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e  o for scanned in
22ce0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  dex */.        I
22cf0 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b  ndex *pBest = 0;
22d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d10 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65      /* Best inde
22d20 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a  x found so far *
22d30 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
22d40 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  oot = pTab->tnum
22d50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22d60 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73  * Root page of s
22d70 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f  canned b-tree */
22d80 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
22d90 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
22da0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
22db0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
22dc0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
22dd0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
22de0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
22df0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  );..        /* S
22e00 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e  earch for the in
22e10 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65  dex that has the
22e20 20 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20 6f 66   least amount of
22e30 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20 20 20   columns. If.   
22e40 20 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73       ** there is
22e50 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2c 20   such an index, 
22e60 61 6e 64 20 69 74 20 68 61 73 20 6c 65 73 73 20  and it has less 
22e70 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20 74 68 65  columns than the
22e80 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a   table.        *
22e90 2a 20 64 6f 65 73 2c 20 74 68 65 6e 20 77 65 20  * does, then we 
22ea0 63 61 6e 20 61 73 73 75 6d 65 20 74 68 61 74 20  can assume that 
22eb0 69 74 20 63 6f 6e 73 75 6d 65 73 20 6c 65 73 73  it consumes less
22ec0 20 73 70 61 63 65 20 6f 6e 20 64 69 73 6b 20 61   space on disk a
22ed0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  nd.        ** wi
22ee0 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65 20  ll therefore be 
22ef0 63 68 65 61 70 65 72 20 74 6f 20 73 63 61 6e 20  cheaper to scan 
22f00 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
22f10 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 20   query result.. 
22f20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69         ** In thi
22f30 73 20 63 61 73 65 20 73 65 74 20 69 52 6f 6f 74  s case set iRoot
22f40 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
22f50 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
22f60 69 6e 64 65 78 20 62 2d 74 72 65 65 0a 20 20 20  index b-tree.   
22f70 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 4b 65 79       ** and pKey
22f80 49 6e 66 6f 20 74 6f 20 74 68 65 20 4b 65 79 49  Info to the KeyI
22f90 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 72 65  nfo structure re
22fa0 71 75 69 72 65 64 20 74 6f 20 6e 61 76 69 67 61  quired to naviga
22fb0 74 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  te the.        *
22fc0 2a 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  * index..       
22fd0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
22fe0 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b  n practice the K
22ff0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
23000 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
23010 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20  d. It is only . 
23020 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64         ** passed
23030 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e   to keep OP_Open
23040 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20  Read happy..    
23050 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66      */.        f
23060 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
23070 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
23080 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
23090 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 42           if( !pB
230a0 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f  est || pIdx->nCo
230b0 6c 75 6d 6e 3c 70 42 65 73 74 2d 3e 6e 43 6f 6c  lumn<pBest->nCol
230c0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
230d0 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b     pBest = pIdx;
230e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
230f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23100 66 28 20 70 42 65 73 74 20 26 26 20 70 42 65 73  f( pBest && pBes
23110 74 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d  t->nColumn<pTab-
23120 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
23130 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74     iRoot = pBest
23140 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  ->tnum;.        
23150 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
23160 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
23170 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b  (pParse, pBest);
23180 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
23190 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65      /* Open a re
231a0 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20  ad-only cursor, 
231b0 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43  execute the OP_C
231c0 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20  ount, close the 
231d0 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20  cursor. */.     
231e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
231f0 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
23200 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74  ead, iCsr, iRoot
23210 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
23220 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
23230 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23240 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
23250 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65   -1, (char *)pKe
23260 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
23270 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
23280 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
23290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
232a0 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73  v, OP_Count, iCs
232b0 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  r, sAggInfo.aFun
232c0 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20  c[0].iMem);.    
232d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
232e0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
232f0 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  e, iCsr);.      
23300 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
23310 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
23320 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20  ECOUNT */.      
23330 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
23340 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20  ck if the query 
23350 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
23360 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73   following forms
23370 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
23380 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
23390 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   min(x) FROM ...
233a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
233b0 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d  LECT max(x) FROM
233c0 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   ....        **.
233d0 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74          ** If it
233e0 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68   is, then ask th
233f0 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  e code in where.
23400 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  c to attempt to 
23410 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20  sort results.   
23420 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68       ** as if th
23430 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45  ere was an "ORDE
23440 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45  R ON x" or "ORDE
23450 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61  R ON x DESC" cla
23460 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  use. .        **
23470 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61   If where.c is a
23480 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72  ble to produce r
23490 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e  esults sorted in
234a0 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65   this order, the
234b0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  n.        ** add
234c0 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72   vdbe code to br
234d0 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70  eak out of the p
234e0 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61  rocessing loop a
234f0 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20  fter the .      
23500 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61    ** first itera
23510 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20  tion (since the 
23520 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
23530 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a  of the loop is .
23540 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61          ** guara
23550 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65  nteed to operate
23560 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68   on the row with
23570 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20   the minimum or 
23580 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20  maximum .       
23590 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20   ** value of x, 
235a0 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71  the only row req
235b0 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20  uired)..        
235c0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20  **.        ** A 
235d0 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73  special flag mus
235e0 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73  t be passed to s
235f0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
23600 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20  () to slightly. 
23610 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79         ** modify
23620 20 62 65 68 61 76 69 6f 75 72 20 61 73 20 66 6f   behaviour as fo
23630 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a  llows:.        *
23640 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
23650 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
23660 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
23670 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f  )", then the loo
23680 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20  p coded by.     
23690 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e     **     where.
236a0 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65  c should not ite
236b0 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61  rate over any va
236c0 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c  lues with a NULL
236d0 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
236e0 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20  *     for x..   
236f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
23700 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d  **   + The optim
23710 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65  izer code in whe
23720 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20  re.c (the thing 
23730 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69  that decides whi
23740 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ch.        **   
23750 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63    index or indic
23760 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c  es to use) shoul
23770 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72  d place a differ
23780 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20  ent priority on 
23790 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
237a0 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27  satisfying the '
237b0 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65  ORDER BY' clause
237c0 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e   than it does in
237d0 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20   other cases..  
237e0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66        **     Ref
237f0 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63  er to code and c
23800 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65  omments in where
23810 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  .c for details..
23820 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
23830 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69     ExprList *pMi
23840 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nMax = 0;.      
23850 20 20 75 38 20 66 6c 61 67 20 3d 20 6d 69 6e 4d    u8 flag = minM
23860 61 78 51 75 65 72 79 28 70 29 3b 0a 20 20 20 20  axQuery(p);.    
23870 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a      if( flag ){.
23880 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
23890 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
238a0 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ty(p->pEList->a[
238b0 30 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  0].pExpr, EP_xIs
238c0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
238d0 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73       pMinMax = s
238e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
238f0 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  p(db, p->pEList-
23900 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 78 2e 70  >a[0].pExpr->x.p
23910 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20 20 20 20  List,0);.       
23920 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61     pDel = pMinMa
23930 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
23940 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62 2d   pMinMax && !db-
23950 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
23960 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69  .            pMi
23970 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  nMax->a[0].sortO
23980 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45  rder = flag!=WHE
23990 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f  RE_ORDERBY_MIN ?
239a0 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1:0;.           
239b0 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70   pMinMax->a[0].p
239c0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f  Expr->op = TK_CO
239d0 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
239e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20  }.        }.  . 
239f0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
23a00 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20  ase runs if the 
23a10 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f  aggregate has no
23a20 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
23a30 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
23a40 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  * processing is 
23a50 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e  much simpler sin
23a60 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  ce there is only
23a70 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20   a single row.  
23a80 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70        ** of outp
23a90 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ut..        */. 
23aa0 20 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75         resetAccu
23ab0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
23ac0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
23ad0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
23ae0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
23af0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
23b00 20 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61   pWhere, &pMinMa
23b10 78 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20 20 20  x, flag);.      
23b20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
23b30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
23b40 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
23b50 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
23b60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
23b70 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
23b80 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74   }.        updat
23b90 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
23ba0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
23bb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4d  .        if( !pM
23bc0 69 6e 4d 61 78 20 26 26 20 66 6c 61 67 20 29 7b  inMax && flag ){
23bd0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23be0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23bf0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e  OP_Goto, 0, pWIn
23c00 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20 20 20  fo->iBreak);.   
23c10 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
23c20 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20  nt((v, "%s() by 
23c30 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20  index",.        
23c40 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57          (flag==W
23c50 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
23c60 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b  ?"min":"max")));
23c70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23c80 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
23c90 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
23ca0 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
23cb0 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
23cc0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
23cd0 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4f 72 64     }..      pOrd
23ce0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
23cf0 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
23d00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
23d10 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
23d20 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
23d30 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
23d40 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
23d50 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
23d60 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
23d70 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
23d80 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  , 0, -1, .      
23d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23da0 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20  pDest, addrEnd, 
23db0 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
23dc0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
23dd0 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b  elete(db, pDel);
23de0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
23df0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
23e00 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  el(v, addrEnd);.
23e10 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69      .  } /* endi
23e20 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  f aggregate quer
23e30 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  y */..  /* If th
23e40 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
23e50 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
23e60 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
23e70 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
23e80 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
23e90 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
23ea0 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
23eb0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
23ec0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  {.    generateSo
23ed0 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
23ee0 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  , v, pEList->nEx
23ef0 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a  pr, pDest);.  }.
23f00 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
23f10 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65  to skip this que
23f20 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
23f30 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
23f40 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f  l(v, iEnd);..  /
23f50 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73  * The SELECT was
23f60 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
23f70 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72  ded.   Set the r
23f80 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a  eturn code to 0.
23f90 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
23fa0 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f   no errors..  */
23fb0 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  .  rc = 0;..  /*
23fc0 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74   Control jumps t
23fd0 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72  o here if an err
23fe0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
23ff0 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e  d above, or upon
24000 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
24010 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53   coding of the S
24020 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65  ELECT..  */.sele
24030 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64  ct_end:..  /* Id
24040 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
24050 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f  mes if results o
24060 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  f the SELECT are
24070 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20   to be output.. 
24080 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
24090 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
240a0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
240b0 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
240c0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
240d0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
240e0 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
240f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24100 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
24110 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
24120 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
24130 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e  aFunc);.  return
24140 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69   rc;.}..#if defi
24150 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
24160 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  )./*.***********
24170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
241a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
241b0 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ****.** The foll
241c0 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20 75 73  owing code is us
241d0 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
241e0 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
241f0 79 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20  y.  The code.** 
24200 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65  that follows doe
24210 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20  s not appear in 
24220 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a  normal builds..*
24230 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
24240 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
24250 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20 63 6f  print out the co
24260 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20  ntent of all or 
24270 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61  part of a .** pa
24280 72 73 65 20 73 74 72 75 63 74 75 72 65 73 20 73  rse structures s
24290 75 63 68 20 61 73 20 53 65 6c 65 63 74 20 6f 72  uch as Select or
242a0 20 45 78 70 72 2e 20 20 53 75 63 68 20 70 72 69   Expr.  Such pri
242b0 6e 74 6f 75 74 73 20 61 72 65 20 75 73 65 66 75  ntouts are usefu
242c0 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67  l.** for helping
242d0 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 77   to understand w
242e0 68 61 74 20 69 73 20 68 61 70 70 65 6e 69 6e 67  hat is happening
242f0 20 69 6e 73 69 64 65 20 74 68 65 20 63 6f 64 65   inside the code
24300 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75   generator.** du
24310 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 69  ring the executi
24320 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45  on of complex SE
24330 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
24340 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
24350 74 69 6e 65 20 61 72 65 20 6e 6f 74 20 63 61 6c  tine are not cal
24360 6c 65 64 20 61 6e 79 77 68 65 72 65 20 66 72 6f  led anywhere fro
24370 6d 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 72  m within the nor
24380 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65  mal.** code base
24390 2e 20 20 54 68 65 6e 20 61 72 65 20 69 6e 74 65  .  Then are inte
243a0 6e 64 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  nded to be calle
243b0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  d from within th
243c0 65 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72  e debugger.** or
243d0 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20   from temporary 
243e0 22 70 72 69 6e 74 66 22 20 73 74 61 74 65 6d 65  "printf" stateme
243f0 6e 74 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72  nts inserted for
24400 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76   debugging..*/.v
24410 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
24420 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20  Expr(Expr *p){. 
24430 20 69 66 28 20 70 2d 3e 7a 54 6f 6b 65 6e 20 29   if( p->zToken )
24440 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
24450 75 67 50 72 69 6e 74 66 28 22 28 25 73 22 2c 20  ugPrintf("(%s", 
24460 70 2d 3e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 7d 65  p->zToken);.  }e
24470 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
24480 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25 64  DebugPrintf("(%d
24490 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20  ", p->op);.  }. 
244a0 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b   if( p->pLeft ){
244b0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
244c0 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20  gPrintf(" ");.  
244d0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
244e0 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pr(p->pLeft);.  
244f0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68  }.  if( p->pRigh
24500 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
24510 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29  DebugPrintf(" ")
24520 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
24530 6e 74 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  ntExpr(p->pRight
24540 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
24550 44 65 62 75 67 50 72 69 6e 74 66 28 22 29 22 29  DebugPrintf(")")
24560 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
24570 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 45 78  PrintExprList(Ex
24580 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
24590 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
245a0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
245b0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  pr; i++){.    sq
245c0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
245d0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
245e0 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 4c 69  );.    if( i<pLi
245f0 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20  st->nExpr-1 ){. 
24600 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24610 67 50 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20  gPrintf(", ");. 
24620 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20     }.  }.}.void 
24630 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65  sqlite3PrintSele
24640 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  ct(Select *p, in
24650 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c  t indent){.  sql
24660 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24670 22 25 2a 73 53 45 4c 45 43 54 28 25 70 29 20 22  "%*sSELECT(%p) "
24680 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29  , indent, "", p)
24690 3b 0a 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74  ;.  sqlite3Print
246a0 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
246b0 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  st);.  sqlite3De
246c0 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
246d0 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29  .  if( p->pSrc )
246e0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65  {.    char *zPre
246f0 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  fix;.    int i;.
24700 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 46      zPrefix = "F
24710 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ROM";.    for(i=
24720 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  0; i<p->pSrc->nS
24730 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
24740 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
24750 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
24760 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  >pSrc->a[i];.   
24770 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24780 72 69 6e 74 66 28 22 25 2a 73 20 22 2c 20 69 6e  rintf("%*s ", in
24790 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78 29  dent+6, zPrefix)
247a0 3b 0a 20 20 20 20 20 20 7a 50 72 65 66 69 78 20  ;.      zPrefix 
247b0 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20  = "";.      if( 
247c0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
247d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
247e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 5c  3DebugPrintf("(\
247f0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n");.        sql
24800 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28  ite3PrintSelect(
24810 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
24820 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20  indent+10);.    
24830 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24840 50 72 69 6e 74 66 28 22 25 2a 73 29 22 2c 20 69  Printf("%*s)", i
24850 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20  ndent+8, "");.  
24860 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49      }else if( pI
24870 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  tem->zName ){.  
24880 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
24890 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20 70  ugPrintf("%s", p
248a0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
248b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
248c0 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20  pItem->pTab ){. 
248d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
248e0 62 75 67 50 72 69 6e 74 66 28 22 28 74 61 62 6c  bugPrintf("(tabl
248f0 65 3a 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e  e: %s)", pItem->
24900 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
24910 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
24920 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
24930 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24940 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 41 53  DebugPrintf(" AS
24950 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c   %s", pItem->zAl
24960 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ias);.      }.  
24970 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70 53 72      if( i<p->pSr
24980 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20  c->nSrc-1 ){.   
24990 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
249a0 67 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20  gPrintf(",");.  
249b0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
249c0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
249d0 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  \n");.    }.  }.
249e0 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
249f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
24a00 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 57  bugPrintf("%*s W
24a10 48 45 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20  HERE ", indent, 
24a20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "");.    sqlite3
24a30 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 57 68  PrintExpr(p->pWh
24a40 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
24a50 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
24a60 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ");.  }.  if( p-
24a70 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
24a80 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24a90 6e 74 66 28 22 25 2a 73 20 47 52 4f 55 50 20 42  ntf("%*s GROUP B
24aa0 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  Y ", indent, "")
24ab0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
24ac0 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47  ntExprList(p->pG
24ad0 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c  roupBy);.    sql
24ae0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24af0 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  "\n");.  }.  if(
24b00 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20   p->pHaving ){. 
24b10 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24b20 72 69 6e 74 66 28 22 25 2a 73 20 48 41 56 49 4e  rintf("%*s HAVIN
24b30 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  G ", indent, "")
24b40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
24b50 6e 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  ntExpr(p->pHavin
24b60 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
24b70 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
24b80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
24b90 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
24ba0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24bb0 66 28 22 25 2a 73 20 4f 52 44 45 52 20 42 59 20  f("%*s ORDER BY 
24bc0 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
24bd0 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
24be0 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
24bf0 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  erBy);.    sqlit
24c00 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
24c10 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e  n");.  }.}./* En
24c20 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  d of the structu
24c30 72 65 20 64 65 62 75 67 20 70 72 69 6e 74 69 6e  re debug printin
24c40 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g code.*********
24c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24c90 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ****/.#endif /* 
24ca0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
24cb0 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
24cc0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 2a 2f  SQLITE_DEBUG) */
24cd0 0a                                               .