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

Artifact a7a075456d4e640ffd7d0a33202d306c69c88f72:


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 32 36  select.c,v 1.526
0200: 20 32 30 30 39 2f 30 38 2f 30 31 20 31 35 3a 30   2009/08/01 15:0
0210: 39 3a 35 38 20 64 72 68 20 45 78 70 20 24 0a 2a  9:58 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 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1c60: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
1c70: 45 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  E, EP_TokenOnly|
1c80: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
1c90: 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75     ExprSetIrredu
1ca0: 63 69 62 6c 65 28 70 45 29 3b 0a 20 20 20 20 70  cible(pE);.    p
1cb0: 45 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  E->iRightJoinTab
1cc0: 6c 65 20 3d 20 28 69 31 36 29 69 52 69 67 68 74  le = (i16)iRight
1cd0: 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  JoinTable;.  }. 
1ce0: 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74   *ppExpr = sqlit
1cf0: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
1d00: 2d 3e 64 62 2c 2a 70 70 45 78 70 72 2c 20 70 45  ->db,*ppExpr, pE
1d10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
1d20: 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
1d30: 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20  property on all 
1d40: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76  terms of the giv
1d50: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  en expression..*
1d60: 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78  * And set the Ex
1d70: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
1d80: 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72  le to iTable for
1d90: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
1da0: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
1db0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46  ..**.** The EP_F
1dc0: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
1dd0: 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d   is used on term
1de0: 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  s of an expressi
1df0: 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68  on to tell.** th
1e00: 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  e LEFT OUTER JOI
1e10: 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  N processing log
1e20: 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72  ic that this ter
1e30: 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  m is part of the
1e40: 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63  .** join restric
1e50: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69  tion specified i
1e60: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
1e70: 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74  G clause and not
1e80: 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68   a part.** of th
1e90: 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57  e more general W
1ea0: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68  HERE clause.  Th
1eb0: 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f  ese terms are mo
1ec0: 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a  ved over to the.
1ed0: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
1ee0: 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63  during join proc
1ef0: 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65  essing but we ne
1f00: 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
1f10: 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67  hat they.** orig
1f20: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
1f30: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
1f40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72  ..**.** The Expr
1f50: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
1f60: 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45   tells the WHERE
1f70: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
1f80: 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65  ng that the.** e
1f90: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64  xpression depend
1fa0: 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68  s on table iRigh
1fb0: 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20  tJoinTable even 
1fc0: 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73  if that table is
1fd0: 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74   not.** explicit
1fe0: 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  ly mentioned in 
1ff0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
2000: 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   That informatio
2010: 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66  n is needed.** f
2020: 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68  or cases like th
2030: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
2040: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
2050: 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
2060: 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78  .a=t2.b AND t1.x
2070: 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65  =5.**.** The whe
2080: 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  re clause needs 
2090: 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  to defer the han
20a0: 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e  dling of the t1.
20b0: 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69  x=5.** term unti
20c0: 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c  l after the t2 l
20d0: 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  oop of the join.
20e0: 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61    In that way, a
20f0: 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20  .** NULL t2 row 
2100: 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
2110: 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d   whenever t1.x!=
2120: 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  5.  If we do not
2130: 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61  .** defer the ha
2140: 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35  ndling of t1.x=5
2150: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f  , it will be pro
2160: 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65  cessed immediate
2170: 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20  ly.** after the 
2180: 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73  t1 loop and rows
2190: 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69   with t1.x!=5 wi
21a0: 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20  ll never appear 
21b0: 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  in.** the output
21c0: 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72  , which is incor
21d0: 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
21e0: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
21f0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54  (Expr *p, int iT
2200: 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20  able){.  while( 
2210: 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  p ){.    ExprSet
2220: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
2230: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73  romJoin);.    as
2240: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e  sert( !ExprHasAn
2250: 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  yProperty(p, EP_
2260: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2270: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70  uced) );.    Exp
2280: 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65 28  rSetIrreducible(
2290: 70 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68  p);.    p->iRigh
22a0: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31  tJoinTable = (i1
22b0: 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65  6)iTable;.    se
22c0: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
22d0: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
22e0: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
22f0: 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68    } .}../*.** Th
2300: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
2310: 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e  sses the join in
2320: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
2330: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2340: 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e  ..** ON and USIN
2350: 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f  G clauses are co
2360: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74  nverted into ext
2370: 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ra terms of the 
2380: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
2390: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61   NATURAL joins a
23a0: 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61  lso create extra
23b0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
23c0: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  rms..**.** The t
23d0: 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63  erms of a FROM c
23e0: 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69  lause are contai
23f0: 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63  ned in the Selec
2400: 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65  t.pSrc structure
2410: 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f  ..** The left mo
2420: 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  st table is the 
2430: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53  first entry in S
2440: 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65  elect.pSrc.  The
2450: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74   right-most.** t
2460: 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74  able is the last
2470: 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69   entry.  The joi
2480: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65  n operator is he
2490: 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ld in the entry 
24a0: 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20  to.** the left. 
24b0: 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f   Thus entry 0 co
24c0: 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20  ntains the join 
24d0: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  operator for the
24e0: 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a   join between.**
24f0: 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31   entries 0 and 1
2500: 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49  .  Any ON or USI
2510: 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63  NG clauses assoc
2520: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a  iated with the j
2530: 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20  oin are.** also 
2540: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
2550: 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  left entry..**.*
2560: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2570: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
2580: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
2590: 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  untered..*/.stat
25a0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f  ic int sqlitePro
25b0: 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a  cessJoin(Parse *
25c0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
25d0: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
25e0: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
25f0: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62        /* All tab
2600: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
2610: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
2620: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
2630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2640: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
2650: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2660: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20  _item *pLeft;   
2670: 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20    /* Left table 
2680: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
2690: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
26a0: 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20  _item *pRight;  
26b0: 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65    /* Right table
26c0: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
26d0: 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ..  pSrc = p->pS
26e0: 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70  rc;.  pLeft = &p
26f0: 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69  Src->a[0];.  pRi
2700: 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b  ght = &pLeft[1];
2710: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
2720: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c  rc->nSrc-1; i++,
2730: 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74   pRight++, pLeft
2740: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
2750: 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74  pLeftTab = pLeft
2760: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c  ->pTab;.    Tabl
2770: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
2780: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20  Right->pTab;.   
2790: 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20   int isOuter;.. 
27a0: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65     if( NEVER(pLe
27b0: 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67  ftTab==0 || pRig
27c0: 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74  htTab==0) ) cont
27d0: 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65  inue;.    isOute
27e0: 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 6a 6f 69  r = (pRight->joi
27f0: 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
2800: 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  )!=0;..    /* Wh
2810: 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  en the NATURAL k
2820: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
2830: 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61  t, add WHERE cla
2840: 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20  use terms for.  
2850: 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d    ** every colum
2860: 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74  n that the two t
2870: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f  ables have in co
2880: 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mmon..    */.   
2890: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69   if( pRight->joi
28a0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
28b0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AL ){.      if( 
28c0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70  pRight->pOn || p
28d0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
28e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2900: 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e   "a NATURAL join
2910: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a   may not have ".
2920: 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f             "an O
2930: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2940: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  e", 0);.        
2950: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2960: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
2970: 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f   j<pLeftTab->nCo
2980: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
2990: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
29a0: 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  LeftTab->aCol[j]
29b0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
29c0: 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  if( columnIndex(
29d0: 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65  pRightTab, zName
29e0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
29f0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
2a00: 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c  Parse, zName, pL
2a10: 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a  eftTab, pLeft->z
2a20: 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20  Alias, .        
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c        pRightTab,
2a50: 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c   pRight->zAlias,
2a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2a80: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20  Right->iCursor, 
2a90: 26 70 2d 3e 70 57 68 65 72 65 2c 20 69 73 4f 75  &p->pWhere, isOu
2aa0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
2ab0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ac0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2ad0: 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f   Disallow both O
2ae0: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
2af0: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
2b00: 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  join.    */.    
2b10: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
2b20: 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e  && pRight->pUsin
2b30: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
2b40: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2b50: 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20  e, "cannot have 
2b60: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
2b70: 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61  G ".        "cla
2b80: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
2b90: 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72   join");.      r
2ba0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
2bb0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f      /* Add the O
2bc0: 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  N clause to the 
2bd0: 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
2be0: 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74   clause, connect
2bf0: 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20  ed by.    ** an 
2c00: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  AND operator..  
2c10: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
2c20: 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20  ght->pOn ){.    
2c30: 20 20 69 66 28 20 69 73 4f 75 74 65 72 20 29 20    if( isOuter ) 
2c40: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67  setJoinExpr(pRig
2c50: 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d  ht->pOn, pRight-
2c60: 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2c70: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c   p->pWhere = sql
2c80: 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
2c90: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72  se->db, p->pWher
2ca0: 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b  e, pRight->pOn);
2cb0: 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70  .      pRight->p
2cc0: 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  On = 0;.    }.. 
2cd0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74     /* Create ext
2ce0: 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  ra terms on the 
2cf0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72  WHERE clause for
2d00: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d   each column nam
2d10: 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ed.    ** in the
2d20: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20   USING clause.  
2d30: 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20  Example: If the 
2d40: 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65  two tables to be
2d50: 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20   joined are .   
2d60: 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20   ** A and B and 
2d70: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
2d80: 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64   names X, Y, and
2d90: 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69   Z, then add thi
2da0: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  s.    ** to the 
2db0: 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20  WHERE clause:   
2dc0: 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59   A.X=B.X AND A.Y
2dd0: 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a  =B.Y AND A.Z=B.Z
2de0: 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61  .    ** Report a
2df0: 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63  n error if any c
2e00: 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20  olumn mentioned 
2e10: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
2e20: 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  use is.    ** no
2e30: 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62  t contained in b
2e40: 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65  oth tables to be
2e50: 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a   joined..    */.
2e60: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
2e70: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2e80: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  IdList *pList = 
2e90: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a  pRight->pUsing;.
2ea0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2eb0: 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b  <pList->nId; j++
2ec0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
2ed0: 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e  *zName = pList->
2ee0: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
2ef0: 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e      if( columnIn
2f00: 64 65 78 28 70 4c 65 66 74 54 61 62 2c 20 7a 4e  dex(pLeftTab, zN
2f10: 61 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e  ame)<0 || column
2f20: 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c  Index(pRightTab,
2f30: 20 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20   zName)<0 ){.   
2f40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2f50: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2f60: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
2f70: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
2f80: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
2f90: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
2fa0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
2fb0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
2fc0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2fd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2fe0: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
2ff0: 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65 66 74  se, zName, pLeft
3000: 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69  Tab, pLeft->zAli
3010: 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  as, .           
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3030: 20 70 52 69 67 68 74 54 61 62 2c 20 70 52 69 67   pRightTab, pRig
3040: 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20  ht->zAlias,.    
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3060: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
3070: 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68  iCursor, &p->pWh
3080: 65 72 65 2c 20 69 73 4f 75 74 65 72 29 3b 0a 20  ere, isOuter);. 
3090: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
30a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
30b0: 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64  /*.** Insert cod
30c0: 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74 20  e into "v" that 
30d0: 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65  will push the re
30e0: 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f 70 20  cord on the top 
30f0: 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  of the.** stack 
3100: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e  into the sorter.
3110: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3120: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
3130: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3140: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
3150: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
3160: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
3170: 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  By,    /* The OR
3180: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
3190: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
31a0: 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct,       /* The
31b0: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
31c0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
31d0: 20 72 65 67 44 61 74 61 20 20 20 20 20 20 20 20   regData        
31e0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
31f0: 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20  holding data to 
3200: 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29 7b 0a  be sorted */.){.
3210: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
3220: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
3230: 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42   nExpr = pOrderB
3240: 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20  y->nExpr;.  int 
3250: 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65  regBase = sqlite
3260: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
3270: 61 72 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a  arse, nExpr+2);.
3280: 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20    int regRecord 
3290: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
32a0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
32b0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
32c0: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
32d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
32e0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
32f0: 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73  pOrderBy, regBas
3300: 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
3310: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3320: 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65  _Sequence, pOrde
3330: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  rBy->iECursor, r
3340: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
3350: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
3360: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
3370: 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45  Data, regBase+nE
3380: 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71 6c  xpr+1, 1);.  sql
3390: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
33a0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
33b0: 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72 20   regBase, nExpr 
33c0: 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  + 2, regRecord);
33d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
33e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
33f0: 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e  sert, pOrderBy->
3400: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63  iECursor, regRec
3410: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ord);.  sqlite3R
3420: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
3430: 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
3440: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
3450: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
3460: 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78  se, regBase, nEx
3470: 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65  pr+2);.  if( pSe
3480: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  lect->iLimit ){.
3490: 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61      int addr1, a
34a0: 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c  ddr2;.    int iL
34b0: 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53  imit;.    if( pS
34c0: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29  elect->iOffset )
34d0: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
34e0: 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65   pSelect->iOffse
34f0: 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  t+1;.    }else{.
3500: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70        iLimit = p
3510: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a  Select->iLimit;.
3520: 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20      }.    addr1 
3530: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3540: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op1(v, OP_IfZero
3550: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73  , iLimit);.    s
3560: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3570: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69  (v, OP_AddImm, i
3580: 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
3590: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
35a0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
35b0: 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74  Goto);.    sqlit
35c0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
35d0: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71  , addr1);.    sq
35e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
35f0: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64  v, OP_Last, pOrd
3600: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b  erBy->iECursor);
3610: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3620: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
3630: 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  ete, pOrderBy->i
3640: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  ECursor);.    sq
3650: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
3660: 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20  e(v, addr2);.   
3670: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
3680: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
3690: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
36a0: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
36b0: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
36c0: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
36d0: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
36e0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
36f0: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
3700: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
3710: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
3720: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
3730: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
3740: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20   int iContinue  
3750: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
3760: 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72  to skip the curr
3770: 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  ent record */.){
3780: 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65  .  if( p->iOffse
3790: 74 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d  t && iContinue!=
37a0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  0 ){.    int add
37b0: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  r;.    sqlite3Vd
37c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
37d0: 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66 73 65  ddImm, p->iOffse
37e0: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
37f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3800: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65 67  dOp1(v, OP_IfNeg
3810: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20  , p->iOffset);. 
3820: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3830: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
3840: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
3850: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
3860: 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54  (v, "skip OFFSET
3870: 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20   records"));.   
3880: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
3890: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
38a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
38b0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
38c0: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
38d0: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
38e0: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
38f0: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
3900: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
3910: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
3920: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
3930: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
3940: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
3950: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
3960: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
3970: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
3980: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
3990: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
39a0: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
39b0: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
39c0: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
39d0: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
39e0: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
39f0: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
3a00: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
3a10: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
3a20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
3a30: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
3a40: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3a50: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
3a60: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
3a70: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
3a80: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
3a90: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
3aa0: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
3ab0: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
3ac0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
3ad0: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
3ae0: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
3af0: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
3b00: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
3b10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
3b20: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
3b30: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
3b40: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
3b50: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
3b60: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
3b70: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
3b80: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
3b90: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
3ba0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3bb0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
3bc0: 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c  Record, iMem, N,
3bd0: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   r1);.  sqlite3V
3be0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
3bf0: 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64  Found, iTab, add
3c00: 72 52 65 70 65 61 74 2c 20 72 31 29 3b 0a 20 20  rRepeat, r1);.  
3c10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3c20: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
3c30: 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20  t, iTab, r1);.  
3c40: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
3c50: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
3c60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
3c70: 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
3c80: 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c  ssage when a SEL
3c90: 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74 68  ECT is used with
3ca0: 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73 69  in a subexpressi
3cb0: 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20  on.** (example: 
3cc0: 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a   "a IN (SELECT *
3cd0: 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62   FROM table)") b
3ce0: 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74  ut it has more t
3cf0: 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20  han 1 result.** 
3d00: 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74  column.  We do t
3d10: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
3d20: 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ine because the 
3d30: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
3d40: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c 61 63  multiple.** plac
3d50: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
3d60: 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  t checkForMultiC
3d70: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
3d80: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3d90: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
3da0: 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20  e context. */.  
3db0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
3dc0: 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74  t,   /* Destinat
3dd0: 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65  ion of SELECT re
3de0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sults */.  int n
3df0: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
3e00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
3e10: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  ult columns retu
3e20: 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a  rned by SELECT *
3e30: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74  /.){.  int eDest
3e40: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
3e50: 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26  .  if( nExpr>1 &
3e60: 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  & (eDest==SRT_Me
3e70: 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
3e80: 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Set) ){.    sqli
3e90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3ea0: 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
3eb0: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
3ec0: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
3ed0: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
3ee0: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
3ef0: 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  ession");.    re
3f00: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
3f10: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3f20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
3f30: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
3f40: 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
3f50: 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68  the inside of th
3f60: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
3f70: 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  of a SELECT..**.
3f80: 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e 64  ** If srcTab and
3f90: 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74   nColumn are bot
3fa0: 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  h zero, then the
3fb0: 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69   pEList expressi
3fc0: 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75  ons.** are evalu
3fd0: 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
3fe0: 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f   get the data fo
3ff0: 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20  r this row.  If 
4000: 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65  nColumn>0.** the
4010: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
4020: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
4030: 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20   pEList is used 
4040: 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a  only to get the.
4050: 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f 72  ** datatypes for
4060: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
4070: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
4080: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
4090: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
40a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
40b0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
40c0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
40d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
40e0: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
40f0: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
4100: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
4110: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
4120: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
4130: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
4140: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
4150: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
4160: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
4170: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
4180: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
4190: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n,            /*
41a0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
41b0: 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  ns in the source
41c0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
41d0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
41e0: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
41f0: 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73  LL, sort results
4200: 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20   using this key 
4210: 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63  */.  int distinc
4220: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
4230: 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72  If >=0, make sur
4240: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
4250: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 53 65 6c 65  stinct */.  Sele
4260: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
4270: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
4280: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
4290: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ults */.  int iC
42a0: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
42b0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
42c0: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
42d0: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
42e0: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
42f0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4300: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
4310: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
4320: 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  p */.){.  Vdbe *
4330: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4340: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
4350: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
4360: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
4370: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
4380: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
4390: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73   */.  int regRes
43a0: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ult;            
43b0: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65    /* Start of me
43c0: 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73  mory holding res
43d0: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  ult set */.  int
43e0: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
43f0: 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20  eDest;   /* How 
4400: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65  to dispose of re
4410: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
4420: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50  Parm = pDest->iP
4430: 61 72 6d 3b 20 20 20 2f 2a 20 46 69 72 73 74 20  arm;   /* First 
4440: 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70  argument to disp
4450: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
4460: 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b   int nResultCol;
4470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4480: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
4490: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61   columns */..  a
44a0: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 69 66  ssert( v );.  if
44b0: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
44c0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
44d0: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
44e0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64   hasDistinct = d
44f0: 69 73 74 69 6e 63 74 3e 3d 30 3b 0a 20 20 69 66  istinct>=0;.  if
4500: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ( pOrderBy==0 &&
4510: 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b   !hasDistinct ){
4520: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
4530: 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29  v, p, iContinue)
4540: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c  ;.  }..  /* Pull
4550: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
4560: 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  olumns..  */.  i
4570: 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a  f( nColumn>0 ){.
4580: 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d      nResultCol =
4590: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73   nColumn;.  }els
45a0: 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f  e{.    nResultCo
45b0: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
45c0: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65  r;.  }.  if( pDe
45d0: 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20  st->iMem==0 ){. 
45e0: 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d     pDest->iMem =
45f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
4600: 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  .    pDest->nMem
4610: 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   = nResultCol;. 
4620: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
4630: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20  += nResultCol;. 
4640: 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73   }else{ .    ass
4650: 65 72 74 28 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  ert( pDest->nMem
4660: 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a  ==nResultCol );.
4670: 20 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20    }.  regResult 
4680: 3d 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20  = pDest->iMem;. 
4690: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
46a0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
46b0: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
46c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
46d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
46e0: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c  lumn, srcTab, i,
46f0: 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20   regResult+i);. 
4700: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
4710: 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73   eDest!=SRT_Exis
4720: 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ts ){.    /* If 
4730: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
4740: 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e  is an EXISTS(...
4750: 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  ) expression, th
4760: 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20  e actual.    ** 
4770: 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20  values returned 
4780: 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  by the SELECT ar
4790: 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  e not required..
47a0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
47b0: 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
47c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71  (pParse);.    sq
47d0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
47e0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
47f0: 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c  List, regResult,
4800: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
4810: 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75  ut);.  }.  nColu
4820: 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  mn = nResultCol;
4830: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
4840: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
4850: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
4860: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
4870: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
4880: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
4890: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
48a0: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
48b0: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
48c0: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
48d0: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
48e0: 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65  inct ){.    asse
48f0: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
4900: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c  .    assert( pEL
4910: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c  ist->nExpr==nCol
4920: 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44  umn );.    codeD
4930: 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
4940: 64 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69  distinct, iConti
4950: 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65  nue, nColumn, re
4960: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 69 66  gResult);.    if
4970: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
4980: 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65  .      codeOffse
4990: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
49a0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
49b0: 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
49c0: 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
49d0: 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
49e0: 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
49f0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
4a00: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
4a10: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
4a20: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
4a30: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
4a40: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
4a50: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
4a60: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
4a70: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
4a80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4a90: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
4aa0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
4ab0: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ion: {.      int
4ac0: 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20   r1;.      r1 = 
4ad0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
4ae0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
4af0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4b00: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
4b10: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
4b20: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
4b30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4b40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
4b50: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
4b60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4b70: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
4b80: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
4b90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4ba0: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
4bb0: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
4bc0: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
4bd0: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
4be0: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
4bf0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
4c00: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
4c10: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
4c20: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
4c30: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
4c40: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
4c50: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
4c60: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4c70: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
4c80: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
4c90: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  m, regResult, nC
4ca0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
4cb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
4cc0: 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  f..    /* Store 
4cd0: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
4ce0: 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
4cf0: 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
4d00: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
4d10: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
4d20: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
4d30: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
4d40: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
4d50: 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  se);.      testc
4d60: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
4d70: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74  Table );.      t
4d80: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
4d90: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
4da0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4db0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4dc0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
4dd0: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31  ult, nColumn, r1
4de0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
4df0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
4e00: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
4e10: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
4e20: 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  , p, r1);.      
4e30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
4e40: 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
4e50: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
4e60: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4e70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4e80: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
4e90: 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  rm, r2);.       
4ea0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4eb0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
4ec0: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b   iParm, r1, r2);
4ed0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4ee0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
4ef0: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
4f00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
4f10: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
4f20: 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
4f30: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
4f40: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
4f50: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
4f60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4f70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4f80: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
4f90: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
4fa0: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
4fb0: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
4fc0: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
4fd0: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
4fe0: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
4ff0: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
5000: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
5010: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
5020: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
5030: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
5040: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
5050: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
5060: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
5070: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
5080: 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69  .      p->affini
5090: 74 79 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ty = sqlite3Comp
50a0: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69  areAffinity(pELi
50b0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
50c0: 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29  pDest->affinity)
50d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
50e0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
50f0: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
5100: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
5110: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
5120: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
5130: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
5140: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
5150: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
5160: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
5170: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
5180: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
5190: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
51a0: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
51b0: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
51c0: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
51d0: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
51e0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
51f0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
5200: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
5210: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
5220: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5230: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
5240: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5250: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
5260: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5270: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
5280: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 2c  d, regResult, 1,
5290: 20 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74   r1, &p->affinit
52a0: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  y, 1);.        s
52b0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
52c0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
52d0: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
52e0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
52f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5300: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
5310: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
5320: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5330: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5340: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r1);.      }. 
5350: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5360: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  }..    /* If any
5370: 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
5380: 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
5390: 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
53a0: 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
53b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
53c0: 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
53d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
53e0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
53f0: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
5400: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
5410: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
5420: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
5430: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
5440: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
5450: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
5460: 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
5470: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
5480: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
5490: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
54a0: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
54b0: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
54c0: 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
54d0: 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
54e0: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
54f0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5500: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
5510: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
5520: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
5530: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
5540: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
5550: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
5560: 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  rBy, p, regResul
5570: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
5580: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5590: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
55a0: 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  rse, regResult, 
55b0: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
55c0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
55d0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
55e0: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
55f0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
5600: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
5610: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
5620: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5630: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
5640: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65  .    /* Send the
5650: 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c   data to the cal
5660: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f  lback function o
5670: 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e  r to a subroutin
5680: 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a  e.  In the.    *
5690: 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75 62 72  * case of a subr
56a0: 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72  outine, the subr
56b0: 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73  outine itself is
56c0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
56d0: 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20  .    ** popping 
56e0: 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  the data from th
56f0: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  e stack..    */.
5700: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
5710: 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65  outine:.    case
5720: 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a 20   SRT_Output: {. 
5730: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
5740: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
5750: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ine );.      tes
5760: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
5770: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
5780: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
5790: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
57a0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
57b0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
57c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
57d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
57e0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
57f0: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31  ult, nColumn, r1
5800: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
5810: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
5820: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
5830: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
5840: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5850: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
5860: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
5870: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
5880: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ine ){.        s
5890: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
58a0: 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
58b0: 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20  est->iParm);.   
58c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
58d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
58e0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
58f0: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
5900: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
5910: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
5920: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
5930: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
5940: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  lt, nColumn);.  
5950: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
5960: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  k;.    }..#if !d
5970: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5980: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
5990: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
59a0: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
59b0: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
59c0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
59d0: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
59e0: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
59f0: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
5a00: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
5a10: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
5a20: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
5a30: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
5a40: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
5a50: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
5a60: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
5a70: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
5a80: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
5a90: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
5aa0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
5ab0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
5ac0: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72  card );.      br
5ad0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5ae0: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
5af0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
5b00: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
5b10: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
5b20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
5b30: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 61 73 73  Limit ){.    ass
5b40: 65 72 74 28 20 70 4f 72 64 65 72 42 79 3d 3d 30  ert( pOrderBy==0
5b50: 20 29 3b 20 20 2f 2a 20 49 66 20 74 68 65 72 65   );  /* If there
5b60: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c   is an ORDER BY,
5b70: 20 74 68 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20   the call to.   
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b90: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 75 73 68           ** push
5ba0: 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20 77 6f 75  OntoSorter() wou
5bb0: 6c 64 20 68 61 76 65 20 63 6c 65 61 72 65 64 20  ld have cleared 
5bc0: 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 20  p->iLimit */.   
5bd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5be0: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
5bf0: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b   p->iLimit, -1);
5c00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5c10: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a  AddOp2(v, OP_IfZ
5c20: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
5c30: 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a  iBreak);.  }.}..
5c40: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
5c50: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
5c60: 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e  generate a KeyIn
5c70: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
5c80: 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  t records.** the
5c90: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
5ca0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70  nce for each exp
5cb0: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20  ression in that 
5cc0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
5cd0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78  .**.** If the Ex
5ce0: 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44  prList is an ORD
5cf0: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
5d00: 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68  Y clause then th
5d10: 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b  e resulting.** K
5d20: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5d30: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
5d40: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
5d50: 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
5d60: 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
5d70: 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49   that clause.  I
5d80: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
5d90: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
5da0: 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20   of a SELECT.** 
5db0: 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f  then the KeyInfo
5dc0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
5dd0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
5de0: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
5df0: 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  tual.** index to
5e00: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53   implement a DIS
5e10: 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a  TINCT test..**.*
5e20: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
5e30: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
5e40: 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20  cture is obtain 
5e50: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68  from malloc.  Th
5e60: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
5e70: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
5e80: 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20  ible for seeing 
5e90: 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
5ea0: 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
5eb0: 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64 64  y.** freed.  Add
5ec0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
5ed0: 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 50 34  ucture to the P4
5ee0: 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63   field of an opc
5ef0: 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 34 5f  ode using.** P4_
5f00: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
5f10: 69 73 20 74 68 65 20 75 73 75 61 6c 20 77 61 79  is the usual way
5f20: 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74 68   of dealing with
5f30: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
5f40: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
5f50: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50 61  oFromExprList(Pa
5f60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
5f70: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
5f80: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5f90: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
5fa0: 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66   nExpr;.  KeyInf
5fb0: 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75  o *pInfo;.  stru
5fc0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
5fd0: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
5fe0: 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69  ;..  nExpr = pLi
5ff0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
6000: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
6010: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
6020: 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 45  eof(*pInfo) + nE
6030: 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  xpr*(sizeof(Coll
6040: 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66  Seq*)+1) );.  if
6050: 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70  ( pInfo ){.    p
6060: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
6070: 20 3d 20 28 75 38 2a 29 26 70 49 6e 66 6f 2d 3e   = (u8*)&pInfo->
6080: 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20  aColl[nExpr];.  
6090: 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20    pInfo->nField 
60a0: 3d 20 28 75 31 36 29 6e 45 78 70 72 3b 0a 20 20  = (u16)nExpr;.  
60b0: 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45    pInfo->enc = E
60c0: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 49 6e 66  NC(db);.    pInf
60d0: 6f 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  o->db = db;.    
60e0: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
60f0: 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72  List->a; i<nExpr
6100: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
6110: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
6120: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f  pColl;.      pCo
6130: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
6140: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
6150: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
6160: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
6170: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
6180: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
6190: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
61a0: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  pInfo->aColl[i] 
61b0: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
61c0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
61d0: 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72  [i] = pItem->sor
61e0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
61f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f  }.  return pInfo
6200: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
6210: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61  he inner loop wa
6220: 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e  s generated usin
6230: 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72  g a non-null pOr
6240: 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a  derBy argument,.
6250: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  ** then the resu
6260: 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20  lts were placed 
6270: 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66  in a sorter.  Af
6280: 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20  ter the loop is 
6290: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65  terminated.** we
62a0: 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65   need to run the
62b0: 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70   sorter and outp
62c0: 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  ut the results. 
62d0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
62e0: 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
62f0: 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65  tes the code nee
6300: 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  ded to do that..
6310: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
6320: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
6330: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6340: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
6350: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
6360: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f  ect *p,        /
6370: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
6380: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65  tement */.  Vdbe
6390: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a   *v,          /*
63a0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
63b0: 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f  nto this VDBE */
63c0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
63d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
63e0: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
63f0: 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
6400: 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74  t *pDest /* Writ
6410: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
6420: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
6430: 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20    int addrBreak 
6440: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
6450: 65 4c 61 62 65 6c 28 76 29 3b 20 20 20 20 20 2f  eLabel(v);     /
6460: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65  * Jump here to e
6470: 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  xit loop */.  in
6480: 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d  t addrContinue =
6490: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
64a0: 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75  Label(v);  /* Ju
64b0: 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74  mp here for next
64c0: 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   cycle */.  int 
64d0: 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54 61 62  addr;.  int iTab
64e0: 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f 54 61  ;.  int pseudoTa
64f0: 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69 73  b = 0;.  ExprLis
6500: 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
6510: 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69 6e  >pOrderBy;..  in
6520: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
6530: 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50  >eDest;.  int iP
6540: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50 61  arm = pDest->iPa
6550: 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65 67 52 6f  rm;..  int regRo
6560: 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69  w;.  int regRowi
6570: 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f 72  d;..  iTab = pOr
6580: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b  derBy->iECursor;
6590: 0a 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69  .  regRow = sqli
65a0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
65b0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 65 44 65  arse);.  if( eDe
65c0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
65d0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
65e0: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73  outine ){.    ps
65f0: 65 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65  eudoTab = pParse
6600: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71  ->nTab++;.    sq
6610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6620: 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
6630: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 72 65 67  , pseudoTab, reg
6640: 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Row, nColumn);. 
6650: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b     regRowid = 0;
6660: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
6670: 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  gRowid = sqlite3
6680: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
6690: 65 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d  e);.  }.  addr =
66a0: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
66b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
66c0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
66d0: 61 6b 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  ak);.  codeOffse
66e0: 74 28 76 2c 20 70 2c 20 61 64 64 72 43 6f 6e 74  t(v, p, addrCont
66f0: 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
6700: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6710: 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70  _Column, iTab, p
6720: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b  OrderBy->nExpr +
6730: 20 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73   1, regRow);.  s
6740: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
6750: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
6760: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
6770: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
6780: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
6790: 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
67a0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
67b0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
67c0: 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
67d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
67e0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
67f0: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
6800: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6810: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6820: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
6830: 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29  egRow, regRowid)
6840: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6850: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
6860: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
6870: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6880: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
6890: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
68a0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
68b0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
68c0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
68d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
68e0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
68f0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
6900: 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 20 26 70   1, regRowid, &p
6910: 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a  ->affinity, 1);.
6920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6930: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
6940: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
6950: 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  Row, 1);.      s
6960: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6970: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
6980: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
6990: 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
69a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
69b0: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
69c0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
69d0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
69e0: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
69f0: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
6a00: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
6a10: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
6a20: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
6a30: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
6a40: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
6a50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
6a60: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
6a70: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
6a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
6a90: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
6aa0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
6ab0: 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20  utine ); .      
6ac0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
6ad0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
6ae0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
6af0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
6b00: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  ine );.      for
6b10: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
6b20: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   i++){.        a
6b30: 73 73 65 72 74 28 20 72 65 67 52 6f 77 21 3d 70  ssert( regRow!=p
6b40: 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 20 29 3b 0a  Dest->iMem+i );.
6b50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6b60: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6b70: 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61  Column, pseudoTa
6b80: 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e 69 4d 65  b, i, pDest->iMe
6b90: 6d 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  m+i);.        if
6ba0: 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i==0 ){.      
6bb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
6bc0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
6bd0: 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20  G_CLEARCACHE);. 
6be0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6bf0: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
6c00: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
6c10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6c20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6c30: 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73 74  ResultRow, pDest
6c40: 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29  ->iMem, nColumn)
6c50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6c60: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
6c70: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
6c80: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43   pDest->iMem, nC
6c90: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65  olumn);.      }e
6ca0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
6cb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
6cc0: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
6cd0: 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  t->iParm);.     
6ce0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
6cf0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
6d00: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
6d10: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
6d20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
6d30: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
6d40: 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20  e, regRowid);.. 
6d50: 20 2f 2a 20 4c 49 4d 49 54 20 68 61 73 20 62 65   /* LIMIT has be
6d60: 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  en implemented b
6d70: 79 20 74 68 65 20 70 75 73 68 4f 6e 74 6f 53 6f  y the pushOntoSo
6d80: 72 74 65 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a  rter() routine..
6d90: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
6da0: 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 0a  ->iLimit==0 );..
6db0: 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20    /* The bottom 
6dc0: 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f  of the loop.  */
6dd0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
6de0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
6df0: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73  drContinue);.  s
6e00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6e10: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
6e20: 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  b, addr);.  sqli
6e30: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
6e40: 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
6e50: 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  );.  if( eDest==
6e60: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
6e70: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
6e80: 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ne ){.    sqlite
6e90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6ea0: 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54  P_Close, pseudoT
6eb0: 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ab, 0);.  }.}../
6ec0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
6ed0: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
6ee0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
6ef0: 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79   'declaration ty
6f00: 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78  pe' of the.** ex
6f10: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
6f20: 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62  The string may b
6f30: 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61  e treated as sta
6f40: 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65  tic by the calle
6f50: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63  r..**.** The dec
6f60: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73  laration type is
6f70: 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74   the exact datat
6f80: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65  ype definition e
6f90: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
6fa0: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52  e.** original CR
6fb0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6fc0: 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72  ment if the expr
6fd0: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
6fe0: 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61  mn. The.** decla
6ff0: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
7000: 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73  a ROWID field is
7010: 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c   INTEGER. Exactl
7020: 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73  y when an expres
7030: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  sion.** is consi
7040: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63  dered a column c
7050: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e  an be complex in
7060: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
7070: 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65   subqueries. The
7080: 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65  .** result-set e
7090: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c  xpression in all
70a0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
70b0: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
70c0: 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69  nts is .** consi
70d0: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62  dered a column b
70e0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
70f0: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
7100: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
7110: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
7120: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
7130: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
7140: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
7150: 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  );.**   SELECT a
7160: 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  bc FROM (SELECT 
7170: 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20  col AS abc FROM 
7180: 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  tbl);.** .** The
7190: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
71a0: 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73  e for any expres
71b0: 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  sion other than 
71c0: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  a column is NULL
71d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
71e0: 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79  t char *columnTy
71f0: 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  pe(.  NameContex
7200: 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20  t *pNC, .  Expr 
7210: 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20  *pExpr,.  const 
7220: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44  char **pzOriginD
7230: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
7240: 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20  **pzOriginTab,. 
7250: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
7260: 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63  OriginCol.){.  c
7270: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65  har const *zType
7280: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
7290: 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20  st *zOriginDb = 
72a0: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
72b0: 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30 3b  *zOriginTab = 0;
72c0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
72d0: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20  OriginCol = 0;. 
72e0: 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 4e 45   int j;.  if( NE
72f0: 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c 7c  VER(pExpr==0) ||
7300: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d   pNC->pSrcList==
7310: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
7320: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
7330: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
7340: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
7350: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
7360: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
7370: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
7380: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
7390: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
73a0: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
73b0: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
73c0: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
73d0: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
73e0: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
73f0: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
7400: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
7410: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
7420: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
7430: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
7440: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
7450: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
7460: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
7470: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
7480: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
7490: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
74a0: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
74b0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
74c0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
74d0: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
74e0: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
74f0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
7500: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
7510: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
7520: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
7530: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
7540: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
7550: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69  UMN );.      whi
7560: 6c 65 28 20 41 4c 57 41 59 53 28 70 4e 43 29 20  le( ALWAYS(pNC) 
7570: 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
7580: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61      SrcList *pTa
7590: 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  bList = pNC->pSr
75a0: 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  cList;.        f
75b0: 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73  or(j=0;j<pTabLis
75c0: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
75d0: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
75e0: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
75f0: 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69  ;j++);.        i
7600: 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  f( j<pTabList->n
7610: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Src ){.         
7620: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
7630: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
7640: 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62         pS = pTab
7650: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65  List->a[j].pSele
7660: 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ct;.        }els
7670: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  e{.          pNC
7680: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
7690: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
76a0: 0a 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56 45  ..      if( NEVE
76b0: 52 28 70 54 61 62 3d 3d 30 29 20 29 7b 0a 20 20  R(pTab==0) ){.  
76c0: 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20        /* At one 
76d0: 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20  time, code such 
76e0: 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78  as "SELECT new.x
76f0: 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  " within a trigg
7700: 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20  er would.       
7710: 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20 63   ** cause this c
7720: 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e  ondition to run.
7730: 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65    Since then, we
7740: 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75 72   have restructur
7750: 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a  ed how.        *
7760: 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20 69  * trigger code i
7770: 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20  s generated and 
7780: 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  so this conditio
7790: 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a  n is no longer .
77a0: 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
77b0: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 73 65 65  ble.  But it see
77c0: 6d 73 20 70 72 75 64 65 6e 74 20 74 6f 20 6b 65  ms prudent to ke
77d0: 65 70 20 74 68 65 20 74 65 73 74 20 69 6e 20 70  ep the test in p
77e0: 6c 61 63 65 20 69 6e 0a 20 20 20 20 20 20 20 20  lace in.        
77f0: 2a 2a 20 63 61 73 65 20 73 6f 6d 65 74 68 69 6e  ** case somethin
7800: 67 20 65 6c 73 65 20 63 68 61 6e 67 65 73 2e 0a  g else changes..
7810: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
7820: 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54     zType = "TEXT
7830: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
7840: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
7850: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 29 3b   assert( pTab );
7860: 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b  .      if( pS ){
7870: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
7880: 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61  "table" is actua
7890: 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74  lly a sub-select
78a0: 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68   or a view in th
78b0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
78c0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
78d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
78e0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
78f0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
7900: 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20  d origin.       
7910: 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65   ** data for the
7920: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
7930: 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  mn of the sub-se
7940: 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lect..        */
7950: 0a 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57  .        if( ALW
7960: 41 59 53 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  AYS(iCol>=0 && i
7970: 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  Col<pS->pEList->
7980: 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  nExpr) ){.      
7990: 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69      /* If iCol i
79a0: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
79b0: 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
79c0: 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74  ssion requests t
79d0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
79e0: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62  rowid of the sub
79f0: 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
7a00: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
7a10: 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a   is legal (see .
7a20: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73            ** tes
7a30: 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32  t case misc2.2.2
7a40: 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76  ) - it always ev
7a50: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e  aluates to NULL.
7a60: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
7a70: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
7a80: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20  ext sNC;.       
7a90: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
7aa0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
7ab0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
7ac0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
7ad0: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
7ae0: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
7af0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e   0;.          sN
7b00: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
7b10: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
7b20: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
7b30: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
7b40: 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67  OriginDb, &zOrig
7b50: 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43  inTab, &zOriginC
7b60: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ol); .        }.
7b70: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7b80: 41 4c 57 41 59 53 28 70 54 61 62 2d 3e 70 53 63  ALWAYS(pTab->pSc
7b90: 68 65 6d 61 29 20 29 7b 0a 20 20 20 20 20 20 20  hema) ){.       
7ba0: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
7bb0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
7bc0: 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20  rt( !pS );.     
7bd0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
7be0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
7bf0: 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ey;.        asse
7c00: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
7c10: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
7c20: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
7c30: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
7c40: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
7c50: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
7c60: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  ";.          zOr
7c70: 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69 64  iginCol = "rowid
7c80: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
7c90: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
7ca0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
7cb0: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
7cc0: 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c        zOriginCol
7cd0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
7ce0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
7cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72     }.        zOr
7d00: 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62 2d 3e  iginTab = pTab->
7d10: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
7d20: 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29  f( pNC->pParse )
7d30: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
7d40: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
7d50: 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e  emaToIndex(pNC->
7d60: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
7d70: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
7d80: 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44 62 20        zOriginDb 
7d90: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pNC->pParse->d
7da0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
7db0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
7dc0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7dd0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
7de0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
7df0: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
7e00: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
7e10: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
7e20: 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  on is a sub-sele
7e30: 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  ct. Return the d
7e40: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
7e50: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69  and.      ** ori
7e60: 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65  gin info for the
7e70: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69   single column i
7e80: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
7e90: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
7ea0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
7eb0: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
7ec0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
7ed0: 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  C;.      Select 
7ee0: 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pS = pExpr->x.p
7ef0: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78  Select;.      Ex
7f00: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
7f10: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
7f20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
7f30: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
7f40: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
7f50: 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  t) );.      sNC.
7f60: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
7f70: 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  Src;.      sNC.p
7f80: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
7f90: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
7fa0: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
7fb0: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
7fc0: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
7fd0: 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67  OriginDb, &zOrig
7fe0: 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43  inTab, &zOriginC
7ff0: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  ol); .      brea
8000: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
8010: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f    }.  .  if( pzO
8020: 72 69 67 69 6e 44 62 20 29 7b 0a 20 20 20 20 61  riginDb ){.    a
8030: 73 73 65 72 74 28 20 70 7a 4f 72 69 67 69 6e 54  ssert( pzOriginT
8040: 61 62 20 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f  ab && pzOriginCo
8050: 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  l );.    *pzOrig
8060: 69 6e 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62  inDb = zOriginDb
8070: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54  ;.    *pzOriginT
8080: 61 62 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b  ab = zOriginTab;
8090: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f  .    *pzOriginCo
80a0: 6c 20 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a  l = zOriginCol;.
80b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 79    }.  return zTy
80c0: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  pe;.}../*.** Gen
80d0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
80e0: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
80f0: 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  BE the declarati
8100: 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75  on types of colu
8110: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
8120: 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
8130: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
8140: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20  eColumnTypes(.  
8150: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8160: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
8170: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
8180: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
8190: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
81a0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
81b0: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
81c0: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
81d0: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
81e0: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
81f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
8200: 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  YPE.  Vdbe *v = 
8210: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
8220: 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
8230: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43  ntext sNC;.  sNC
8240: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
8250: 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72  List;.  sNC.pPar
8260: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66  se = pParse;.  f
8270: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
8280: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
8290: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
82a0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
82b0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
82c0: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
82d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
82e0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
82f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
8300: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
8310: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
8320: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
8330: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
8340: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
8350: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
8360: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
8370: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
8380: 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  gCol);..    /* T
8390: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
83a0: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
83b0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
83c0: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
83d0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
83e0: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
83f0: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
8400: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
8410: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
8420: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
8430: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
8440: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8450: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8460: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
8470: 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45   zOrigDb, SQLITE
8480: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
8490: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
84a0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
84b0: 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69  NAME_TABLE, zOri
84c0: 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  gTab, SQLITE_TRA
84d0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
84e0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
84f0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8500: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
8510: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
8520: 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ENT);.#else.    
8530: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
8540: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
8550: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
8560: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8570: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8580: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
8590: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
85a0: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
85b0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
85c0: 49 54 5f 44 45 43 4c 54 59 50 45 20 2a 2f 0a 7d  IT_DECLTYPE */.}
85d0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
85e0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
85f0: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
8600: 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d  e names of colum
8610: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
8620: 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69  ult set.  This i
8630: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
8640: 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ed to provide th
8650: 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c  e.** azCol[] val
8660: 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62  ues in the callb
8670: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
8680: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
8690: 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65  mnNames(.  Parse
86a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
86b0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
86c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
86d0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
86e0: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
86f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
8700: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
8710: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
8720: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
8730: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
8740: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
8750: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74  nt i, j;.  sqlit
8760: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8770: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
8780: 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73  ames, shortNames
8790: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
87a0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
87b0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
87c0: 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20  n EXPLAIN, skip 
87d0: 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69  this step */.  i
87e0: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
87f0: 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  in ){.    return
8800: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
8810: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  if( pParse->colN
8820: 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56 45 52  amesSet || NEVER
8830: 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61  (v==0) || db->ma
8840: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
8850: 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  urn;.  pParse->c
8860: 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a  olNamesSet = 1;.
8870: 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64    fullNames = (d
8880: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
8890: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
88a0: 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73  =0;.  shortNames
88b0: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
88c0: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
88d0: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69  ames)!=0;.  sqli
88e0: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
88f0: 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  s(v, pEList->nEx
8900: 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  pr);.  for(i=0; 
8910: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
8920: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
8930: 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69  *p;.    p = pELi
8940: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
8950: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d      if( NEVER(p=
8960: 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =0) ) continue;.
8970: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
8980: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
8990: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
89a0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
89b0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Name;.      sqli
89c0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
89d0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
89e0: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  NAME, zName, SQL
89f0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
8a00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
8a10: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
8a20: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  || p->op==TK_AGG
8a30: 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61 62  _COLUMN) && pTab
8a40: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61  List ){.      Ta
8a50: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
8a60: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
8a70: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
8a80: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
8a90: 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28  for(j=0; ALWAYS(
8aa0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
8ab0: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); j++){.       
8ac0: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61   if( pTabList->a
8ad0: 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e  [j].iCursor==p->
8ae0: 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a  iTable ) break;.
8af0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
8b00: 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74  sert( j<pTabList
8b10: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ->nSrc );.      
8b20: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
8b30: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
8b40: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
8b50: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
8b60: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
8b70: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
8b80: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
8b90: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
8ba0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
8bb0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
8bc0: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  "rowid";.      }
8bd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
8be0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
8bf0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
8c00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
8c10: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66  shortNames && !f
8c20: 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ullNames ){.    
8c30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8c40: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8c50: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20  COLNAME_NAME, . 
8c60: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
8c70: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
8c80: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
8c90: 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d  n), SQLITE_DYNAM
8ca0: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
8cb0: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29   if( fullNames )
8cc0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
8cd0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
8ce0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
8cf0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
8d00: 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
8d10: 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  me, zCol);.     
8d20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8d30: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8d40: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
8d50: 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d  me, SQLITE_DYNAM
8d60: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
8d70: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8d80: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8d90: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8da0: 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45  ME, zCol, SQLITE
8db0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
8dc0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
8dd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8de0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8df0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8e00: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8e10: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
8e20: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
8e30: 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d  n), SQLITE_DYNAM
8e40: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  IC);.    }.  }. 
8e50: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
8e60: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
8e70: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
8e80: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8e90: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
8ea0: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
8eb0: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
8ec0: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
8ed0: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
8ee0: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
8ef0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
8f00: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
8f10: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
8f20: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
8f30: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
8f40: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
8f50: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
8f60: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
8f70: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
8f80: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
8f90: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
8fa0: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
8fb0: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
8fc0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
8fd0: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
8fe0: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
8ff0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
9000: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9010: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
9020: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
9030: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20 65  .** Given a an e
9040: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
9050: 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
9060: 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
9070: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
9080: 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
9090: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
90a0: 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
90b0: 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
90c0: 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
90d0: 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
90e0: 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
90f0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
9100: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
9110: 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
9120: 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
9130: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
9140: 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
9150: 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
9160: 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
9170: 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
9180: 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
9190: 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
91a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
91b0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
91c0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
91d0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
91e0: 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
91f0: 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
9200: 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
9210: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9220: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9230: 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
9240: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
9250: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9260: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
9270: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
9280: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
9290: 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73       /* Expr lis
92a0: 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  t from which to 
92b0: 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61  derive column na
92c0: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  mes */.  int *pn
92d0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
92e0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
92f0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
9300: 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  here */.  Column
9310: 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20   **paCol        
9320: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
9330: 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  ew column list h
9340: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
9350: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9360: 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62  ->db;   /* Datab
9370: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
9380: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
9390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93a0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
93b0: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20   */.  int cnt;  
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93d0: 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64    /* Index added
93e0: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
93f0: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f  e unique */.  Co
9400: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
9410: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  l;        /* For
9420: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65   looping over re
9430: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
9440: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9460: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
9470: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
9480: 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a   set */.  Expr *
9490: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
94a0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
94b0: 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ion for a single
94c0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a   result column *
94d0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94f0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
9500: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20  /* Size of name 
9530: 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20  in zName[] */.. 
9540: 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d   *pnCol = nCol =
9550: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
9560: 20 20 61 43 6f 6c 20 3d 20 2a 70 61 43 6f 6c 20    aCol = *paCol 
9570: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
9580: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
9590: 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b  (aCol[0])*nCol);
95a0: 0a 20 20 69 66 28 20 61 43 6f 6c 3d 3d 30 20 29  .  if( aCol==0 )
95b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
95c0: 4f 4d 45 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  OMEM;.  for(i=0,
95d0: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43   pCol=aCol; i<nC
95e0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
95f0: 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20  {.    /* Get an 
9600: 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65  appropriate name
9610: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a   for the column.
9620: 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70      */.    p = p
9630: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
9640: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
9650: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 45  ->pRight==0 || E
9660: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9670: 2d 3e 70 52 69 67 68 74 2c 20 45 50 5f 49 6e 74  ->pRight, EP_Int
9680: 56 61 6c 75 65 29 0a 20 20 20 20 20 20 20 20 20  Value).         
9690: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 70 52 69 67        || p->pRig
96a0: 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 20  ht->u.zToken==0 
96b0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 75 2e  || p->pRight->u.
96c0: 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
96d0: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
96e0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
96f0: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
9700: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
9710: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
9720: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
9730: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
9740: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
9750: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
9760: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e  3DbStrDup(db, zN
9770: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
9780: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
9790: 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54  lExpr = p;  /* T
97a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
97b0: 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  at is the result
97c0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
97d0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
97e0: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  b;         /* Ta
97f0: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
9800: 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73  ith this express
9810: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ion */.      whi
9820: 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  le( pColExpr->op
9830: 3d 3d 54 4b 5f 44 4f 54 20 29 20 70 43 6f 6c 45  ==TK_DOT ) pColE
9840: 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  xpr = pColExpr->
9850: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
9860: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
9870: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57  TK_COLUMN && ALW
9880: 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54  AYS(pColExpr->pT
9890: 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ab!=0) ){.      
98a0: 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73    /* For columns
98b0: 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20   use the column 
98c0: 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  name name */.   
98d0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
98e0: 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pColExpr->iColum
98f0: 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  n;.        pTab 
9900: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  = pColExpr->pTab
9910: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
9920: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
9930: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
9940: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
9950: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
9960: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
9970: 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70       iCol>=0 ? p
9980: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9990: 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 29  zName : "rowid")
99a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
99b0: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
99c0: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
99d0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
99e0: 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78  sProperty(pColEx
99f0: 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
9a00: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   );.        zNam
9a10: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
9a20: 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 43 6f  tf(db, "%s", pCo
9a30: 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  lExpr->u.zToken)
9a40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9a50: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
9a60: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
9a70: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
9a80: 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
9a90: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
9aa0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
9ab0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
9ac0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
9ad0: 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pan);.      }.  
9ae0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
9af0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
9b00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9b10: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
9b20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9b30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
9b40: 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  sure the column 
9b50: 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20  name is unique. 
9b60: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   If the name is 
9b70: 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20  not unique,.    
9b80: 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65  ** append a inte
9b90: 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
9ba0: 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
9bb0: 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
9bc0: 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71  /.    nName = sq
9bd0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
9be0: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  ame);.    for(j=
9bf0: 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  cnt=0; j<i; j++)
9c00: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
9c10: 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b  te3StrICmp(aCol[
9c20: 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  j].zName, zName)
9c30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
9c40: 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20  har *zNewName;. 
9c50: 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61         zName[nNa
9c60: 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  me] = 0;.       
9c70: 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69   zNewName = sqli
9c80: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
9c90: 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b  %s:%d", zName, +
9ca0: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  +cnt);.        s
9cb0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9cc0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
9cd0: 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d   zName = zNewNam
9ce0: 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d  e;.        j = -
9cf0: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  1;.        if( z
9d00: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
9d10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9d20: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
9d30: 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66   zName;.  }.  if
9d40: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
9d50: 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  ed ){.    for(j=
9d60: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
9d70: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9d80: 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e  e(db, aCol[j].zN
9d90: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
9da0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9db0: 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61  , aCol);.    *pa
9dc0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e  Col = 0;.    *pn
9dd0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Col = 0;.    ret
9de0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9df0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
9e00: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
9e10: 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
9e20: 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
9e30: 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
9e40: 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
9e50: 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
9e60: 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
9e70: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
9e80: 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
9e90: 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
9ea0: 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
9eb0: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
9ec0: 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
9ed0: 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
9ee0: 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
9ef0: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
9f00: 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
9f10: 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
9f20: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
9f30: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9f40: 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
9f50: 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
9f60: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
9f70: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
9f80: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61  resolved..*/.sta
9f90: 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
9fa0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
9fb0: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
9fc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
9fd0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
9fe0: 74 65 78 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  texts */.  int n
9ff0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
a000: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
a010: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f 6c 75 6d  lumns */.  Colum
a020: 6e 20 2a 61 43 6f 6c 2c 20 20 20 20 20 20 20 20  n *aCol,        
a030: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
a040: 6d 6e 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  mns */.  Select 
a050: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
a060: 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f  * SELECT used to
a070: 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73   determine types
a080: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20   and collations 
a090: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
a0a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
a0b0: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
a0c0: 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  sNC;.  Column *p
a0d0: 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Col;.  CollSeq *
a0e0: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
a0f0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72    Expr *p;.  str
a100: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
a110: 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  m *a;..  assert(
a120: 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20   pSelect!=0 );. 
a130: 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65 63   assert( (pSelec
a140: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
a150: 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b  _Resolved)!=0 );
a160: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d  .  assert( nCol=
a170: 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  =pSelect->pEList
a180: 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  ->nExpr || db->m
a190: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
a1a0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
a1b0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
a1c0: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
a1d0: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
a1e0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
a1f0: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
a200: 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70    a = pSelect->p
a210: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28  EList->a;.  for(
a220: 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20  i=0, pCol=aCol; 
a230: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  i<nCol; i++, pCo
a240: 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b  l++){.    p = a[
a250: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43  i].pExpr;.    pC
a260: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
a270: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
a280: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
a290: 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20   p, 0, 0, 0));. 
a2a0: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
a2b0: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
a2c0: 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20  ffinity(p);.    
a2d0: 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  if( pCol->affini
a2e0: 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66  ty==0 ) pCol->af
a2f0: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
a300: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70 43  AFF_NONE;.    pC
a310: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
a320: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
a330: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   p);.    if( pCo
a340: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ll ){.      pCol
a350: 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->zColl = sqlite
a360: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43  3DbStrDup(db, pC
a370: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
a380: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
a390: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
a3a0: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
a3b0: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
a3c0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
a3d0: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
a3e0: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
a3f0: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
a400: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
a410: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
a420: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
a430: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
a440: 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
a450: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
a460: 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  >db;.  int saved
a470: 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
a480: 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
a490: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
a4a0: 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
a4b0: 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  Names;.  db->fla
a4c0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
a4d0: 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71  rtColNames;.  sq
a4e0: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
a4f0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
a500: 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
a510: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
a520: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
a530: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
a540: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
a550: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e  ->pPrior;.  db->
a560: 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
a570: 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  gs;.  pTab = sql
a580: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
a590: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
a5a0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
a5b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
a5c0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  n 0;.  }.  /* Th
a5d0: 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  e sqlite3ResultS
a5e0: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20  etOfSelect() is 
a5f0: 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74  only used n cont
a600: 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61  exts where looka
a610: 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73  side.  ** is dis
a620: 61 62 6c 65 64 2c 20 73 6f 20 77 65 20 6d 69 67  abled, so we mig
a630: 68 74 20 61 73 20 77 65 6c 6c 20 68 61 72 64 2d  ht as well hard-
a640: 63 6f 64 65 20 70 54 61 62 2d 3e 64 62 4d 65 6d  code pTab->dbMem
a650: 20 74 6f 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61   to NULL. */.  a
a660: 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61  ssert( db->looka
a670: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30  side.bEnabled==0
a680: 20 29 3b 0a 20 20 70 54 61 62 2d 3e 64 62 4d 65   );.  pTab->dbMe
a690: 6d 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e  m = 0;.  pTab->n
a6a0: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d  Ref = 1;.  pTab-
a6b0: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 73 65  >zName = 0;.  se
a6c0: 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
a6d0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
a6e0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c  pSelect->pEList,
a6f0: 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
a700: 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65  Tab->aCol);.  se
a710: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
a720: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
a730: 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  arse, pTab->nCol
a740: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53  , pTab->aCol, pS
a750: 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e  elect);.  pTab->
a760: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
a770: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
a780: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
a790: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 54 61  3DeleteTable(pTa
a7a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  b);.    return 0
a7b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
a7c0: 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Tab;.}../*.** Ge
a7d0: 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65  t a VDBE for the
a7e0: 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f   given parser co
a7f0: 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61  ntext.  Create a
a800: 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
a810: 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20  ssary..** If an 
a820: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
a830: 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65  turn NULL and le
a840: 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e  ave a message in
a850: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65   pParse..*/.Vdbe
a860: 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65   *sqlite3GetVdbe
a870: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
a880: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
a890: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
a8a0: 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20  ( v==0 ){.    v 
a8b0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  = pParse->pVdbe 
a8c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65  = sqlite3VdbeCre
a8d0: 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ate(pParse->db);
a8e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a8f0: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69  OMIT_TRACE.    i
a900: 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20 73 71  f( v ){.      sq
a910: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
a920: 76 2c 20 4f 50 5f 54 72 61 63 65 29 3b 0a 20 20  v, OP_Trace);.  
a930: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
a940: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f   return v;.}.../
a950: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
a960: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
a970: 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
a980: 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
a990: 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20  n the.** pLimit 
a9a0: 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72  and pOffset expr
a9b0: 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74  essions.  pLimit
a9c0: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c   and pOffset hol
a9d0: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
a9e0: 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72  s.** that appear
a9f0: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
aa00: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
aa10: 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61  fter the LIMIT a
aa20: 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79  nd OFFSET.** key
aa30: 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20  words.  Or NULL 
aa40: 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64  if those keyword
aa50: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69  s are omitted. i
aa60: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
aa70: 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e  t .** are the in
aa80: 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67  teger memory reg
aa90: 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f  ister numbers fo
aaa0: 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  r counters used 
aab0: 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74  to compute .** t
aac0: 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  he limit and off
aad0: 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69  set.  If there i
aae0: 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f  s no limit and/o
aaf0: 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a  r offset, then .
ab00: 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  ** iLimit and iO
ab10: 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69  ffset are negati
ab20: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ve..**.** This r
ab30: 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74  outine changes t
ab40: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69  he values of iLi
ab50: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
ab60: 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d  only if.** a lim
ab70: 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20  it or offset is 
ab80: 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69  defined by pLimi
ab90: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20  t and pOffset.  
aba0: 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f  iLimit and.** iO
abb0: 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  ffset should hav
abc0: 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f  e been preset to
abd0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66   appropriate def
abe0: 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28  ault values.** (
abf0: 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20  usually but not 
ac00: 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72  always -1) prior
ac10: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
ac20: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c   routine..** Onl
ac30: 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f  y if pLimit!=0 o
ac40: 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20  r pOffset!=0 do 
ac50: 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
ac60: 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66  ers get.** redef
ac70: 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e  ined.  The UNION
ac80: 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73   ALL operator us
ac90: 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79  es this property
aca0: 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65   to force.** the
acb0: 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61   reuse of the sa
acc0: 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  me limit and off
acd0: 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63  set registers ac
ace0: 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  ross multiple.**
acf0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ad00: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
ad10: 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  id computeLimitR
ad20: 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a  egisters(Parse *
ad30: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
ad40: 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a  p, int iBreak){.
ad50: 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20    Vdbe *v = 0;. 
ad60: 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b   int iLimit = 0;
ad70: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a  .  int iOffset;.
ad80: 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 69    int addr1;.  i
ad90: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72  f( p->iLimit ) r
ada0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20  eturn;..  /* .  
adb0: 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c  ** "LIMIT -1" al
adc0: 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72  ways shows all r
add0: 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73  ows.  There is s
ade0: 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76  ome.  ** contrav
adf0: 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20  ersy about what 
ae00: 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
ae10: 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a  vior should be..
ae20: 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74    ** The current
ae30: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
ae40: 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49  interprets "LIMI
ae50: 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a  T 0" to mean.  *
ae60: 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  * no rows..  */.
ae70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
ae80: 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
ae90: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
aea0: 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  ffset==0 || p->p
aeb0: 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66  Limit!=0 );.  if
aec0: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
aed0: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69     p->iLimit = i
aee0: 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65  Limit = ++pParse
aef0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20  ->nMem;.    v = 
af00: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
af10: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
af20: 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
af30: 74 75 72 6e 3b 20 20 2f 2a 20 56 44 42 45 20 73  turn;  /* VDBE s
af40: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
af50: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
af60: 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
af70: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
af80: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d   p->pLimit, iLim
af90: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
afa0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
afb0: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d  _MustBeInt, iLim
afc0: 69 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  it);.    VdbeCom
afd0: 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20  ment((v, "LIMIT 
afe0: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
aff0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b000: 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  2(v, OP_IfZero, 
b010: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
b020: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66  .    if( p->pOff
b030: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  set ){.      p->
b040: 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
b050: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
b060: 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
b070: 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
b080: 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
b090: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
b0a0: 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
b0b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b0c0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
b0d0: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29  Offset, iOffset)
b0e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b0f0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b100: 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
b110: 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
b120: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
b130: 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
b140: 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
b150: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
b160: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66  , OP_IfPos, iOff
b170: 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
b180: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b190: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
b1a0: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
b1b0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
b1c0: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
b1d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b1e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64  AddOp3(v, OP_Add
b1f0: 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
b200: 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20  t, iOffset+1);. 
b210: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
b220: 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
b230: 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64  ET"));.      add
b240: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
b250: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
b260: 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  os, iLimit);.   
b270: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b280: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
b290: 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b  er, -1, iOffset+
b2a0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
b2b0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
b2c0: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20   addr1);.    }. 
b2d0: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
b2e0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
b2f0: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
b300: 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
b310: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
b320: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
b330: 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
b340: 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   of.** the resul
b350: 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f  t set for the co
b360: 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74  mpound-select st
b370: 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65  atement "p".  Re
b380: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20  turn NULL if.** 
b390: 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e  the column has n
b3a0: 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  o default collat
b3b0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
b3c0: 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e  .** The collatin
b3d0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
b3e0: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
b3f0: 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ct is taken from
b400: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
b410: 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65  t term of the se
b420: 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20  lect that has a 
b430: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
b440: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  ce..*/.static Co
b450: 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65  llSeq *multiSele
b460: 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ctCollSeq(Parse 
b470: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
b480: 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  *p, int iCol){. 
b490: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a   CollSeq *pRet;.
b4a0: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
b4b0: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75  ){.    pRet = mu
b4c0: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
b4d0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69  (pParse, p->pPri
b4e0: 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c  or, iCol);.  }el
b4f0: 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  se{.    pRet = 0
b500: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
b510: 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28  iCol>=0 );.  if(
b520: 20 70 52 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c   pRet==0 && iCol
b530: 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  <p->pEList->nExp
b540: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
b550: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
b560: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  eq(pParse, p->pE
b570: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
b580: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
b590: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn pRet;.}.#endi
b5a0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
b5b0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
b5c0: 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
b5d0: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
b5e0: 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
b5f0: 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
b600: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b610: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
b620: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
b630: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
b640: 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
b650: 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
b660: 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
b670: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
b680: 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
b690: 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
b6a0: 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 23  esults */.);...#
b6b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b6c0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
b6d0: 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CT./*.** This ro
b6e0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
b6f0: 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d  to process a com
b700: 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d  pound query form
b710: 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20   from.** two or 
b720: 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75  more separate qu
b730: 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f  eries using UNIO
b740: 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58  N, UNION ALL, EX
b750: 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45  CEPT, or.** INTE
b760: 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20  RSECT.**.** "p" 
b770: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69  points to the ri
b780: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20  ght-most of the 
b790: 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68  two queries.  th
b7a0: 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a  e query on the.*
b7b0: 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72  * left is p->pPr
b7c0: 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71  ior.  The left q
b7d0: 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20  uery could also 
b7e0: 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  be a compound qu
b7f0: 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ery.** in which 
b800: 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
b810: 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
b820: 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a   recursively. .*
b830: 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
b840: 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   of the total qu
b850: 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72  ery are to be wr
b860: 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73  itten into a des
b870: 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  tination.** of t
b880: 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70  ype eDest with p
b890: 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a  arameter iParm..
b8a0: 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
b8b0: 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72    Consider a thr
b8c0: 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20  ee-way compound 
b8d0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
b8e0: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
b8f0: 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  a FROM t1 UNION 
b900: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
b910: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20   UNION SELECT c 
b920: 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68  FROM t3.**.** Th
b930: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
b940: 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c  parsed up as fol
b950: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
b960: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
b970: 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  .**      |.**   
b980: 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45     `----->  SELE
b990: 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20  CT b FROM t2.** 
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
b9b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
b9c0: 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c     `------>  SEL
b9d0: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a  ECT a FROM t1.**
b9e0: 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69  .** The arrows i
b9f0: 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62  n the diagram ab
ba00: 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68  ove represent th
ba10: 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20  e Select.pPrior 
ba20: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69  pointer..** So i
ba30: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
ba40: 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20  s called with p 
ba50: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20  equal to the t3 
ba60: 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70  query, then.** p
ba70: 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68  Prior will be th
ba80: 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e  e t2 query.  p->
ba90: 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e  op will be TK_UN
baa0: 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65  ION in this case
bab0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74  ..**.** Notice t
bac0: 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74  hat because of t
bad0: 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61  he way SQLite pa
bae0: 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45  rses compound SE
baf0: 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e  LECTs, the.** in
bb00: 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73  dividual selects
bb10: 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72   always group fr
bb20: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
bb30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bb40: 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50  multiSelect(.  P
bb50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
bb60: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
bb70: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
bb80: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
bb90: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
bba0: 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
bbb0: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
bbc0: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
bbd0: 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
bbe0: 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
bbf0: 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
bc00: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bc10: 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73  OK;   /* Success
bc20: 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62   code from a sub
bc30: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c  routine */.  Sel
bc40: 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
bc50: 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
bc60: 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
bc70: 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
bc80: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
bc90: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
bca0: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
bcb0: 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
bcc0: 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20  tDest dest;     
bcd0: 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20   /* Alternative 
bce0: 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  data destination
bcf0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44   */.  Select *pD
bd00: 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43  elete = 0;  /* C
bd10: 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73  hain of simple s
bd20: 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65  elects to delete
bd30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
bd40: 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
bd50: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
bd60: 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65  on */..  /* Make
bd70: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
bd80: 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  o ORDER BY or LI
bd90: 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72  MIT clause on pr
bda0: 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e  ior SELECTs.  On
bdb0: 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  ly.  ** the last
bdc0: 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45   (right-most) SE
bdd0: 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
bde0: 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
bdf0: 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
be00: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
be10: 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20   p && p->pPrior 
be20: 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66  );  /* Calling f
be30: 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65  unction guarante
be40: 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a  es this much */.
be50: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
be60: 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  b;.  pPrior = p-
be70: 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72  >pPrior;.  asser
be80: 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68  t( pPrior->pRigh
be90: 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29 3b  tmost!=pPrior );
bea0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
beb0: 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70  r->pRightmost==p
bec0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a  ->pRightmost );.
bed0: 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b    dest = *pDest;
bee0: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
bef0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
bf00: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
bf10: 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20  Parse,"ORDER BY 
bf20: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
bf30: 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
bf40: 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
bf50: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
bf60: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
bf70: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
bf80: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
bf90: 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
bfa0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
bfb0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
bfc0: 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65  se,"LIMIT clause
bfd0: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
bfe0: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
bff0: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
c000: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
c010: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
c020: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c030: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  _end;.  }..  v =
c040: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
c050: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
c060: 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54  t( v!=0 );  /* T
c070: 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  he VDBE already 
c080: 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69  created by calli
c090: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  ng function */..
c0a0: 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
c0b0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70  destination temp
c0c0: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e  orary table if n
c0d0: 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20  ecessary.  */.  
c0e0: 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
c0f0: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
c100: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c110: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c  EList );.    sql
c120: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c130: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
c140: 61 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c 20  al, dest.iParm, 
c150: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
c160: 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  );.    dest.eDes
c170: 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
c180: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
c190: 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69  re all SELECTs i
c1a0: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
c1b0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
c1c0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
c1d0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72  .  ** in their r
c1e0: 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f  esult sets..  */
c1f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
c200: 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e  List && pPrior->
c210: 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20  pEList );.  if( 
c220: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
c230: 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  !=pPrior->pEList
c240: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
c250: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
c260: 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20  Parse, "SELECTs 
c270: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
c280: 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20  right of %s".   
c290: 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65     " do not have
c2a0: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
c2b0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
c2c0: 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  ns", selectOpNam
c2d0: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
c2e0: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
c2f0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c300: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
c310: 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61  ound SELECTs tha
c320: 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
c330: 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61  BY clause are ha
c340: 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79  ndled separately
c350: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
c360: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
c370: 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
c380: 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65  ctOrderBy(pParse
c390: 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  , p, pDest);.  }
c3a0: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
c3b0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
c3c0: 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
c3d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
c3e0: 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d   */.  switch( p-
c3f0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
c400: 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  TK_ALL: {.      
c410: 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20  int addr = 0;.  
c420: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
c430: 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20  ior->pLimit );. 
c440: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
c450: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
c460: 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
c470: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
c480: 73 65 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  set;.      rc = 
c490: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
c4a0: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
c4b0: 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  est);.      p->p
c4c0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
c4d0: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
c4e0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
c4f0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
c500: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c510: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
c520: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
c530: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70     p->iLimit = p
c540: 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20  Prior->iLimit;. 
c550: 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
c560: 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
c570: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  t;.      if( p->
c580: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
c590: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
c5a0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
c5b0: 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  _IfZero, p->iLim
c5c0: 69 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  it);.        Vdb
c5d0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75  eComment((v, "Ju
c5e0: 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49  mp ahead if LIMI
c5f0: 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20  T reached"));.  
c600: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
c610: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
c620: 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
c630: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
c640: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c650: 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
c660: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
c670: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
c680: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
c690: 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20  ( addr ){.      
c6a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c6b0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
c6c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
c6d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
c6e0: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20  ase TK_EXCEPT:. 
c6f0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
c700: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e  : {.      int un
c710: 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75  ionTab;    /* Cu
c720: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
c730: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
c740: 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  le holding resul
c750: 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70  t */.      u8 op
c760: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f   = 0;       /* O
c770: 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f  ne of the SRT_ o
c780: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70  perations to app
c790: 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20  ly to self */.  
c7a0: 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
c7b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
c7c0: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
c7d0: 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
c7e0: 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  ects */.      Ex
c7f0: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
c800: 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76  fset; /* Saved v
c810: 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
c820: 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65  it and p->nOffse
c830: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
c840: 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  ddr;.      Selec
c850: 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b  tDest uniondest;
c860: 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
c870: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
c880: 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  PT );.      test
c890: 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
c8a0: 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  UNION );.      p
c8b0: 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69  riorOp = SRT_Uni
c8c0: 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65  on;.      if( de
c8d0: 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f  st.eDest==priorO
c8e0: 70 20 26 26 20 41 4c 57 41 59 53 28 21 70 2d 3e  p && ALWAYS(!p->
c8f0: 70 4c 69 6d 69 74 20 26 26 21 70 2d 3e 70 4f 66  pLimit &&!p->pOf
c900: 66 73 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  fset) ){.       
c910: 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65   /* We can reuse
c920: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
c930: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  le generated by 
c940: 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a  a SELECT to our.
c950: 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74          ** right
c960: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
c970: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c980: 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 20 29 3b  pRightmost!=p );
c990: 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61    /* Can only ha
c9a0: 70 70 65 6e 20 66 6f 72 20 6c 65 66 74 77 61 72  ppen for leftwar
c9b0: 64 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 20  d elements.     
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 2a 2a 20 6f 66 20 61 20 33 2d 77 61 79 20 6f 72  ** of a 3-way or
c9f0: 20 6d 6f 72 65 20 63 6f 6d 70 6f 75 6e 64 20 2a   more compound *
ca00: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
ca10: 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29  ( p->pLimit==0 )
ca20: 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c  ;      /* Not al
ca30: 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72  lowed on leftwar
ca40: 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  d elements */.  
ca50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
ca60: 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  >pOffset==0 );  
ca70: 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65     /* Not allowe
ca80: 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c  d on leftward el
ca90: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ements */.      
caa0: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73    unionTab = des
cab0: 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  t.iParm;.      }
cac0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
cad0: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
cae0: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
caf0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
cb00: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
cb10: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
cb20: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
cb30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
cb40: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
cb50: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
cb60: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
cb70: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
cb80: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
cb90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cba0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
cbb0: 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
cbc0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
cbd0: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
cbe0: 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
cbf0: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
cc00: 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
cc10: 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68          p->pRigh
cc20: 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20  tmost->selFlags 
cc30: 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
cc40: 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ral;.        ass
cc50: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
cc60: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
cc70: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
cc80: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
cc90: 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
cca0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
ccb0: 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
ccc0: 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  rBy );.      sql
ccd0: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
cce0: 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
ccf0: 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
cd00: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
cd10: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
cd20: 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69  se, pPrior, &uni
cd30: 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69  ondest);.      i
cd40: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
cd50: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
cd60: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
cd70: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
cd80: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
cd90: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
cda0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
cdb0: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
cdc0: 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  ){.        op = 
cdd0: 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20  SRT_Except;.    
cde0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cdf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
ce00: 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
ce10: 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69      op = SRT_Uni
ce20: 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  on;.      }.    
ce30: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
ce40: 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
ce50: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
ce60: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
ce70: 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
ce80: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
ce90: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
cea0: 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73  ;.      uniondes
ceb0: 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20  t.eDest = op;.  
cec0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ced0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
cee0: 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
cef0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
cf00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
cf10: 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66        /* Query f
cf20: 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c  lattening in sql
cf30: 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67  ite3Select() mig
cf40: 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72  ht refill p->pOr
cf50: 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20  derBy..      ** 
cf60: 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74  Be sure to delet
cf70: 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74  e p->pOrderBy, t
cf80: 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f  herefore, to avo
cf90: 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  id a memory leak
cfa0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
cfb0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
cfc0: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
cfd0: 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
cfe0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
cff0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
d000: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
d010: 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
d020: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d030: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
d040: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
d050: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
d060: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
d070: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
d080: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30     p->iLimit = 0
d090: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
d0a0: 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  et = 0;..      /
d0b0: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61  * Convert the da
d0c0: 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ta in the tempor
d0d0: 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  ary table into w
d0e0: 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20  hatever form.   
d0f0: 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74     ** it is that
d100: 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65   we currently ne
d110: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
d120: 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e     assert( union
d130: 54 61 62 3d 3d 64 65 73 74 2e 69 50 61 72 6d 20  Tab==dest.iParm 
d140: 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  || dest.eDest!=p
d150: 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20  riorOp );.      
d160: 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d  if( dest.eDest!=
d170: 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
d180: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
d190: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
d1a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
d1b0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
d1c0: 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
d1d0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
d1e0: 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
d1f0: 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  t *pFirst = p;. 
d200: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
d210: 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
d220: 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
d230: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
d240: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
d250: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
d260: 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
d270: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
d280: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
d290: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
d2a0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
d2b0: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
d2c0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
d2d0: 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65  .        compute
d2e0: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
d2f0: 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
d300: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d310: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d320: 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e  OP_Rewind, union
d330: 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  Tab, iBreak);.  
d340: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
d350: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
d360: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
d370: 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
d380: 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
d390: 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62  pEList, unionTab
d3a0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
d3b0: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 2d              0, -
d3d0: 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  1, &dest, iCont,
d3e0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
d3f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
d400: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
d410: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
d420: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d430: 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e  , OP_Next, union
d440: 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  Tab, iStart);.  
d450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d460: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
d470: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
d480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d490: 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
d4a0: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
d4b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
d4c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
d4d0: 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70  fault: assert( p
d4e0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ->op==TK_INTERSE
d4f0: 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  CT ); {.      in
d500: 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20  t tab1, tab2;.  
d510: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
d520: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
d530: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
d540: 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20  t, *pOffset;.   
d550: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
d560: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e     SelectDest in
d570: 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20  tersectdest;.   
d580: 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20     int r1;..    
d590: 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69    /* INTERSECT i
d5a0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
d5b0: 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63   the others sinc
d5c0: 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20  e it requires.  
d5d0: 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f      ** two tempo
d5e0: 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65  rary tables.  He
d5f0: 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f  nce it has its o
d600: 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a  wn case.  Begin.
d610: 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f        ** by allo
d620: 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65  cating the table
d630: 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a  s we will need..
d640: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
d650: 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab1 = pParse->nT
d660: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32  ab++;.      tab2
d670: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
d680: 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
d690: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
d6a0: 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d  );..      addr =
d6b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d6c0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
d6d0: 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29  emeral, tab1, 0)
d6e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d6f0: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
d700: 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
d710: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
d720: 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
d730: 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
d740: 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
d750: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
d760: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
d770: 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
d780: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
d790: 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
d7a0: 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
d7b0: 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
d7c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
d7d0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
d7e0: 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65  nit(&intersectde
d7f0: 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  st, SRT_Union, t
d800: 61 62 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ab1);.      rc =
d810: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
d820: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
d830: 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
d840: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
d850: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
d860: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d870: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
d880: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
d890: 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
d8a0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
d8b0: 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
d8c0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
d8d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d8e0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
d8f0: 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
d900: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
d910: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20  rOpenEphm[1] == 
d920: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
d930: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
d940: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
d950: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
d960: 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
d970: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
d980: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
d990: 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
d9a0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
d9b0: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
d9c0: 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74     intersectdest
d9d0: 2e 69 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20  .iParm = tab2;. 
d9e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d9f0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
da00: 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  p, &intersectdes
da10: 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
da20: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
da30: 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  K );.      pDele
da40: 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
da50: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
da60: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
da70: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
da80: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
da90: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
daa0: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
dab0: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
dac0: 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f  Offset;..      /
dad0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
dae0: 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
daf0: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
db00: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
db10: 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
db20: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
db30: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
db40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
db50: 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  t.eDest==SRT_Out
db60: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53  put ){.        S
db70: 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
db80: 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  p;.        while
db90: 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
dba0: 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
dbb0: 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
dbc0: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
dbd0: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
dbe0: 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
dbf0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
dc00: 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
dc10: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
dc20: 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20  v);.      iCont 
dc30: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
dc40: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
dc50: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
dc60: 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
dc70: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
dc80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dc90: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
dca0: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
dcb0: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
dcc0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
dcd0: 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61  rse);.      iSta
dce0: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
dcf0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
dd00: 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a  Key, tab1, r1);.
dd10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dd20: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
dd30: 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43  tFound, tab2, iC
dd40: 6f 6e 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ont, r1);.      
dd50: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
dd60: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
dd70: 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
dd80: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
dd90: 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74   p, p->pEList, t
dda0: 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ab1, p->pEList->
ddb0: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
ddd0: 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74  -1, &dest, iCont
dde0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
ddf0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
de00: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
de10: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
de20: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
de30: 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
de40: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
de50: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
de60: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
de70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
de80: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
de90: 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
dea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
deb0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
dec0: 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
ded0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dee0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  }.  }..  /* Comp
def0: 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
df00: 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
df10: 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
df20: 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f  tables needed to
df30: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
df40: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
df50: 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20    ** Attach the 
df60: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
df70: 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61  e to all tempora
df80: 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ry tables..  **.
df90: 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
dfa0: 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
dfb0: 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
dfc0: 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
dfd0: 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
dfe0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
dff0: 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
e000: 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
e010: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
e020: 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
e030: 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
e040: 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
e050: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
e060: 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
e070: 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
e080: 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
e090: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
e0a0: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29  _UsesEphemeral )
e0b0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
e0e0: 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  ter */.    KeyIn
e0f0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20  fo *pKeyInfo;   
e100: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
e110: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
e120: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  or the result se
e130: 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20  t */.    Select 
e140: 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
e150: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
e160: 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45  oping through SE
e170: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
e180: 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
e190: 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20  *apColl;        
e1a0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
e1b0: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79  ing through pKey
e1c0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f  Info->aColl[] */
e1d0: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e200: 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
e210: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73  t set */..    as
e220: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d  sert( p->pRightm
e230: 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43  ost==p );.    nC
e240: 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
e250: 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49  nExpr;.    pKeyI
e260: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
e270: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20  allocZero(db,.  
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65       sizeof(*pKe
e2a0: 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 28 73 69 7a  yInfo)+nCol*(siz
e2b0: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20  eof(CollSeq*) + 
e2c0: 31 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b  1));.    if( !pK
e2d0: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
e2e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
e2f0: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  M;.      goto mu
e300: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
e310: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49      }..    pKeyI
e320: 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64  nfo->enc = ENC(d
e330: 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  b);.    pKeyInfo
e340: 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
e350: 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  nCol;..    for(i
e360: 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
e370: 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
e380: 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
e390: 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
e3a0: 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
e3b0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
e3c0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
e3d0: 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
e3e0: 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
e3f0: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
e400: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
e410: 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
e420: 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
e430: 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
e440: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
e450: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
e460: 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
e470: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
e480: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
e490: 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
e4a0: 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
e4b0: 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
e4c0: 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
e4d0: 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
e4e0: 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
e4f0: 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
e500: 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
e510: 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
e520: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
e530: 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
e540: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
e550: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
e560: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
e570: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e580: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
e590: 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
e5a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e5b0: 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
e5c0: 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
e5d0: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
e5e0: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
e5f0: 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
e600: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
e610: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
e620: 72 65 65 28 64 62 2c 20 70 4b 65 79 49 6e 66 6f  ree(db, pKeyInfo
e630: 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
e640: 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73  lect_end:.  pDes
e650: 74 2d 3e 69 4d 65 6d 20 3d 20 64 65 73 74 2e 69  t->iMem = dest.i
e660: 4d 65 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 4d  Mem;.  pDest->nM
e670: 65 6d 20 3d 20 64 65 73 74 2e 6e 4d 65 6d 3b 0a  em = dest.nMem;.
e680: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
e690: 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74  elete(db, pDelet
e6a0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
e6b0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
e6c0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
e6d0: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
e6e0: 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75  ** Code an outpu
e6f0: 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  t subroutine for
e700: 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70   a coroutine imp
e710: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
e720: 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d  .** SELECT statm
e730: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ent..**.** The d
e740: 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74  ata to be output
e750: 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
e760: 20 70 49 6e 2d 3e 69 4d 65 6d 2e 20 20 54 68 65   pIn->iMem.  The
e770: 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
e780: 4d 65 6d 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62  Mem columns to b
e790: 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74  e output.  pDest
e7a0: 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75   is where the ou
e7b0: 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  tput should.** b
e7c0: 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65  e sent..**.** re
e7d0: 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e  gReturn is the n
e7e0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67  umber of the reg
e7f0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
e800: 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20  e subroutine.** 
e810: 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a  return address..
e820: 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76  **.** If regPrev
e830: 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  >0 then it is a 
e840: 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
e850: 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74  er in a vector t
e860: 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74  hat.** records t
e870: 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  he previous outp
e880: 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76  ut.  mem[regPrev
e890: 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74  ] is a flag that
e8a0: 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20   is false.** if 
e8b0: 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e  there has been n
e8c0: 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  o previous outpu
e8d0: 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30  t.  If regPrev>0
e8e0: 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a   then code is.**
e8f0: 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75   generated to su
e900: 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
e910: 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20  s.  pKeyInfo is 
e920: 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  used for compari
e930: 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a  ng.** keys..**.*
e940: 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66  * If the LIMIT f
e950: 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69  ound in p->iLimi
e960: 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75  t is reached, ju
e970: 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
e980: 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a  o.** iBreak..*/.
e990: 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72  static int gener
e9a0: 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
e9b0: 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ine(.  Parse *pP
e9c0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
e9d0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
e9e0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
e9f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
ea00: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
ea10: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65  tement */.  Sele
ea20: 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20  ctDest *pIn,    
ea30: 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65      /* Coroutine
ea40: 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20   supplying data 
ea50: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
ea60: 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pDest,      /* 
ea70: 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68  Where to send th
ea80: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
ea90: 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20  regReturn,      
eaa0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
eab0: 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
eac0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  er */.  int regP
ead0: 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  rev,            
eae0: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75  /* Previous resu
eaf0: 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f  lt register.  No
eb00: 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30   uniqueness if 0
eb10: 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
eb20: 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a  KeyInfo,      /*
eb30: 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77   For comparing w
eb40: 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74  ith previous ent
eb50: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79  ry */.  int p4ty
eb60: 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
eb70: 2f 2a 20 54 68 65 20 70 34 20 74 79 70 65 20 66  /* The p4 type f
eb80: 6f 72 20 70 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20  or pKeyInfo */. 
eb90: 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20   int iBreak     
eba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
ebb0: 20 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20   here if we hit 
ebc0: 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a  the LIMIT */.){.
ebd0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
ebe0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
ebf0: 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e   iContinue;.  in
ec00: 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20  t addr;..  addr 
ec10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
ec20: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
ec30: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
ec40: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
ec50: 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65  v);..  /* Suppre
ec60: 73 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f  ss duplicates fo
ec70: 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  r UNION, EXCEPT,
ec80: 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a   and INTERSECT .
ec90: 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72    */.  if( regPr
eca0: 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31  ev ){.    int j1
ecb0: 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73  , j2;.    j1 = s
ecc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
ecd0: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
ece0: 67 50 72 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d  gPrev);.    j2 =
ecf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ed00: 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
ed10: 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67  , pIn->iMem, reg
ed20: 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65  Prev+1, pIn->nMe
ed30: 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed50: 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
ed60: 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 20 20 73  , p4type);.    s
ed70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ed80: 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b  (v, OP_Jump, j2+
ed90: 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32  2, iContinue, j2
eda0: 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +2);.    sqlite3
edb0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
edc0: 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  j1);.    sqlite3
edd0: 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61  ExprCodeCopy(pPa
ede0: 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  rse, pIn->iMem, 
edf0: 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
ee00: 6e 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  nMem);.    sqlit
ee10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ee20: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
ee30: 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69  egPrev);.  }.  i
ee40: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
ee50: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
ee60: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75  turn 0;..  /* Su
ee70: 70 70 72 65 73 73 20 74 68 65 20 74 68 65 20 66  ppress the the f
ee80: 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72  irst OFFSET entr
ee90: 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20  ies if there is 
eea0: 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
eeb0: 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73  .  */.  codeOffs
eec0: 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
eed0: 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  ue);..  switch( 
eee0: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
eef0: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
ef00: 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
ef10: 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
ef20: 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
ef30: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
ef40: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
ef50: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
ef60: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
ef70: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
ef80: 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d  ;.      int r2 =
ef90: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
efa0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
efb0: 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73    testcase( pDes
efc0: 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54 61  t->eDest==SRT_Ta
efd0: 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ble );.      tes
efe0: 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44  tcase( pDest->eD
eff0: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
f000: 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b );.      sqlit
f010: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
f020: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
f030: 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e  In->iMem, pIn->n
f040: 4d 65 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Mem, r1);.      
f050: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f060: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
f070: 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
f080: 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
f090: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
f0a0: 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74  OP_Insert, pDest
f0b0: 2d 3e 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  ->iParm, r1, r2)
f0c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f0d0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
f0e0: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
f0f0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
f100: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
f110: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  e, r2);.      sq
f120: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
f130: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
f140: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f150: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
f160: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
f170: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
f180: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
f190: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
f1a0: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
f1b0: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
f1c0: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
f1d0: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
f1e0: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
f1f0: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
f200: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
f210: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
f220: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
f230: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
f240: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
f250: 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73  int r1;.      as
f260: 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d  sert( pIn->nMem=
f270: 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  =1 );.      p->a
f280: 66 66 69 6e 69 74 79 20 3d 20 0a 20 20 20 20 20  ffinity = .     
f290: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61      sqlite3Compa
f2a0: 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45  reAffinity(p->pE
f2b0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
f2c0: 2c 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74  , pDest->affinit
f2d0: 79 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  y);.      r1 = s
f2e0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
f2f0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
f300: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f310: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
f320: 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31  rd, pIn->iMem, 1
f330: 2c 20 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69  , r1, &p->affini
f340: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ty, 1);.      sq
f350: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
f360: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
f370: 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  rse, pIn->iMem, 
f380: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
f390: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f3a0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
f3b0: 73 74 2d 3e 69 50 61 72 6d 2c 20 72 31 29 3b 0a  st->iParm, r1);.
f3c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
f3d0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
f3e0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
f3f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
f400: 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63   0  /* Never occ
f410: 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20  urs on an ORDER 
f420: 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  BY query */.    
f430: 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
f440: 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
f450: 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
f460: 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
f470: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
f480: 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
f490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f4a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
f4b0: 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74  nteger, 1, pDest
f4c0: 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  ->iParm);.      
f4d0: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
f4e0: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
f4f0: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
f500: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
f510: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
f520: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
f530: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
f540: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
f550: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
f560: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
f570: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
f580: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
f590: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
f5a0: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
f5b0: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
f5c0: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
f5d0: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
f5e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f5f0: 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20  In->nMem==1 );. 
f600: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f610: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
f620: 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73   pIn->iMem, pDes
f630: 74 2d 3e 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  t->iParm, 1);.  
f640: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
f650: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
f660: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
f670: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
f680: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
f690: 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
f6a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
f6b0: 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
f6c0: 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
f6d0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
f6e0: 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
f6f0: 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
f700: 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 4d 65  ng at pDest->iMe
f710: 6d 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  m.  Then the co-
f720: 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
f730: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
f740: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
f750: 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
f760: 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20  ->iMem==0 ){.   
f770: 20 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d       pDest->iMem
f780: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
f790: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
f7a0: 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  In->nMem);.     
f7b0: 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d     pDest->nMem =
f7c0: 20 70 49 6e 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20   pIn->nMem;.    
f7d0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
f7e0: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
f7f0: 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  arse, pIn->iMem,
f800: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 70 44   pDest->iMem, pD
f810: 65 73 74 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  est->nMem);.    
f820: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f830: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
f840: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a   pDest->iParm);.
f850: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f860: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   }..    /* If no
f870: 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c  ne of the above,
f880: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
f890: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73   destination mus
f8a0: 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f  t be.    ** SRT_
f8b0: 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f  Output.  This ro
f8c0: 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
f8d0: 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f  alled with any o
f8e0: 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74  ther.    ** dest
f8f0: 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68  ination other th
f900: 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64  an the ones hand
f910: 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54  led above or SRT
f920: 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a  _Output..    **.
f930: 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f      ** For SRT_O
f940: 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61  utput, results a
f950: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
f960: 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
f970: 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54  ters.  .    ** T
f980: 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c  hen the OP_Resul
f990: 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75  tRow opcode is u
f9a0: 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c  sed to cause sql
f9b0: 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20  ite3_step() to. 
f9c0: 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65     ** return the
f9d0: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73   next row of res
f9e0: 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ult..    */.    
f9f0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
fa00: 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
fa10: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
fa20: 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t );.      sqlit
fa30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fa40: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49  OP_ResultRow, pI
fa50: 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d  n->iMem, pIn->nM
fa60: 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
fa70: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
fa80: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
fa90: 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e  , pIn->iMem, pIn
faa0: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62  ->nMem);.      b
fab0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
fac0: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
fad0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
fae0: 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
faf0: 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
fb00: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
fb10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
fb20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
fb30: 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74  ddImm, p->iLimit
fb40: 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
fb50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fb60: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
fb70: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  imit, iBreak);. 
fb80: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
fb90: 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  e the subroutine
fba0: 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
fbb0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
fbc0: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69  eLabel(v, iConti
fbd0: 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nue);.  sqlite3V
fbe0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
fbf0: 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72  Return, regRetur
fc00: 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64  n);..  return ad
fc10: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74  dr;.}../*.** Alt
fc20: 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e  ernative compoun
fc30: 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65  d select code ge
fc40: 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65  nerator for case
fc50: 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  s when there.** 
fc60: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
fc70: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  lause..**.** We 
fc80: 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f  assume a query o
fc90: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
fca0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
fcb0: 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65   <selectA>  <ope
fcc0: 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42  rator>  <selectB
fcd0: 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64  >  ORDER BY <ord
fce0: 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20  erbylist>.**.** 
fcf0: 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e  <operator> is on
fd00: 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  e of UNION ALL, 
fd10: 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
fd20: 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68  r INTERSECT.  Th
fd30: 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20  e idea.** is to 
fd40: 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63  code both <selec
fd50: 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42  tA> and <selectB
fd60: 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  > with the ORDER
fd70: 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a   BY clause as.**
fd80: 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54   co-routines.  T
fd90: 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72  hen run the co-r
fda0: 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c  outines in paral
fdb0: 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68  lel and merge th
fdc0: 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
fdd0: 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49  o the output.  I
fde0: 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
fdf0: 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
fe00: 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41   (called selectA
fe10: 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29   and.** selectB)
fe20: 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62   there are 7 sub
fe30: 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20  routines:.**.** 
fe40: 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65     outA:    Move
fe50: 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
fe60: 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75  he selectA corou
fe70: 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
fe80: 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
fe90: 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
fea0: 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  und query..**.**
feb0: 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76      outB:    Mov
fec0: 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
fed0: 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f  the selectB coro
fee0: 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
fef0: 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
ff00: 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
ff10: 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e  ound query.  (On
ff20: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  ly generated for
ff30: 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20   UNION and.**   
ff40: 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
ff50: 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64  ALL.  EXCEPT and
ff60: 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65   INSERTSECT neve
ff70: 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74  r output a row t
ff80: 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
ff90: 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20     appears only 
ffa0: 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  in B.).**.**    
ffb0: 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AltB:    Called 
ffc0: 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
ffd0: 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
ffe0: 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e  outines and A<B.
fff0: 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  .**.**    AeqB: 
10000 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
10010 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
10020 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
10030 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a  s and A==B..**.*
10040 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61  *    AgtB:    Ca
10050 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
10060 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
10070 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
10080 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45   A>B..**.**    E
10090 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofA:    Called w
100a0 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
100b0 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
100c0 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  tA..**.**    Eof
100d0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
100e0 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
100f0 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42  ted from selectB
10100 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
10110 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
10120 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75  e latter five su
10130 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64  broutines depend
10140 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f   on which .** <o
10150 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64  perator> is used
10160 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  :.**.**.**      
10170 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
10180 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20           UNION  
10190 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54            EXCEPT
101a0 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53            INTERS
101b0 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
101c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
101d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101e0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
101f0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
10200 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20  ---.**   AltB:  
10210 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
10220 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
10230 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
10240 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a          nextA.**
10250 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75  .**   AeqB:   ou
10260 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
10270 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
10280 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
10290 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a    outA, nextA.**
102a0 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75  .**   AgtB:   ou
102b0 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
102c0 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
102d0 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20      nextB       
102e0 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a       nextB.**.**
102f0 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c     EofA:   outB,
10300 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
10310 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
10320 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20   halt           
10330 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45    halt.**.**   E
10340 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ofB:   outA, nex
10350 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
10360 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
10370 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61  nextA         ha
10380 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  lt.**.** In the 
10390 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20  AltB, AeqB, and 
103a0 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73  AgtB subroutines
103b0 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f  , an EOF on A fo
103c0 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a  llowing nextA.**
103d0 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64   causes an immed
103e0 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
103f0 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20  A and an EOF on 
10400 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  B following next
10410 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69  B causes.** an i
10420 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
10430 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45   EofB.  Within E
10440 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e  ofA and EofB, an
10450 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f  d EOF on entry o
10460 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  r.** following n
10470 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75  extX causes a ju
10480 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
10490 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63   the select proc
104a0 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75  essing..**.** Du
104b0 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
104c0 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58  in the UNION, EX
104d0 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
104e0 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e  ECT cases is han
104f0 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  dled.** within t
10500 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
10510 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72  tine.  The regPr
10520 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20  ev register set 
10530 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f  holds the previo
10540 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76  usly.** output v
10550 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69  alue.  A compari
10560 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69  son is made agai
10570 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61  nst this value a
10580 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
10590 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
105a0 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20  he next results 
105b0 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  would be the sam
105c0 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  e as the previou
105d0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  s..**.** The imp
105e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e  lementation plan
105f0 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74   is to implement
10600 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
10610 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a  nes and seven.**
10620 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72   subroutines fir
10630 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65  st, then put the
10640 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61   control logic a
10650 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c  t the bottom.  L
10660 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
10670 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e           goto In
10680 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63  it.**     coA: c
10690 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
106a0 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20  t query (A).**  
106b0 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e     coB: coroutin
106c0 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72  e for right quer
106d0 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41  y (B).**    outA
106e0 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
106f0 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42   of A.**    outB
10700 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
10710 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64   of B (UNION and
10720 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29   UNION ALL only)
10730 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e  .**    EofA: ...
10740 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e  .**    EofB: ...
10750 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e  .**    AltB: ...
10760 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e  .**    AeqB: ...
10770 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e  .**    AgtB: ...
10780 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69  .**    Init: ini
10790 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e  tialize coroutin
107a0 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20  e registers.**  
107b0 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
107c0 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  A.**          if
107d0 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66   eof(A) goto Eof
107e0 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  A.**          yi
107f0 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20  eld coB.**      
10800 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f      if eof(B) go
10810 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d  to EofB.**    Cm
10820 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42  pr: Compare A, B
10830 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d  .**          Jum
10840 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  p AltB, AeqB, Ag
10850 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e  tB.**     End: .
10860 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c  ...**.** We call
10870 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
10880 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66  B, EofA, and Eof
10890 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20  B "subroutines" 
108a0 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74  but they are not
108b0 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c  .** actually cal
108c0 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20  led using Gosub 
108d0 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  and they do not 
108e0 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e  Return.  EofA an
108f0 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75  d EofB loop.** u
10900 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73  ntil all data is
10910 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20   exhausted then 
10920 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64  jump to the "end
10930 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41  " labe.  AltB, A
10940 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42  eqB,.** and AgtB
10950 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20   jump to either 
10960 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20  L2 or to one of 
10970 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f  EofA or EofB..*/
10980 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10990 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
109a0 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20  LECT.static int 
109b0 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
109c0 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
109d0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
109e0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
109f0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
10a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10a10 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
10a20 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
10a30 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
10a40 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
10a50 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
10a60 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
10a70 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a90 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
10aa0 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
10ab0 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
10ac0 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
10ad0 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
10ae0 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b00 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
10b10 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
10b20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
10b30 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  A;     /* Destin
10b40 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
10b50 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63  ine A */.  Selec
10b60 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20  tDest destB;    
10b70 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
10b80 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20  for coroutine B 
10b90 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
10ba0 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
10bb0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
10bc0 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  or select-A coro
10bd0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
10be0 65 67 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20  egEofA;         
10bf0 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69   /* Flag to indi
10c00 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74  cate when select
10c10 2d 41 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a  -A is complete *
10c20 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42  /.  int regAddrB
10c30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
10c40 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
10c50 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  r select-B corou
10c60 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
10c70 67 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 20  gEofB;          
10c80 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63  /* Flag to indic
10c90 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d  ate when select-
10ca0 42 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f  B is complete */
10cb0 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
10cc0 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tA;      /* Addr
10cd0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
10ce0 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
10cf0 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
10d00 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tB;      /* Addr
10d10 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
10d20 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
10d30 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20  .  int regOutA; 
10d40 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
10d50 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
10d60 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
10d70 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
10d80 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20  t regOutB;      
10d90 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
10da0 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
10db0 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
10dc0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
10dd0 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f  rOutA;         /
10de0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
10df0 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
10e00 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
10e10 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20  drOutB = 0;     
10e20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
10e30 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
10e40 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
10e50 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20  ddrEofA;        
10e60 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
10e70 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61  he select-A-exha
10e80 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
10e90 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
10ea0 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fB;         /* A
10eb0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
10ec0 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64  lect-B-exhausted
10ed0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
10ee0 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20   int addrAltB;  
10ef0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
10f00 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62  s of the A<B sub
10f10 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10f20 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20 20   addrAeqB;      
10f30 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
10f40 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75   the A==B subrou
10f50 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
10f60 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20 20  drAgtB;         
10f70 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
10f80 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65  e A>B subroutine
10f90 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
10fa0 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itA;        /* L
10fb0 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
10fc0 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
10fd0 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20  int regLimitB;  
10fe0 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
10ff0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
11000 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
11010 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  gPrev;          
11020 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65  /* A range of re
11030 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20  gisters to hold 
11040 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20  previous output 
11050 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69  */.  int savedLi
11060 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61  mit;       /* Sa
11070 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
11080 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  iLimit */.  int 
11090 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20  savedOffset;    
110a0 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
110b0 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a   of p->iOffset *
110c0 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70  /.  int labelCmp
110d0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  r;        /* Lab
110e0 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  el for the start
110f0 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c   of the merge al
11100 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74  gorithm */.  int
11110 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20   labelEnd;      
11120 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
11130 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
11140 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74  verall SELECT st
11150 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20  mt */.  int j1; 
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11170 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   Jump instructio
11180 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74 61  ns that get reta
11190 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74  rgetted */.  int
111a0 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
111b0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f     /* One of TK_
111c0 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  ALL, TK_UNION, T
111d0 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54  K_EXCEPT, TK_INT
111e0 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49  ERSECT */.  KeyI
111f0 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30  nfo *pKeyDup = 0
11200 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20  ; /* Comparison 
11210 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
11220 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  duplicate remova
11230 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  l */.  KeyInfo *
11240 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20  pKeyMerge;   /* 
11250 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72  Comparison infor
11260 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69  mation for mergi
11270 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c  ng rows */.  sql
11280 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
11290 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
112a0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
112b0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
112c0 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y;   /* The ORDE
112d0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
112e0 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20   int nOrderBy;  
112f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11300 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
11310 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
11320 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d   */.  int *aPerm
11330 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  ute;        /* M
11340 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45  apping from ORDE
11350 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65  R BY terms to re
11360 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73  sult set columns
11370 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
11380 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ->pOrderBy!=0 );
11390 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 44  .  assert( pKeyD
113a0 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e  up==0 ); /* "Man
113b0 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73  aged" code needs
113c0 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23   this.  Ticket #
113d0 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20  3382. */.  db = 
113e0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20  pParse->db;.  v 
113f0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
11400 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
11410 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65  );       /* Alre
11420 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65  ady thrown the e
11430 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c  rror if VDBE all
11440 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c  oc failed */.  l
11450 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65  abelEnd = sqlite
11460 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
11470 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d  );.  labelCmpr =
11480 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
11490 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a  Label(v);...  /*
114a0 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f 52   Patch up the OR
114b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
114c0 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b  */.  op = p->op;
114d0 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d    .  pPrior = p-
114e0 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72  >pPrior;.  asser
114f0 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  t( pPrior->pOrde
11500 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64  rBy==0 );.  pOrd
11510 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
11520 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  By;.  assert( pO
11530 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64  rderBy );.  nOrd
11540 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
11550 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f  >nExpr;..  /* Fo
11560 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65  r operators othe
11570 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c  r than UNION ALL
11580 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65   we have to make
11590 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20   sure that.  ** 
115a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
115b0 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72 79  use covers every
115c0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73   term of the res
115d0 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20  ult set.  Add.  
115e0 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  ** terms to the 
115f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11600 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
11610 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f  */.  if( op!=TK_
11620 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ALL ){.    for(i
11630 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  =1; db->mallocFa
11640 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d  iled==0 && i<=p-
11650 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
11660 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
11670 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
11680 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66   *pItem;.      f
11690 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f  or(j=0, pItem=pO
116a0 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72  rderBy->a; j<nOr
116b0 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65  derBy; j++, pIte
116c0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  m++){.        as
116d0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 43 6f  sert( pItem->iCo
116e0 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
116f0 66 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3d 3d  f( pItem->iCol==
11700 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
11710 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
11720 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
11730 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
11740 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
11750 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b   TK_INTEGER, 0);
11760 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
11770 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
11780 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
11790 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
117a0 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
117b0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
117c0 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20  iValue = i;.    
117d0 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73      pOrderBy = s
117e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
117f0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72  pend(pParse, pOr
11800 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20  derBy, pNew);.  
11810 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
11820 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 69 43  a[nOrderBy++].iC
11830 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20  ol = (u16)i;.   
11840 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
11850 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
11860 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d   comparison perm
11870 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69  utation and keyi
11880 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64  nfo that is used
11890 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70   with.  ** the p
118a0 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20  ermutation used 
118b0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
118c0 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f  the next.  ** ro
118d0 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d  w of results com
118e0 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20  es from selectA 
118f0 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73  or selectB.  Als
11900 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20  o add explicit. 
11910 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74   ** collations t
11920 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
11930 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74  lause terms so t
11940 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62  hat when the sub
11950 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20  queries.  ** to 
11960 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68  the right and th
11970 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75  e left are evalu
11980 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74  ated, they use t
11990 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20  he correct.  ** 
119a0 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  collation..  */.
119b0 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c    aPermute = sql
119c0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
119d0 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  db, sizeof(int)*
119e0 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28  nOrderBy);.  if(
119f0 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20   aPermute ){.   
11a00 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
11a10 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
11a20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
11a30 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c  =pOrderBy->a; i<
11a40 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70  nOrderBy; i++, p
11a50 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61  Item++){.      a
11a60 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 43  ssert( pItem->iC
11a70 6f 6c 3e 30 20 20 26 26 20 70 49 74 65 6d 2d 3e  ol>0  && pItem->
11a80 69 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  iCol<=p->pEList-
11a90 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
11aa0 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49  aPermute[i] = pI
11ab0 74 65 6d 2d 3e 69 43 6f 6c 20 2d 20 31 3b 0a 20  tem->iCol - 1;. 
11ac0 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72     }.    pKeyMer
11ad0 67 65 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  ge =.      sqlit
11ae0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
11af0 2c 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 4d 65  , sizeof(*pKeyMe
11b00 72 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a 28 73  rge)+nOrderBy*(s
11b10 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
11b20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  1));.    if( pKe
11b30 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20  yMerge ){.      
11b40 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74  pKeyMerge->aSort
11b50 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b  Order = (u8*)&pK
11b60 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 6e  eyMerge->aColl[n
11b70 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 20 20  OrderBy];.      
11b80 70 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69 65 6c  pKeyMerge->nFiel
11b90 64 20 3d 20 28 75 31 36 29 6e 4f 72 64 65 72 42  d = (u16)nOrderB
11ba0 79 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72  y;.      pKeyMer
11bb0 67 65 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  ge->enc = ENC(db
11bc0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
11bd0 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
11be0 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
11bf0 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
11c00 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20      Expr *pTerm 
11c10 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
11c20 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
11c30 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
11c40 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
11c50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
11c60 6f 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 43 6f  oll = pTerm->pCo
11c70 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ll;.        }els
11c80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  e{.          pCo
11c90 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
11ca0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
11cb0 70 2c 20 61 50 65 72 6d 75 74 65 5b 69 5d 29 3b  p, aPermute[i]);
11cc0 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d  .          pTerm
11cd0 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78  ->flags |= EP_Ex
11ce0 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20  pCollate;.      
11cf0 20 20 20 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c      pTerm->pColl
11d00 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
11d10 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4b 65 79    }.        pKey
11d20 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  Merge->aColl[i] 
11d30 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  = pColl;.       
11d40 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72   pKeyMerge->aSor
11d50 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64  tOrder[i] = pOrd
11d60 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
11d70 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rder;.      }.  
11d80 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
11d90 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a   pKeyMerge = 0;.
11da0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61    }..  /* Reatta
11db0 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ch the ORDER BY 
11dc0 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71 75  clause to the qu
11dd0 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ery..  */.  p->p
11de0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
11df0 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f  By;.  pPrior->pO
11e00 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
11e10 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72  ExprListDup(pPar
11e20 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79  se->db, pOrderBy
11e30 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  , 0);..  /* Allo
11e40 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20  cate a range of 
11e50 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
11e60 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49  ers and the KeyI
11e70 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20  nfo needed.  ** 
11e80 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68  for the logic th
11e90 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69  at removes dupli
11ea0 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73  cate result rows
11eb0 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f   when the.  ** o
11ec0 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
11ed0 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
11ee0 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20  ERSECT (but not 
11ef0 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f  UNION ALL)..  */
11f00 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
11f10 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76  L ){.    regPrev
11f20 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
11f30 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
11f40 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
11f50 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72  .    assert( nOr
11f60 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20  derBy>=nExpr || 
11f70 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11f80 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20   );.    regPrev 
11f90 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
11fa0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45  Range(pParse, nE
11fb0 78 70 72 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  xpr+1);.    sqli
11fc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11fd0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
11fe0 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b  regPrev);.    pK
11ff0 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33 44  eyDup = sqlite3D
12000 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a  bMallocZero(db,.
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 44 75    sizeof(*pKeyDu
12030 70 29 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65  p) + nExpr*(size
12040 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20  of(CollSeq*)+1) 
12050 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44  );.    if( pKeyD
12060 75 70 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79  up ){.      pKey
12070 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  Dup->aSortOrder 
12080 3d 20 28 75 38 2a 29 26 70 4b 65 79 44 75 70 2d  = (u8*)&pKeyDup-
12090 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20  >aColl[nExpr];. 
120a0 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 6e 46       pKeyDup->nF
120b0 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 45 78 70  ield = (u16)nExp
120c0 72 3b 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70  r;.      pKeyDup
120d0 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
120e0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
120f0 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  i<nExpr; i++){. 
12100 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
12110 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69  aColl[i] = multi
12120 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
12130 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
12140 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53       pKeyDup->aS
12150 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b  ortOrder[i] = 0;
12160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12170 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61   }. .  /* Separa
12180 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  te the left and 
12190 74 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20  the right query 
121a0 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72  from one another
121b0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f  .  */.  p->pPrio
121c0 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d  r = 0;.  pPrior-
121d0 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b  >pRightmost = 0;
121e0 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
121f0 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
12200 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
12210 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
12220 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50    if( pPrior->pP
12230 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rior==0 ){.    s
12240 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
12250 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
12260 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72  , pPrior, pPrior
12270 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
12280 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ER");.  }..  /* 
12290 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69  Compute the limi
122a0 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  t registers */. 
122b0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
122c0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
122d0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69  , labelEnd);.  i
122e0 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20  f( p->iLimit && 
122f0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
12300 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b    regLimitA = ++
12310 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12320 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b    regLimitB = ++
12330 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12340 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12350 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
12360 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e  p->iOffset ? p->
12370 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69  iOffset+1 : p->i
12380 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20  Limit,.         
12390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123a0 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69           regLimi
123b0 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
123c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
123d0 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41  _Copy, regLimitA
123e0 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20  , regLimitB);.  
123f0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69  }else{.    regLi
12400 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42  mitA = regLimitB
12410 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
12420 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
12430 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
12440 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
12450 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
12460 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  te(db, p->pOffse
12470 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74  t);.  p->pOffset
12480 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72   = 0;..  regAddr
12490 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
124a0 65 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d 20  em;.  regEofA = 
124b0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
124c0 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70    regAddrB = ++p
124d0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
124e0 65 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72 73  egEofB = ++pPars
124f0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
12500 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
12510 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d  Mem;.  regOutB =
12520 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
12530 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
12540 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c  DestInit(&destA,
12550 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
12560 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
12570 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
12580 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43  it(&destB, SRT_C
12590 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
125a0 72 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  rB);..  /* Jump 
125b0 70 61 73 74 20 74 68 65 20 76 61 72 69 6f 75 73  past the various
125c0 20 73 75 62 72 6f 75 74 69 6e 65 73 20 61 6e 64   subroutines and
125d0 20 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20 74   coroutines to t
125e0 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65 72  he main.  ** mer
125f0 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a  ge loop.  */.  j
12600 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
12610 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
12620 29 3b 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41  );.  addrSelectA
12630 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
12640 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 0a  rrentAddr(v);...
12650 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
12660 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
12670 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
12680 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
12690 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74  e.  ** left of t
126a0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72  he compound oper
126b0 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73  ator - the "A" s
126c0 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64  elect..  */.  Vd
126d0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
126e0 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69  , "Begin corouti
126f0 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45  ne for left SELE
12700 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d  CT"));.  pPrior-
12710 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
12720 69 74 41 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  itA;.  sqlite3Se
12730 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
12740 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20  ior, &destA);.  
12750 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12760 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
12770 20 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20   1, regEofA);.  
12780 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12790 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
127a0 65 67 41 64 64 72 41 29 3b 0a 20 20 56 64 62 65  egAddrA);.  Vdbe
127b0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
127c0 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66  "End coroutine f
127d0 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29  or left SELECT")
127e0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
127f0 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
12800 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
12810 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
12820 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68  n .  ** the righ
12830 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65  t - the "B" sele
12840 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  ct.  */.  addrSe
12850 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56  lectB = sqlite3V
12860 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
12870 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  );.  VdbeNoopCom
12880 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
12890 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
128a0 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  ght SELECT"));. 
128b0 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d   savedLimit = p-
128c0 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64  >iLimit;.  saved
128d0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
128e0 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  set;.  p->iLimit
128f0 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20   = regLimitB;.  
12900 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20  p->iOffset = 0; 
12910 20 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63   .  sqlite3Selec
12920 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
12930 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  stB);.  p->iLimi
12940 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a  t = savedLimit;.
12950 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73    p->iOffset = s
12960 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71  avedOffset;.  sq
12970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12980 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
12990 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71  , regEofB);.  sq
129a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
129b0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
129c0 41 64 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f  AddrB);.  VdbeNo
129d0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  opComment((v, "E
129e0 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  nd coroutine for
129f0 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29   right SELECT"))
12a00 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
12a10 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
12a20 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
12a30 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
12a40 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e A.  ** select 
12a50 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
12a60 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
12a70 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
12a80 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
12a90 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
12aa0 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22  t routine for A"
12ab0 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d  ));.  addrOutA =
12ac0 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
12ad0 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
12ae0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12af0 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44     p, &destA, pD
12b00 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20  est, regOutA,.  
12b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
12b20 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
12b30 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
12b40 4f 46 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  OFF, labelEnd);.
12b50 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    .  /* Generate
12b60 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
12b70 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
12b80 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
12b90 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e B.  ** select 
12ba0 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
12bb0 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
12bc0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
12bd0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
12be0 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
12bf0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  NION ){.    Vdbe
12c00 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
12c10 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
12c20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64  for B"));.    ad
12c30 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74  drOutB = generat
12c40 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
12c50 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
12c60 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
12c70 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67  estB, pDest, reg
12c80 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20  OutB,.          
12c90 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
12ca0 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49  pKeyDup, P4_KEYI
12cb0 4e 46 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62 65  NFO_STATIC, labe
12cc0 6c 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lEnd);.  }..  /*
12cd0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
12ce0 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
12cf0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
12d00 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a  rom select A.  *
12d10 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
12d20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
12d30 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e   select B remain
12d40 73 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  s..  */.  VdbeNo
12d50 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
12d60 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22  of-A subroutine"
12d70 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  ));.  if( op==TK
12d80 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
12d90 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
12da0 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
12db0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12dc0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
12dd0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73  abelEnd);.  }els
12de0 65 7b 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66  e{  .    addrEof
12df0 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  A = sqlite3VdbeA
12e00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
12e10 72 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e  regEofB, labelEn
12e20 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
12e30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12e40 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
12e50 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73  addrOutB);.    s
12e60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12e70 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
12e80 67 41 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c  gAddrB);.    sql
12e90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12ea0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
12eb0 64 72 45 6f 66 41 29 3b 0a 20 20 7d 0a 0a 20 20  drEofA);.  }..  
12ec0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
12ed0 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
12ee0 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
12ef0 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20   from select B. 
12f00 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
12f10 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
12f20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61  in select A rema
12f30 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
12f40 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
12f50 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42   ){.    addrEofB
12f60 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 7d   = addrEofA;.  }
12f70 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
12f80 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
12f90 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e  "eof-B subroutin
12fa0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
12fb0 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fB = sqlite3Vdbe
12fc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
12fd0 20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45   regEofA, labelE
12fe0 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nd);.    sqlite3
12ff0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13000 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
13010 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20   addrOutA);.    
13020 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13030 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
13040 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71  egAddrA);.    sq
13050 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13060 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
13070 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20  ddrEofB);.  }.. 
13080 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
13090 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
130a0 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f  case of A<B.  */
130b0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
130c0 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73  nt((v, "A-lt-B s
130d0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
130e0 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74  addrAltB = sqlit
130f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13100 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
13110 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
13120 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13130 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
13140 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
13150 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13160 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c   OP_If, regEofA,
13170 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71   addrEofA);.  sq
13180 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13190 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
131a0 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
131b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
131c0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
131d0 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20  e of A==B.  */. 
131e0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
131f0 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
13200 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65  = addrAltB;.  }e
13210 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
13220 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
13230 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
13240 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74  ltB;.    addrAlt
13250 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  B++;.  }else{.  
13260 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
13270 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75  t((v, "A-eq-B su
13280 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
13290 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20   addrAeqB =.    
132a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
132b0 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
132c0 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71  egAddrA);.    sq
132d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
132e0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
132f0 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  A, addrEofA);.  
13300 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13310 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
13320 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  0, labelCmpr);. 
13330 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
13340 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
13350 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42   the case of A>B
13360 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
13370 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67  Comment((v, "A-g
13380 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
13390 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20  );.  addrAgtB = 
133a0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
133b0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
133c0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
133d0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
133e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
133f0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
13400 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
13410 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  utB);.  }.  sqli
13420 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13430 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
13440 64 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  drB);.  sqlite3V
13450 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13460 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64  If, regEofB, add
13470 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65  rEofB);.  sqlite
13480 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13490 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
134a0 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  Cmpr);..  /* Thi
134b0 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65  s code runs once
134c0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65   to initialize e
134d0 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a  verything..  */.
134e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
134f0 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
13500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13510 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
13520 20 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20   0, regEofA);.  
13530 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13540 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
13550 20 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20   0, regEofB);.  
13560 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13570 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
13580 65 67 41 64 64 72 41 2c 20 61 64 64 72 53 65 6c  egAddrA, addrSel
13590 65 63 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ectA);.  sqlite3
135a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
135b0 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 42  _Gosub, regAddrB
135c0 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a  , addrSelectB);.
135d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
135e0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
135f0 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29  gEofA, addrEofA)
13600 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13610 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
13620 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66  regEofB, addrEof
13630 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d  B);..  /* Implem
13640 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72  ent the main mer
13650 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  ge loop.  */.  s
13660 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
13670 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43  eLabel(v, labelC
13680 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  mpr);.  sqlite3V
13690 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
136a0 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20  Permutation, 0, 
136b0 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65  0, 0, (char*)aPe
136c0 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52  rmute, P4_INTARR
136d0 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  AY);.  sqlite3Vd
136e0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
136f0 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 4d  ompare, destA.iM
13700 65 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c 20  em, destB.iMem, 
13710 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  nOrderBy,.      
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13730 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65     (char*)pKeyMe
13740 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  rge, P4_KEYINFO_
13750 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69  HANDOFF);.  sqli
13760 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
13770 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c   OP_Jump, addrAl
13780 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64  tB, addrAeqB, ad
13790 64 72 41 67 74 42 29 3b 0a 0a 20 20 2f 2a 20 52  drAgtB);..  /* R
137a0 65 6c 65 61 73 65 20 74 65 6d 70 6f 72 61 72 79  elease temporary
137b0 20 72 65 67 69 73 74 65 72 73 0a 20 20 2a 2f 0a   registers.  */.
137c0 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
137d0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
137e0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
137f0 72 73 65 2c 20 72 65 67 50 72 65 76 2c 20 6e 4f  rse, regPrev, nO
13800 72 64 65 72 42 79 2b 31 29 3b 0a 20 20 7d 0a 0a  rderBy+1);.  }..
13810 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
13820 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f   this point in o
13830 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74  rder to terminat
13840 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  e the query..  *
13850 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
13860 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
13870 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  abelEnd);..  /* 
13880 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
13890 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  f output columns
138a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
138b0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
138c0 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65  tput ){.    Sele
138d0 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72  ct *pFirst = pPr
138e0 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ior;.    while( 
138f0 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
13900 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
13910 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65  ->pPrior;.    ge
13920 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
13930 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
13940 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
13950 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62  }..  /* Reassemb
13960 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ly the compound 
13970 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74  query so that it
13980 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63   will be freed c
13990 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79  orrectly.  ** by
139a0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
139b0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ction */.  if( p
139c0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
139d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
139e0 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ete(db, p->pPrio
139f0 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72  r);.  }.  p->pPr
13a00 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20  ior = pPrior;.. 
13a10 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65   /*** TBD:  Inse
13a20 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61  rt subroutine ca
13a30 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72  lls to close cur
13a40 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65  sors on incomple
13a50 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65  te.  **** subque
13a60 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 72 65 74  ries ****/.  ret
13a70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13a80 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
13a90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13aa0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
13ab0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13ac0 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72  MIT_VIEW)./* For
13ad0 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e  ward Declaration
13ae0 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
13af0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 73   substExprList(s
13b00 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73  qlite3*, ExprLis
13b10 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73  t*, int, ExprLis
13b20 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  t*);.static void
13b30 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c   substSelect(sql
13b40 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c  ite3*, Select *,
13b50 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a   int, ExprList *
13b60 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  );../*.** Scan t
13b70 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
13b80 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
13b90 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
13ba0 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
13bb0 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
13bc0 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
13bd0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
13be0 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
13bf0 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
13c00 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
13c10 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
13c20 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
13c30 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
13c40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
13c50 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
13c60 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
13c70 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
13c80 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
13c90 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
13ca0 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
13cb0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
13cc0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
13cd0 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
13ce0 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
13cf0 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
13d00 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
13d10 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
13d20 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
13d30 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73  e make the neces
13d40 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
13d50 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
13d60 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
13d70 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
13d80 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
13d90 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
13da0 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
13db0 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
13dc0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  y..*/.static Exp
13dd0 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20  r *substExpr(.  
13de0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
13df0 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
13e00 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74  lloc errors to t
13e10 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  his connection *
13e20 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
13e30 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20          /* Expr 
13e40 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74  in which substit
13e50 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a  ution occurs */.
13e60 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
13e70 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
13e80 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
13e90 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
13ea0 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62  pEList    /* Sub
13eb0 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69  stitute expressi
13ec0 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ons */.){.  if( 
13ed0 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
13ee0 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
13ef0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
13f00 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
13f10 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ==iTable ){.    
13f20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
13f30 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45  mn<0 ){.      pE
13f40 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
13f50 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
13f60 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a      Expr *pNew;.
13f70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
13f80 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72  List!=0 && pExpr
13f90 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74  ->iColumn<pEList
13fa0 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
13fb0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
13fc0 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
13fd0 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
13fe0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
13ff0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
14000 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d  pEList->a[pExpr-
14010 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c  >iColumn].pExpr,
14020 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
14030 4e 65 77 20 26 26 20 70 45 78 70 72 2d 3e 70 43  New && pExpr->pC
14040 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
14050 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 45 78  New->pColl = pEx
14060 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  pr->pColl;.     
14070 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
14080 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
14090 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 45 78  Expr);.      pEx
140a0 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  pr = pNew;.    }
140b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45  .  }else{.    pE
140c0 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62  xpr->pLeft = sub
140d0 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72  stExpr(db, pExpr
140e0 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c  ->pLeft, iTable,
140f0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 45   pEList);.    pE
14100 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75  xpr->pRight = su
14110 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70  bstExpr(db, pExp
14120 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c  r->pRight, iTabl
14130 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
14140 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
14150 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
14160 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
14170 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62    substSelect(db
14180 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
14190 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ct, iTable, pELi
141a0 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
141b0 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
141c0 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78  ist(db, pExpr->x
141d0 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20  .pList, iTable, 
141e0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
141f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
14200 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  r;.}.static void
14210 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a   substExprList(.
14220 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
14230 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
14240 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68   malloc errors h
14250 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ere */.  ExprLis
14260 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
14270 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e   List to scan an
14280 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  d in which to ma
14290 6b 65 20 73 75 62 73 74 69 74 75 74 65 73 20 2a  ke substitutes *
142a0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
142b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
142c0 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
142d0 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
142e0 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a  t *pEList     /*
142f0 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75   Substitute valu
14300 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  es */.){.  int i
14310 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
14320 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
14330 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
14340 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
14350 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
14360 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  r = substExpr(db
14370 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
14380 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  xpr, iTable, pEL
14390 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  ist);.  }.}.stat
143a0 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
143b0 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
143c0 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
143d0 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
143e0 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65  ors here */.  Se
143f0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
14400 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
14410 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20  tement in which 
14420 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
14430 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tions */.  int i
14440 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
14450 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72  /* Table to be r
14460 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70  eplaced */.  Exp
14470 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
14480 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
14490 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53  values */.){.  S
144a0 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
144b0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
144c0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
144d0 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20  t i;.  if( !p ) 
144e0 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45  return;.  substE
144f0 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
14500 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  EList, iTable, p
14510 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
14520 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
14530 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c  GroupBy, iTable,
14540 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
14550 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
14560 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c  >pOrderBy, iTabl
14570 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d  e, pEList);.  p-
14580 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74  >pHaving = subst
14590 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76  Expr(db, p->pHav
145a0 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ing, iTable, pEL
145b0 69 73 74 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72  ist);.  p->pWher
145c0 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  e = substExpr(db
145d0 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61  , p->pWhere, iTa
145e0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
145f0 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
14600 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c  p->pPrior, iTabl
14610 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 53  e, pEList);.  pS
14620 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
14630 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 20  assert( pSrc ); 
14640 20 2f 2a 20 45 76 65 6e 20 66 6f 72 20 28 53 45   /* Even for (SE
14650 4c 45 43 54 20 31 29 20 77 65 20 68 61 76 65 3a  LECT 1) we have:
14660 20 70 53 72 63 21 3d 30 20 62 75 74 20 70 53 72   pSrc!=0 but pSr
14670 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20  c->nSrc==0 */.  
14680 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 29  if( ALWAYS(pSrc)
14690 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53   ){.    for(i=pS
146a0 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d  rc->nSrc, pItem=
146b0 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  pSrc->a; i>0; i-
146c0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
146d0 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64     substSelect(d
146e0 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  b, pItem->pSelec
146f0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
14700 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
14710 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
14720 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
14730 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
14740 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14750 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21  _VIEW) */..#if !
14760 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14770 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
14780 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14790 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a  _OMIT_VIEW)./*.*
147a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
147b0 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
147c0 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  en subqueries in
147d0 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a   order to speed.
147e0 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49  ** execution.  I
147f0 74 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  t returns 1 if i
14800 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
14810 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
14820 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73  tening.** occurs
14830 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72  ..**.** To under
14840 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70  stand the concep
14850 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c  t of flattening,
14860 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
14870 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79  llowing.** query
14880 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
14890 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT a FROM (SELEC
148a0 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
148b0 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20  t1 WHERE z<100) 
148c0 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  WHERE a>5.**.** 
148d0 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20  The default way 
148e0 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
148f0 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f  this query is to
14900 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20   execute the.** 
14910 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61  subquery first a
14920 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
14930 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72  ults in a tempor
14940 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a  ary table, then.
14950 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72  ** run the outer
14960 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74   query on that t
14970 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
14980 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74   This requires t
14990 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65  wo.** passes ove
149a0 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72  r the data.  Fur
149b0 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73  thermore, becaus
149c0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
149d0 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20  table.** has no 
149e0 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45  indices, the WHE
149f0 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  RE clause on the
14a00 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
14a10 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69  not be.** optimi
14a20 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  zed..**.** This 
14a30 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
14a40 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72   to rewrite quer
14a50 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20  ies such as the 
14a60 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20  above into.** a 
14a70 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65  single flat sele
14a80 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ct, like this:.*
14a90 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
14aa0 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
14ab0 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44   WHERE z<100 AND
14ac0 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   a>5.**.** The c
14ad0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f  ode generated fo
14ae0 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61  r this simpifica
14af0 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73  tion gives the s
14b00 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75  ame result.** bu
14b10 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63  t only has to sc
14b20 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65  an the data once
14b30 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69  .  And because i
14b40 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a  ndices might .**
14b50 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61   exist on the ta
14b60 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65  ble t1, a comple
14b70 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64  te scan of the d
14b80 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ata might be.** 
14b90 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  avoided..**.** F
14ba0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c  lattening is onl
14bb0 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61  y attempted if a
14bc0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
14bd0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
14be0 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73  .**   (1)  The s
14bf0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
14c00 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
14c10 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72  ot both use aggr
14c20 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  egates..**.**   
14c30 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (2)  The subquer
14c40 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
14c50 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74  egate or the out
14c60 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
14c70 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
14c80 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (3)  The subquer
14c90 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  y is not the rig
14ca0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
14cb0 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a  left outer join.
14cc0 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67 69  **        (Origi
14cd0 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30  nally ticket #30
14ce0 36 2e 20 20 53 74 72 65 6e 67 68 74 65 6e 65 64  6.  Strenghtened
14cf0 20 62 79 20 74 69 63 6b 65 74 20 23 33 33 30 30   by ticket #3300
14d00 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54  ).**.**   (4)  T
14d10 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
14d20 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74  ot DISTINCT or t
14d30 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
14d40 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
14d50 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20 73  .**   (5)  The s
14d60 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
14d70 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
14d80 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
14d90 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
14da0 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
14db0 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73  .**   (6)  The s
14dc0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
14dd0 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
14de0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
14df0 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
14e00 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a      DISTINCT..**
14e10 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73  .**   (7)  The s
14e20 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52  ubquery has a FR
14e30 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
14e40 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71     (8)  The subq
14e50 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
14e60 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
14e70 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
14e80 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
14e90 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75    (9)  The subqu
14ea0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
14eb0 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
14ec0 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
14ed0 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
14ee0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
14ef0 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75  **  (10)  The su
14f00 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
14f10 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
14f20 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
14f30 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
14f40 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a       use LIMIT..
14f50 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65  **.**  (11)  The
14f60 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
14f70 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
14f80 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f   not both have O
14f90 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
14fa0 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 4e 6f  .**.**  (12)  No
14fb0 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20  t implemented.  
14fc0 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65  Subsumed into re
14fd0 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20  striction (3).  
14fe0 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  Was previously.*
14ff0 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72  *        a separ
15000 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20  ate restriction 
15010 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69  deriving from ti
15020 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a  cket #350..**.**
15030 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71    (13)  The subq
15040 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71  uery and outer q
15050 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
15060 20 75 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a   use LIMIT.**.**
15070 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71    (14)  The subq
15080 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
15090 65 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20  e OFFSET.**.**  
150a0 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20  (15)  The outer 
150b0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72  query is not par
150c0 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
150d0 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a  select or the.**
150e0 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
150f0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 62   does not have b
15100 6f 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  oth an ORDER BY 
15110 61 6e 64 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  and a LIMIT clau
15120 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53  se..**        (S
15130 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 29  ee ticket #2339)
15140 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68  .**.**  (16)  Th
15150 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
15160 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
15170 65 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72  e or the subquer
15180 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20  y does.**       
15190 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44   not contain ORD
151a0 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20  ER BY.  (Ticket 
151b0 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65  #2942)  This use
151c0 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a  d to not matter.
151d0 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20  **        until 
151e0 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68  we introduced th
151f0 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29  e group_concat()
15200 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a   function.  .**.
15210 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75  **  (17)  The su
15220 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  b-query is not a
15230 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
15240 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49  , or it is a UNI
15250 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20  ON ALL .**      
15260 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73    compound claus
15270 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65  e made up entire
15280 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67  ly of non-aggreg
15290 61 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64  ate queries, and
152a0 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20   .**        the 
152b0 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a  parent query:.**
152c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
152d0 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72  s not itself par
152e0 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
152f0 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20  select,.**      
15300 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20      * is not an 
15310 61 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53  aggregate or DIS
15320 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64  TINCT query, and
15330 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 68  .**          * h
15340 61 73 20 6e 6f 20 6f 74 68 65 72 20 74 61 62 6c  as no other tabl
15350 65 73 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74  es or sub-select
15360 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
15370 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ause..**.**     
15380 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e     The parent an
15390 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20  d sub-query may 
153a0 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c  contain WHERE cl
153b0 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74  auses. Subject t
153c0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65  o.**        rule
153d0 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64  s (11), (13) and
153e0 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20   (14), they may 
153f0 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44  also contain ORD
15400 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20  ER BY,.**       
15410 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
15420 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
15430 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73    (18)  If the s
15440 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
15450 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
15460 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  hen all terms of
15470 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f   the.**        O
15480 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f  RDER by clause o
15490 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73  f the parent mus
154a0 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65  t be simple refe
154b0 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20  rences to .**   
154c0 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20       columns of 
154d0 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
154e0 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20  *.**  (19)  The 
154f0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
15500 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
15510 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
15520 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
15530 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63    have a WHERE c
15540 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  lause..**.**  (2
15550 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  0)  If the sub-q
15560 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
15570 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
15580 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a  it must not use.
15590 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44  **        an ORD
155a0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  ER BY clause.  T
155b0 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65  icket #3773.  We
155c0 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69   could relax thi
155d0 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  s constraint.** 
155e0 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20         somewhat 
155f0 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74  by saying that t
15600 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
15610 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
15620 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61  must.**        a
15630 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66  ppear as unmodif
15640 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ied result colum
15650 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ns in the outer 
15660 71 75 65 72 79 2e 20 20 42 75 74 0a 2a 2a 20 20  query.  But.**  
15670 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72        have other
15680 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69   optimizations i
15690 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77  n mind to deal w
156a0 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a  ith that case..*
156b0 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75  *.** In this rou
156c0 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61  tine, the "p" pa
156d0 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
156e0 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65  nter to the oute
156f0 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  r query..** The 
15700 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70  subquery is p->p
15710 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20  Src->a[iFrom].  
15720 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  isAgg is true if
15730 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
15740 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61  .** uses aggrega
15750 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79  tes and subquery
15760 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  IsAgg is true if
15770 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
15780 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  es aggregates..*
15790 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  *.** If flatteni
157a0 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ng is not attemp
157b0 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ted, this routin
157c0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64  e is a no-op and
157d0 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49   returns 0..** I
157e0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
157f0 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72  attempted this r
15800 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
15810 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ..**.** All of t
15820 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
15830 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75  alysis must occu
15840 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75  r on both the ou
15850 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a  ter query and.**
15860 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65   the subquery be
15870 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
15880 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  e runs..*/.stati
15890 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62  c int flattenSub
158a0 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  query(.  Parse *
158b0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
158c0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
158d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
158e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
158f0 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65  e parent or oute
15900 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
15910 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  nt */.  int iFro
15920 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m,           /* 
15930 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63  Index in p->pSrc
15940 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e  ->a[] of the inn
15950 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  er subquery */. 
15960 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20   int isAgg,     
15970 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
15980 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73   outer SELECT us
15990 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
159a0 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
159b0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20  subqueryIsAgg   
159c0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
159d0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
159e0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
159f0 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  s */.){.  const 
15a00 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68  char *zSavedAuth
15a10 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65  Context = pParse
15a20 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  ->zAuthContext;.
15a30 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
15a40 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  t;.  Select *pSu
15a50 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b;       /* The 
15a60 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22  inner query or "
15a70 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53  subquery" */.  S
15a80 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20  elect *pSub1;   
15a90 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
15aa0 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73   the rightmost s
15ab0 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65  elect in sub-que
15ac0 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
15ad0 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
15ae0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
15af0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
15b00 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
15b10 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68  pSubSrc;   /* Th
15b20 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
15b30 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
15b40 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
15b50 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65  st;    /* The re
15b60 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
15b70 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
15b80 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
15b90 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
15ba0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
15bb0 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65  e pSub result se
15bc0 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  t temp table */.
15bd0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
15be0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
15bf0 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20  unter */.  Expr 
15c00 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
15c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15c20 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
15c30 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
15c40 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74  ist_item *pSubit
15c50 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62  em;   /* The sub
15c60 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
15c70 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
15c80 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  >db;..  /* Check
15c90 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74   to see if flatt
15ca0 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
15cb0 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ed.  Return 0 if
15cc0 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   not..  */.  ass
15cd0 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
15ce0 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
15cf0 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c  ==0 );  /* Unabl
15d00 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d  e to flatten com
15d10 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f  pound queries */
15d20 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
15d30 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
15d40 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
15d50 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
15d60 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
15d70 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
15d80 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  ];.  iParent = p
15d90 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
15da0 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
15db0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
15dc0 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
15dd0 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
15de0 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
15df0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
15e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
15e10 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20  estriction (1)  
15e20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72  */.  if( subquer
15e30 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e  yIsAgg && pSrc->
15e40 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
15e50 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  0;          /* R
15e60 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20  estriction (2)  
15e70 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  */.  pSubSrc = p
15e80 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
15e90 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
15ea0 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
15eb0 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
15ec0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
15ed0 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
15ee0 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
15ef0 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
15f00 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20  y expresssions, 
15f10 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20  we allowed some 
15f20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d  combining of LIM
15f30 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
15f40 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20  ** because they 
15f50 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  could be compute
15f60 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
15f70 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d  e.  But when LIM
15f80 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
15f90 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72  ** became arbitr
15fa0 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
15fb0 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20   we were forced 
15fc0 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69  to add restricti
15fd0 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e  ons (13).  ** an
15fe0 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28  d (14). */.  if(
15ff0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
16000 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
16010 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
16020 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
16030 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28  on (13) */.  if(
16040 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29   pSub->pOffset )
16050 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
16060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16070 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
16080 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28  on (14) */.  if(
16090 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26   p->pRightmost &
160a0 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  & pSub->pLimit &
160b0 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
160c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
160d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16100 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29  Restriction (15)
16110 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
16120 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29  ubSrc->nSrc==0 )
16130 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16150 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
16160 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 28  (7)  */.  if( ((
16170 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
16180 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
16190 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   || pSub->pLimit
161a0 29 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ) .         && (
161b0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
161c0 69 73 41 67 67 29 20 29 7b 20 20 20 20 20 20 20  isAgg) ){       
161d0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
161e0 6e 73 20 28 34 29 28 35 29 28 38 29 28 39 29 20  ns (4)(5)(8)(9) 
161f0 2a 2f 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  */.     return 0
16200 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69  ;       .  }.  i
16210 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
16220 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
16230 30 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  0 && subqueryIsA
16240 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  gg ){.     retur
16250 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
16260 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20  Restriction (6) 
16270 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   */.  }.  if( p-
16280 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75  >pOrderBy && pSu
16290 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
162a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
162e0 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20  iction (11) */. 
162f0 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26   }.  if( isAgg &
16300 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
16310 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
16320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16330 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20  estriction (16) 
16340 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
16350 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65  Limit && p->pWhe
16360 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
16370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16380 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20  estriction (19) 
16390 2a 2f 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54  */..  /* OBSOLET
163a0 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a  E COMMENT 1:.  *
163b0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a  * Restriction 3:
163c0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
163d0 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b  y is a join, mak
163e0 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
163f0 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74  ery is .  ** not
16400 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67   used as the rig
16410 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ht operand of an
16420 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78   outer join.  Ex
16430 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
16440 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  is.  ** is not a
16450 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
16460 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
16470 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
16480 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
16490 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
164a0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
164b0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
164c0 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
164d0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
164e0 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
164f0 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
16500 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
16510 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20  me thing..  **. 
16520 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d   ** OBSOLETE COM
16530 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73  MENT 2:.  ** Res
16540 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66  triction 12:  If
16550 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
16560 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
16570 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
16580 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61  er.  ** join, ma
16590 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
165a0 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
165b0 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41  E clause..  ** A
165c0 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  n examples of wh
165d0 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c  y this is not al
165e0 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
165f0 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
16600 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c   OUTER JOIN (SEL
16610 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
16620 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a  ERE t2.x>0).  **
16630 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
16640 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
16650 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
16660 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
16670 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
16680 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78  N t2) WHERE t2.x
16690 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74  >0.  **.  ** But
166a0 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74   the t2.x>0 test
166b0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
166c0 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20  l on a NULL row 
166d0 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a  of t2, which.  *
166e0 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f  * effectively co
166f0 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52  nverts the OUTER
16700 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e   JOIN into an IN
16710 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20  NER JOIN..  **. 
16720 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44   ** THIS OVERRID
16730 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d  ES OBSOLETE COMM
16740 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f  ENTS 1 AND 2 ABO
16750 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20  VE:.  ** Ticket 
16760 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61 74  #3300 shows that
16770 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
16780 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
16790 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69  LEFT JOIN.  ** i
167a0 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20 64  s fraught with d
167b0 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20  anger.  Best to 
167c0 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20  avoid the whole 
167d0 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20  thing.  If the. 
167e0 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20   ** subquery is 
167f0 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
16800 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
16810 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74  hen do not flatt
16820 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  en..  */.  if( (
16830 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
16840 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
16850 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
16860 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
16870 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20  triction 17: If 
16880 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
16890 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
168a0 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  CT, then it must
168b0 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74  .  ** use only t
168c0 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
168d0 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20  rator. And none 
168e0 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65  of the simple se
168f0 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a  lect queries.  *
16900 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  * that make up t
16910 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
16920 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  CT are allowed t
16930 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20 6f  o be aggregate o
16940 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20  r distinct.  ** 
16950 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
16960 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  if( pSub->pPrior
16970 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62   ){.    if( pSub
16980 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
16990 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
169a0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30  * Restriction 20
169b0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
169c0 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73  ( isAgg || (p->s
169d0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
169e0 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72  tinct)!=0 || pSr
169f0 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
16a00 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16a10 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62    }.    for(pSub
16a20 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70  1=pSub; pSub1; p
16a30 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69  Sub1=pSub1->pPri
16a40 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  or){.      testc
16a50 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
16a60 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
16a70 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
16a80 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
16a90 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16aa0 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
16ab0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
16ac0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
16ad0 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
16ae0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
16af0 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
16b00 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
16b10 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a  _Aggregate))!=0.
16b20 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
16b30 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
16b40 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a  1->op!=TK_ALL) .
16b50 20 20 20 20 20 20 20 7c 7c 20 4e 45 56 45 52 28         || NEVER(
16b60 70 53 75 62 31 2d 3e 70 53 72 63 3d 3d 30 29 20  pSub1->pSrc==0) 
16b70 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e  || pSub1->pSrc->
16b80 6e 53 72 63 21 3d 31 0a 20 20 20 20 20 20 29 7b  nSrc!=1.      ){
16b90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16ba0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
16bb0 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63  ..    /* Restric
16bc0 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20  tion 18. */.    
16bd0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
16be0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
16bf0 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
16c00 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d   ii<p->pOrderBy-
16c10 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
16c20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
16c30 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 69 43  rderBy->a[ii].iC
16c40 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ol==0 ) return 0
16c50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16c60 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66    }..  /***** If
16c70 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
16c80 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67  oint, flattening
16c90 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
16ca0 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68  ****/..  /* Auth
16cb0 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65  orize the subque
16cc0 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  ry */.  pParse->
16cd0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
16ce0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  Subitem->zName;.
16cf0 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65    sqlite3AuthChe
16d00 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
16d10 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
16d20 30 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41  0);.  pParse->zA
16d30 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61  uthContext = zSa
16d40 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  vedAuthContext;.
16d50 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62  .  /* If the sub
16d60 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
16d70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
16d80 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20  ement, then (by 
16d90 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a  restrictions.  *
16da0 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76  * 17 and 18 abov
16db0 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20  e) it must be a 
16dc0 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68  UNION ALL and th
16dd0 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d  e parent query m
16de0 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20  ust .  ** be of 
16df0 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20  the form:.  **. 
16e00 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c   **     SELECT <
16e10 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20  expr-list> FROM 
16e20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77  (<sub-query>) <w
16e30 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20  here-clause> .  
16e40 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64  **.  ** followed
16e50 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59   by any ORDER BY
16e60 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f  , LIMIT and/or O
16e70 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54  FFSET clauses. T
16e80 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63  his block.  ** c
16e90 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65  reates N-1 copie
16ea0 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  s of the parent 
16eb0 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e  query without an
16ec0 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
16ed0 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45  T or .  ** OFFSE
16ee0 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f  T clauses and jo
16ef0 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20  ins them to the 
16f00 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f  left-hand-side o
16f10 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  f the original. 
16f20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20   ** using UNION 
16f30 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49  ALL operators. I
16f40 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73  n this case N is
16f50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
16f60 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63  imple.  ** selec
16f70 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  t statements in 
16f80 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  the compound sub
16f90 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a  -query..  **.  *
16fa0 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  * Example:.  **.
16fb0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
16fc0 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20  a+1 FROM (.  ** 
16fd0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20         SELECT x 
16fe0 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
16ff0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
17000 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
17010 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a  T y FROM tab.  *
17020 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41  *        UNION A
17030 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53  LL.  **        S
17040 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46  ELECT abs(z*2) F
17050 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20  ROM tab2.  **   
17060 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f    ) WHERE a!=5 O
17070 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
17080 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20   ** Transformed 
17090 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  into:.  **.  ** 
170a0 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46      SELECT x+1 F
170b0 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b  ROM tab WHERE x+
170c0 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e  1!=5.  **     UN
170d0 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
170e0 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d   SELECT y+1 FROM
170f0 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d   tab WHERE y+1!=
17100 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e  5.  **     UNION
17110 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45   ALL.  **     SE
17120 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20  LECT abs(z*2)+1 
17130 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20  FROM tab2 WHERE 
17140 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20  abs(z*2)+1!=5.  
17150 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  **     ORDER BY 
17160 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63  1.  **.  ** We c
17170 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f  all this the "co
17180 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
17190 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a  flattening"..  *
171a0 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75  /.  for(pSub=pSu
171b0 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b  b->pPrior; pSub;
171c0 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
171d0 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  or){.    Select 
171e0 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c  *pNew;.    ExprL
171f0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
17200 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
17210 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20   Expr *pLimit = 
17220 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53  p->pLimit;.    S
17230 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20  elect *pPrior = 
17240 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  p->pPrior;.    p
17250 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
17260 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b      p->pSrc = 0;
17270 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
17280 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69   0;.    p->pLimi
17290 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20  t = 0;.    pNew 
172a0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
172b0 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20  up(db, p, 0);.  
172c0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
172d0 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  imit;.    p->pOr
172e0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
172f0 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
17300 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  pSrc;.    p->op 
17310 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d  = TK_ALL;.    p-
17320 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b  >pRightmost = 0;
17330 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
17340 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
17350 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c   pPrior;.    }el
17360 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
17370 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
17380 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69  .      pNew->pRi
17390 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20  ghtmost = 0;.   
173a0 20 7d 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72   }.    p->pPrior
173b0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69 66 28   = pNew;.    if(
173c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
173d0 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
173e0 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c  }..  /* Begin fl
173f0 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72  attening the iFr
17400 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
17410 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a  he FROM clause .
17420 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65    ** in the oute
17430 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
17440 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
17450 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
17460 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
17470 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
17480 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73  le structure ass
17490 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
174a0 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20  .  ** subquery. 
174b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
174c0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
174d0 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
174e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
174f0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  , pSubitem->zNam
17500 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
17510 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
17520 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75  ->zAlias);.  pSu
17530 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
17540 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
17550 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
17560 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
17570 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
17580 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20  >pSelect = 0;.. 
17590 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69   /* Defer deleti
175a0 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  ng the Table obj
175b0 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
175c0 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
175d0 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65  query until code
175e0 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20   generation is. 
175f0 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69   ** complete, si
17600 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74  nce there may st
17610 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70  ill exist Expr.p
17620 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74  Tab entries that
17630 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  .  ** refer to t
17640 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e  he subquery even
17650 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e   after flattenin
17660 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36  g.  Ticket #3346
17670 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62  ..  **.  ** pSub
17680 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c  item->pTab is al
17690 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79  ways non-NULL by
176a0 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f   test restrictio
176b0 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f  ns and tests abo
176c0 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41  ve..  */.  if( A
176d0 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e  LWAYS(pSubitem->
176e0 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
176f0 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c  Table *pTabToDel
17700 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61   = pSubitem->pTa
17710 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54  b;.    if( pTabT
17720 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b  oDel->nRef==1 ){
17730 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 54  .      Parse *pT
17740 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
17750 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
17760 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54  Parse);.      pT
17770 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f  abToDel->pNextZo
17780 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c  mbie = pToplevel
17790 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20  ->pZombieTab;.  
177a0 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70      pToplevel->p
177b0 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62  ZombieTab = pTab
177c0 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  ToDel;.    }else
177d0 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  {.      pTabToDe
177e0 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d  l->nRef--;.    }
177f0 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  .    pSubitem->p
17800 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Tab = 0;.  }..  
17810 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
17820 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20   loop runs once 
17830 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e  for each term in
17840 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
17850 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65  uery.  ** flatte
17860 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69 62  ning (as describ
17870 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77  ed above).  If w
17880 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69  e are doing a di
17890 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a  fferent kind.  *
178a0 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * of flattening 
178b0 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f  - a flattening o
178c0 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70  ther than a comp
178d0 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
178e0 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20  attening -.  ** 
178f0 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f  then this loop o
17900 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20  nly runs once.. 
17910 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
17920 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20  op moves all of 
17930 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  the FROM element
17940 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  s of the subquer
17950 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  y into the.  ** 
17960 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
17970 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
17980 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e  ry.  Before doin
17990 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72  g this, remember
179a0 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  .  ** the cursor
179b0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
179c0 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71  original outer q
179d0 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e  uery FROM elemen
179e0 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e  t in.  ** iParen
179f0 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20  t.  The iParent 
17a00 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65  cursor will neve
17a10 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73  r be used.  Subs
17a20 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a  equent code.  **
17a30 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65   will scan expre
17a40 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66  ssions looking f
17a50 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72  or iParent refer
17a60 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63  ences and replac
17a70 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66  e.  ** those ref
17a80 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70  erences with exp
17a90 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65  ressions that re
17aa0 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62  solve to the sub
17ab0 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20  query FROM.  ** 
17ac0 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20  elements we are 
17ad0 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a  now copying in..
17ae0 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65    */.  for(pPare
17af0 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70  nt=p; pParent; p
17b00 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e  Parent=pParent->
17b10 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75  pPrior, pSub=pSu
17b20 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
17b30 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20  int nSubSrc;.   
17b40 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30   u8 jointype = 0
17b50 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d 20  ;.    pSubSrc = 
17b60 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20  pSub->pSrc;     
17b70 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
17b80 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  f subquery */.  
17b90 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62    nSubSrc = pSub
17ba0 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e  Src->nSrc;  /* N
17bb0 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
17bc0 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20  n subquery FROM 
17bd0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53  clause */.    pS
17be0 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
17bf0 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
17c00 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
17c10 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ter query */..  
17c20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20    if( pSrc ){.  
17c30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
17c40 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69  ent==p );  /* Fi
17c50 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68  rst time through
17c60 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
17c70 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53     jointype = pS
17c80 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
17c90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17ca0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
17cb0 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64  nt!=p );  /* 2nd
17cc0 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
17cd0 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68  times through th
17ce0 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
17cf0 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
17d00 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
17d10 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
17d20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
17d30 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20  if( pSrc==0 ){. 
17d40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
17d50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
17d60 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
17d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17d80 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  .    /* The subq
17d90 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67  uery uses a sing
17da0 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46  le slot of the F
17db0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
17dc0 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71  e outer.    ** q
17dd0 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75  uery.  If the su
17de0 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20  bquery has more 
17df0 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  than one element
17e00 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
17e10 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  use,.    ** then
17e20 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65   expand the oute
17e30 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20  r query to make 
17e40 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20  space for it to 
17e50 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  hold all element
17e60 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
17e70 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  subquery..    **
17e80 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
17e90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
17ea0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
17eb0 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20  tabA, (SELECT * 
17ec0 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29  FROM sub1, sub2)
17ed0 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20  , tabB;.    **. 
17ee0 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20     ** The outer 
17ef0 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74  query has 3 slot
17f00 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  s in its FROM cl
17f10 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20  ause.  One slot 
17f20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  of the.    ** ou
17f30 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d  ter query (the m
17f40 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75  iddle slot) is u
17f50 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75  sed by the subqu
17f60 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20  ery.  The next. 
17f70 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63     ** block of c
17f80 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  ode will expand 
17f90 74 68 65 20 6f 75 74 20 71 75 65 72 79 20 74 6f  the out query to
17fa0 20 34 20 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d   4 slots.  The m
17fb0 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f  iddle.    ** slo
17fc0 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f  t is expanded to
17fd0 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72   two slots in or
17fe0 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  der to make spac
17ff0 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e for the.    **
18000 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
18010 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18020 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
18030 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18040 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
18050 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
18060 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74  c = pSrc = sqlit
18070 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
18080 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53  (db, pSrc, nSubS
18090 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20  rc-1,iFrom+1);. 
180a0 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
180b0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
180c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
180d0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
180e0 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 46  * Transfer the F
180f0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
18100 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65   from the subque
18110 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  ry into the.    
18120 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  ** outer query..
18130 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
18140 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
18150 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
18160 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
18170 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72  b, pSrc->a[i+iFr
18180 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20  om].pUsing);.   
18190 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72     pSrc->a[i+iFr
181a0 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  om] = pSubSrc->a
181b0 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  [i];.      memse
181c0 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  t(&pSubSrc->a[i]
181d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62  , 0, sizeof(pSub
181e0 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20  Src->a[i]));.   
181f0 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69   }.    pSrc->a[i
18200 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  From].jointype =
18210 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20   jointype;.  .  
18220 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
18230 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
18240 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
18250 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
18260 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
18270 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
18280 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
18290 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  uery..    ** .  
182a0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
182b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
182c0 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46  LECT a+5, b*10 F
182d0 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20  ROM (SELECT x*3 
182e0 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20  AS a, y+10 AS b 
182f0 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61  FROM t1) WHERE a
18300 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20  >b;.    **   \  
18310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18320 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
18330 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
18340 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
18350 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f  /.    **    \___
18360 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18370 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
18380 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18390 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
183a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20     **.    ** We 
183b0 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
183c0 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
183d0 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
183e0 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
183f0 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65  ee.    ** "a" we
18400 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33   substitute "x*3
18410 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  " and every plac
18420 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20  e we see "b" we 
18430 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30  substitute "y+10
18440 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c  "..    */.    pL
18450 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  ist = pParent->p
18460 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69  EList;.    for(i
18470 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
18480 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
18490 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
184a0 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
184b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
184c0 7a 53 70 61 6e 20 3d 20 70 4c 69 73 74 2d 3e 61  zSpan = pList->a
184d0 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [i].zSpan;.     
184e0 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 53     if( ALWAYS(zS
184f0 70 61 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pan) ){.        
18500 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
18510 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
18520 74 72 44 75 70 28 64 62 2c 20 7a 53 70 61 6e 29  trDup(db, zSpan)
18530 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18540 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75    }.    }.    su
18550 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
18560 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c  pParent->pEList,
18570 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
18580 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
18590 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20   isAgg ){.      
185a0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
185b0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75  , pParent->pGrou
185c0 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  pBy, iParent, pS
185d0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
185e0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
185f0 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
18600 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  db, pParent->pHa
18610 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
18620 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
18630 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62    }.    if( pSub
18640 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
18650 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
18660 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ent->pOrderBy==0
18670 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
18680 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t->pOrderBy = pS
18690 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
186a0 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72      pSub->pOrder
186b0 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  By = 0;.    }els
186c0 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70  e if( pParent->p
186d0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
186e0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
186f0 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  b, pParent->pOrd
18700 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  erBy, iParent, p
18710 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
18720 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62    }.    if( pSub
18730 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
18740 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74    pWhere = sqlit
18750 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
18760 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a  ub->pWhere, 0);.
18770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18780 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20   pWhere = 0;.   
18790 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71 75   }.    if( subqu
187a0 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
187b0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
187c0 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b  t->pHaving==0 );
187d0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
187e0 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e  pHaving = pParen
187f0 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  t->pWhere;.     
18800 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
18810 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20   = pWhere;.     
18820 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
18830 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
18840 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
18850 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
18860 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
18870 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
18880 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
18890 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  And(db, pParent-
188a0 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20  >pHaving, .     
188b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
188d0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
188e0 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30  pSub->pHaving, 0
188f0 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
18900 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75  ( pParent->pGrou
18910 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pBy==0 );.      
18920 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
18930 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
18940 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d  istDup(db, pSub-
18950 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20  >pGroupBy, 0);. 
18960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18970 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
18980 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
18990 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c  pParent->pWhere,
189a0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
189b0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  pEList);.      p
189c0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
189d0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
189e0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  db, pParent->pWh
189f0 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  ere, pWhere);.  
18a00 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68    }.  .    /* Th
18a10 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72  e flattened quer
18a20 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66  y is distinct if
18a30 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65   either the inne
18a40 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
18a50 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64  outer query is d
18a60 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f  istinct. .    */
18a70 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65  .    pParent->se
18a80 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e  lFlags |= pSub->
18a90 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
18aa0 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f  stinct;.  .    /
18ab0 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  *.    ** SELECT 
18ac0 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  ... FROM (SELECT
18ad0 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46   ... LIMIT a OFF
18ae0 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f  SET b) LIMIT x O
18af0 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a  FFSET y;.    **.
18b00 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65      ** One is te
18b10 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20  mpted to try to 
18b20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63  add a and b to c
18b30 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74  ombine the limit
18b40 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20  s.  But this.   
18b50 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   ** does not wor
18b60 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69  k if either limi
18b70 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20  t is negative.. 
18b80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
18b90 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
18ba0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69      pParent->pLi
18bb0 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d  mit = pSub->pLim
18bc0 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  it;.      pSub->
18bd0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
18be0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69  }.  }..  /* Fini
18bf0 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
18c00 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
18c10 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
18c20 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
18c30 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
18c40 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
18c50 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20 72 65 74  , pSub1);..  ret
18c60 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
18c70 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
18c80 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
18c90 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
18ca0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
18cb0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  */../*.** Analyz
18cc0 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
18cd0 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
18ce0 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   an argument to 
18cf0 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  see if it.** is 
18d00 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  a min() or max()
18d10 20 71 75 65 72 79 2e 20 52 65 74 75 72 6e 20 57   query. Return W
18d20 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
18d30 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42   or WHERE_ORDERB
18d40 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20 69 74 20  Y_MAX if .** it 
18d50 69 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  is, or 0 otherwi
18d60 73 65 2e 20 41 74 20 70 72 65 73 65 6e 74 2c 20  se. At present, 
18d70 61 20 71 75 65 72 79 20 69 73 20 63 6f 6e 73 69  a query is consi
18d80 64 65 72 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  dered to be.** a
18d90 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 71 75 65   min()/max() que
18da0 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  ry if:.**.**   1
18db0 2e 20 54 68 65 72 65 20 69 73 20 61 20 73 69 6e  . There is a sin
18dc0 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  gle object in th
18dd0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
18de0 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65 72 65 20  *.**   2. There 
18df0 69 73 20 61 20 73 69 6e 67 6c 65 20 65 78 70 72  is a single expr
18e00 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65  ession in the re
18e10 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 69 74  sult set, and it
18e20 20 69 73 0a 2a 2a 20 20 20 20 20 20 65 69 74 68   is.**      eith
18e30 65 72 20 6d 69 6e 28 78 29 20 6f 72 20 6d 61 78  er min(x) or max
18e40 28 78 29 2c 20 77 68 65 72 65 20 78 20 69 73 20  (x), where x is 
18e50 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e  a column referen
18e60 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ce..*/.static u8
18e70 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 53 65 6c   minMaxQuery(Sel
18e80 65 63 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 20  ect *p){.  Expr 
18e90 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72 4c 69  *pExpr;.  ExprLi
18ea0 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e  st *pEList = p->
18eb0 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70  pEList;..  if( p
18ec0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
18ed0 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f  ) return WHERE_O
18ee0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
18ef0 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   pExpr = pEList-
18f00 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
18f10 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
18f20 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
18f30 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
18f40 4e 45 56 45 52 28 45 78 70 72 48 61 73 50 72 6f  NEVER(ExprHasPro
18f50 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
18f60 78 49 73 53 65 6c 65 63 74 29 29 20 29 20 72 65  xIsSelect)) ) re
18f70 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74  turn 0;.  pEList
18f80 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
18f90 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  t;.  if( pEList=
18fa0 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45  =0 || pEList->nE
18fb0 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
18fc0 30 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  0;.  if( pEList-
18fd0 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21  >a[0].pExpr->op!
18fe0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
18ff0 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   return WHERE_OR
19000 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
19010 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
19020 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
19030 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
19040 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
19050 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
19060 6f 6b 65 6e 2c 22 6d 69 6e 22 29 3d 3d 30 20 29  oken,"min")==0 )
19070 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48 45  {.    return WHE
19080 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a  RE_ORDERBY_MIN;.
19090 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
190a0 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
190b0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 78 22  ->u.zToken,"max"
190c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
190d0 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
190e0 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _MAX;.  }.  retu
190f0 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
19100 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a  _NORMAL;.}../*.*
19110 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61  * The select sta
19120 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
19130 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
19140 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67  ent is an aggreg
19150 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ate query..** Th
19160 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65 6e 74  e second argment
19170 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   is the associat
19180 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66  ed aggregate-inf
19190 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a  o object. This .
191a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74  ** function test
191b0 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  s if the SELECT 
191c0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
191d0 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
191e0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
191f0 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74  l>.**.** where t
19200 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62 61  able is a databa
19210 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  se table, not a 
19220 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
19230 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  ew. If the query
19240 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74  .** does match t
19250 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65  his pattern, the
19260 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
19270 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
19280 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20  representing.** 
19290 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65  <tbl> is returne
192a0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20  d. Otherwise, 0 
192b0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
192c0 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73  static Table *is
192d0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65  SimpleCount(Sele
192e0 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a  ct *p, AggInfo *
192f0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62  pAggInfo){.  Tab
19300 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72  le *pTab;.  Expr
19310 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65   *pExpr;..  asse
19320 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79  rt( !p->pGroupBy
19330 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57   );..  if( p->pW
19340 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  here || p->pELis
19350 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20  t->nExpr!=1 .   
19360 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  || p->pSrc->nSrc
19370 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  !=1 || p->pSrc->
19380 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29  a[0].pSelect.  )
19390 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
193a0 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e    }.  pTab = p->
193b0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
193c0 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
193d0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
193e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
193f0 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65   && !pTab->pSele
19400 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a  ct && pExpr );..
19410 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
19420 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
19430 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
19440 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
19450 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
19460 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e   if( (pAggInfo->
19470 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e  aFunc[0].pFunc->
19480 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e  flags&SQLITE_FUN
19490 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65  C_COUNT)==0 ) re
194a0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
194b0 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69  xpr->flags&EP_Di
194c0 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
194d0 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61  0;..  return pTa
194e0 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  b;.}../*.** If t
194f0 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69  he source-list i
19500 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e  tem passed as an
19510 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75   argument was au
19520 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a  gmented with an.
19530 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
19540 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74  ause, then try t
19550 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65  o locate the spe
19560 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66  cified index. If
19570 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75   there.** was su
19580 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20  ch a clause and 
19590 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
195a0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
195b0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
195c0 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61  TE_ERROR and lea
195d0 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
195e0 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65  Parse. Otherwise
195f0 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70  , populate .** p
19600 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64  From->pIndex and
19610 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19620 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
19630 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
19640 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19650 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
19660 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
19670 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26  f( pFrom->pTab &
19680 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20  & pFrom->zIndex 
19690 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
196a0 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
196b0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64  ;.    char *zInd
196c0 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64  ex = pFrom->zInd
196d0 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  ex;.    Index *p
196e0 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
196f0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
19700 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26  .        pIdx &&
19710 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
19720 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e  pIdx->zName, zIn
19730 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20 70  dex); .        p
19740 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a  Idx=pIdx->pNext.
19750 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
19760 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71  pIdx ){.      sq
19770 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
19780 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
19790 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65  ndex: %s", zInde
197a0 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  x, 0);.      ret
197b0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
197c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f  ;.    }.    pFro
197d0 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  m->pIndex = pIdx
197e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
197f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
19800 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19810 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c  is a Walker call
19820 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64  back for "expand
19830 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74  ing" a SELECT st
19840 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70  atement..** "Exp
19850 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f  anding" means to
19860 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
19870 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  g:.**.**    (1) 
19880 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
19890 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
198a0 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
198b0 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
198c0 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
198d0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
198e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
198f0 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
19900 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
19910 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
19920 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
19930 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
19940 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
19950 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
19960 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19970 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
19980 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
19990 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
199a0 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
199b0 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
199c0 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
199d0 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
199e0 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
199f0 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
19a00 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
19a10 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
19a20 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
19a30 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
19a40 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
19a50 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
19a60 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
19a70 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
19a80 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70  e presistent rep
19a90 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
19aa0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
19ab0 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
19ac0 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
19ad0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
19ae0 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68  to accomodate th
19af0 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
19b00 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
19b10 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
19b20 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
19b30 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
19b40 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74  *    (4)  Scan t
19b50 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
19b60 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
19b70 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
19b80 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
19b90 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
19ba0 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
19bb0 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
19bc0 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
19bd0 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
19be0 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
19bf0 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
19c00 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
19c10 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
19c20 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
19c30 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
19c40 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  TABLE..**.*/.sta
19c50 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78  tic int selectEx
19c60 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70  pander(Walker *p
19c70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
19c80 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
19c90 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
19ca0 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20  Parse;.  int i, 
19cb0 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20  j, k;.  SrcList 
19cc0 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
19cd0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
19ce0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
19cf0 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73  item *pFrom;.  s
19d00 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
19d10 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
19d20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19d30 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
19d40 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
19d50 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53   if( NEVER(p->pS
19d60 72 63 3d 3d 30 29 20 7c 7c 20 28 70 2d 3e 73 65  rc==0) || (p->se
19d70 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
19d80 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
19d90 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
19da0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c  ;.  }.  p->selFl
19db0 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
19dc0 65 64 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  ed;.  pTabList =
19dd0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
19de0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
19df0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
19e00 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
19e10 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
19e20 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
19e30 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
19e40 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
19e50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
19e60 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
19e70 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
19e80 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61  sors(pParse, pTa
19e90 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  bList);..  /* Lo
19ea0 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
19eb0 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
19ec0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
19ed0 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
19ee0 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
19ef0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
19f00 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
19f10 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
19f20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
19f30 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
19f40 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
19f50 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
19f60 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
19f70 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
19f80 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
19f90 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
19fa0 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
19fb0 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
19fc0 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72  Tab;.    if( pFr
19fd0 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  om->pTab!=0 ){. 
19fe0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61       /* This sta
19ff0 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61  tement has alrea
1a000 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64  dy been prepared
1a010 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  .  There is no n
1a020 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  eed.      ** to 
1a030 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  go further. */. 
1a040 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
1a050 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1a060 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
1a070 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d   }.    if( pFrom
1a080 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69  ->zName==0 ){.#i
1a090 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a0a0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20  T_SUBQUERY.     
1a0b0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
1a0c0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
1a0d0 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
1a0e0 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
1a0f0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1a100 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ECT */.      ass
1a110 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a  ert( pSel!=0 );.
1a120 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
1a130 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
1a140 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
1a150 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
1a160 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 70 46   pSel);.      pF
1a170 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
1a180 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1a190 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
1a1a0 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  f(Table));.     
1a1b0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
1a1c0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1a1d0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 64 62 4d  .      pTab->dbM
1a1e0 65 6d 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  em = db->lookasi
1a1f0 64 65 2e 62 45 6e 61 62 6c 65 64 20 3f 20 64 62  de.bEnabled ? db
1a200 20 3a 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62   : 0;.      pTab
1a210 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
1a220 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
1a230 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1a240 62 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75  b, "sqlite_subqu
1a250 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a  ery_%p_", (void*
1a260 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68  )pTab);.      wh
1a270 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
1a280 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c  r ){ pSel = pSel
1a290 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20  ->pPrior; }.    
1a2a0 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
1a2b0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
1a2c0 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  se, pSel->pEList
1a2d0 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
1a2e0 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
1a2f0 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
1a300 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d   -1;.      pTab-
1a310 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
1a320 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69  Ephemeral;.#endi
1a330 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
1a340 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
1a350 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
1a360 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
1a370 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
1a380 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
1a390 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
1a3a0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
1a3b0 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73  Tab = .        s
1a3c0 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
1a3d0 65 28 70 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d  e(pParse,0,pFrom
1a3e0 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a  ->zName,pFrom->z
1a3f0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20  Database);.     
1a400 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
1a410 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1a420 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
1a430 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  f++;.#if !define
1a440 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1a450 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
1a460 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
1a470 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
1a480 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
1a490 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28  ct || IsVirtual(
1a4a0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
1a4b0 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72   /* We reach her
1a4c0 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74  e if the named t
1a4d0 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79  able is a really
1a4e0 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   a view */.     
1a4f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69     if( sqlite3Vi
1a500 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
1a510 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
1a520 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1a530 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
1a540 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
1a550 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
1a560 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
1a570 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
1a580 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c  p(db, pTab->pSel
1a590 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
1a5a0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
1a5b0 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  ct(pWalker, pFro
1a5c0 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
1a5d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1a5e0 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65  }..    /* Locate
1a5f0 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64   the index named
1a600 20 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20   by the INDEXED 
1a610 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e  BY clause, if an
1a620 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  y. */.    if( sq
1a630 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f  lite3IndexedByLo
1a640 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72  okup(pParse, pFr
1a650 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  om) ){.      ret
1a660 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1a670 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
1a680 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
1a690 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
1a6a0 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
1a6b0 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
1a6c0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1a6d0 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74  cFailed || sqlit
1a6e0 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
1a6f0 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
1a700 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1a710 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  .  }..  /* For e
1a720 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63  very "*" that oc
1a730 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  curs in the colu
1a740 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20  mn list, insert 
1a750 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a  the names of.  *
1a760 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  * all columns in
1a770 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e   all tables.  An
1a780 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c  d for every TABL
1a790 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e  E.* insert the n
1a7a0 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c  ames.  ** of all
1a7b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c   columns in TABL
1a7c0 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  E.  The parser i
1a7d0 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
1a7e0 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
1a7f0 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c  * with the TK_AL
1a800 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  L operator for e
1a810 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
1a820 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
1a830 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54  umn list..  ** T
1a840 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
1a850 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
1a860 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20  cate the TK_ALL 
1a870 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
1a880 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68  expand.  ** each
1a890 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
1a8a0 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
1a8b0 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  in all tables.. 
1a8c0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
1a8d0 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65  st loop just che
1a8e0 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
1a8f0 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20  ere are any "*" 
1a900 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74  operators.  ** t
1a910 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69  hat need expandi
1a920 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b  ng..  */.  for(k
1a930 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
1a940 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45  xpr; k++){.    E
1a950 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74  xpr *pE = pEList
1a960 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
1a970 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
1a980 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
1a990 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
1a9a0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
1a9b0 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
1a9c0 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
1a9d0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e  =TK_DOT || (pE->
1a9e0 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e  pLeft!=0 && pE->
1a9f0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
1aa00 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  ) );.    if( pE-
1aa10 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
1aa20 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
1aa30 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
1aa40 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73   }.  if( k<pELis
1aa50 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
1aa60 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
1aa70 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
1aa80 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
1aa90 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
1aaa0 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
1aab0 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
1aac0 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
1aad0 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
1aae0 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
1aaf0 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
1ab00 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
1ab10 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
1ab20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
1ab30 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1ab40 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
1ab50 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
1ab60 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
1ab70 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
1ab80 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
1ab90 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
1aba0 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
1abb0 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
1abc0 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20  mes)!=0.        
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
1abe0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1abf0 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
1ac00 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30  =0;..    for(k=0
1ac10 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
1ac20 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; k++){.      E
1ac30 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70  xpr *pE = a[k].p
1ac40 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
1ac50 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
1ac60 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
1ac70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
1ac80 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20   pE->op!=TK_ALL 
1ac90 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  && (pE->op!=TK_D
1aca0 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
1acb0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b  ->op!=TK_ALL) ){
1acc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
1acd0 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72   particular expr
1ace0 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ession does not 
1acf0 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
1ad00 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ded..        */.
1ad10 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
1ad20 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
1ad30 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
1ad40 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a  w, a[k].pExpr);.
1ad50 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1ad60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
1ad70 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
1ad80 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
1ad90 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
1ada0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
1adb0 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20  >nExpr-1].zSpan 
1adc0 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20  = a[k].zSpan;.  
1add0 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
1ade0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
1adf0 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30    a[k].zSpan = 0
1ae00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ae10 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
1ae20 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1ae30 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
1ae40 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
1ae50 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
1ae60 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
1ae70 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
1ae80 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
1ae90 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
1aea0 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
1aeb0 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
1aec0 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
1aed0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
1aee0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
1aef0 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
1af00 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
1af10 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
1af20 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20  K_DOT ){.       
1af30 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70     assert( pE->p
1af40 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
1af50 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1af60 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1af70 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56  ->pLeft, EP_IntV
1af80 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
1af90 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e     zTName = pE->
1afa0 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pLeft->u.zToken;
1afb0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1afc0 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
1afd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1afe0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c          for(i=0,
1aff0 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
1b000 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
1b010 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
1b020 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
1b030 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
1b040 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  om->pTab;.      
1b050 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
1b060 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  me = pFrom->zAli
1b070 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  as;.          if
1b080 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b  ( zTabName==0 ){
1b090 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
1b0a0 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
1b0b0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
1b0c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
1b0d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b0e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
1b0f0 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
1b100 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1b110 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
1b120 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1b130 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1b140 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b150 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
1b160 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  1;.          for
1b170 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
1b180 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1b190 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
1b1a0 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20  r, *pRight;.    
1b1b0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
1b1c0 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
1b1d0 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
1b1e0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
1b1f0 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63  lname;  /* The c
1b200 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
1b210 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ame */.         
1b220 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65     char *zToFree
1b230 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20  ;   /* Malloced 
1b240 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64  string that need
1b250 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
1b260 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b  .            Tok
1b270 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  en sColname;  /*
1b280 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   Computed column
1b290 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e   name as a token
1b2a0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
1b2b0 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
1b2c0 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69  is marked as 'hi
1b2d0 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79  dden' (currently
1b2e0 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20   only possible. 
1b2f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f             ** fo
1b300 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
1b310 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64  ), do not includ
1b320 65 20 69 74 20 69 6e 20 74 68 65 20 65 78 70 61  e it in the expa
1b330 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  nded.           
1b340 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c   ** result-set l
1b350 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ist..           
1b360 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1b370 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75  if( IsHiddenColu
1b380 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  mn(&pTab->aCol[j
1b390 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
1b3a0 20 20 20 20 61 73 73 65 72 74 28 49 73 56 69 72      assert(IsVir
1b3b0 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20  tual(pTab));.   
1b3c0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1b3d0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
1b3e0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1b3f0 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d  if( i>0 && zTNam
1b400 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1b410 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
1b420 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74  List_item *pLeft
1b430 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1b440 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  i-1];.          
1b450 20 20 20 20 69 66 28 20 28 70 4c 65 66 74 5b 31      if( (pLeft[1
1b460 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
1b470 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20  NATURAL)!=0 &&. 
1b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b490 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64         columnInd
1b4a0 65 78 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20  ex(pLeft->pTab, 
1b4b0 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b4d0 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  In a NATURAL joi
1b4e0 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e  n, omit the join
1b4f0 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
1b500 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
1b510 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74     ** table on t
1b520 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
1b530 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1b540 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1b550 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1b560 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1b570 64 4c 69 73 74 49 6e 64 65 78 28 70 4c 65 66 74  dListIndex(pLeft
1b580 5b 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d  [1].pUsing, zNam
1b590 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
1b5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
1b5b0 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
1b5c0 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
1b5d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
1b5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1b5f0 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
1b600 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
1b610 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1b630 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1b640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b660 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
1b670 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
1b680 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  D, zName);.     
1b690 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
1b6a0 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  = zName;.       
1b6b0 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30       zToFree = 0
1b6c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1b6d0 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70  ( longNames || p
1b6e0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20  TabList->nSrc>1 
1b6f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1b700 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20   Expr *pLeft;.  
1b710 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
1b720 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
1b730 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e  db, TK_ID, zTabN
1b740 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1b750 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
1b760 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
1b770 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
1b780 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
1b790 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
1b7a0 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  ngNames ){.     
1b7b0 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e             zColn
1b7c0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
1b7d0 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
1b7e0 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d  , zTabName, zNam
1b7f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1b800 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43      zToFree = zC
1b810 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  olname;.        
1b820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b840 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
1b850 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
1b860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b870 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1b880 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1b890 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45  pParse, pNew, pE
1b8a0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
1b8b0 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a    sColname.z = z
1b8c0 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
1b8d0 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20       sColname.n 
1b8e0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1b8f0 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  0(zColname);.   
1b900 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b910 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
1b920 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73  pParse, pNew, &s
1b930 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  Colname, 0);.   
1b940 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b950 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72  DbFree(db, zToFr
1b960 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ee);.          }
1b970 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b980 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65     if( !tableSee
1b990 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
1b9a0 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20  f( zTName ){.   
1b9b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b9c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1b9d0 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
1b9e0 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20   %s", zTName);. 
1b9f0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1ba10 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1ba20 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73  se, "no tables s
1ba30 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20  pecified");.    
1ba40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ba50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1ba60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
1ba70 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45  istDelete(db, pE
1ba80 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
1ba90 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
1baa0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1bab0 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
1bac0 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c  pEList && p->pEL
1bad0 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  ist->nExpr>db->a
1bae0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
1baf0 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
1bb00 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1bb10 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
1bb20 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72  any columns in r
1bb30 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d  esult set");.  }
1bb40 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1bb50 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
1bb60 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
1bb70 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
1bb80 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e  rse-tree walker.
1bb90 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
1bba0 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
1bbb0 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
1bbc0 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73  back then expres
1bbd0 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72  sion trees.** ar
1bbe0 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74  e walked without
1bbf0 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69   any actions bei
1bc00 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68  ng taken at each
1bc10 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62   node.  Presumab
1bc20 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  ly,.** when this
1bc30 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1bc40 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70   for Walker.xExp
1bc50 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a  rCallback then .
1bc60 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63  ** Walker.xSelec
1bc70 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74  tCallback is set
1bc80 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
1bc90 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72   useful for ever
1bca0 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69  y .** subquery i
1bcb0 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65  n the parser tre
1bcc0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1bcd0 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61   exprWalkNoop(Wa
1bce0 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45  lker *NotUsed, E
1bcf0 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  xpr *NotUsed2){.
1bd00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1bd10 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
1bd20 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
1bd30 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
1bd40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1bd50 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61  tine "expands" a
1bd60 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1bd70 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  t and all of its
1bd80 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20   subqueries..** 
1bd90 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  For additional i
1bda0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68  nformation on wh
1bdb0 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22  at it means to "
1bdc0 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54  expand" a SELECT
1bdd0 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73  .** statement, s
1bde0 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  ee the comment o
1bdf0 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61  n the selectExpa
1be00 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61  nd worker callba
1be10 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  ck above..**.** 
1be20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45  Expanding a SELE
1be30 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  CT statement is 
1be40 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69  the first step i
1be50 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a  n processing a.*
1be60 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1be70 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20  nt.  The SELECT 
1be80 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62  statement must b
1be90 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72  e expanded befor
1bea0 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75  e.** name resolu
1beb0 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65  tion is performe
1bec0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74  d..**.** If anyt
1bed0 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
1bee0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
1bef0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
1bf00 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65  o pParse..** The
1bf10 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1bf20 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65  n can detect the
1bf30 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b   problem by look
1bf40 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e  ing at pParse->n
1bf50 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50  Err.** and/or pP
1bf60 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1bf70 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  Failed..*/.stati
1bf80 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
1bf90 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65  lectExpand(Parse
1bfa0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
1bfb0 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61   *pSelect){.  Wa
1bfc0 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c  lker w;.  w.xSel
1bfd0 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
1bfe0 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20  lectExpander;.  
1bff0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
1c000 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  = exprWalkNoop;.
1c010 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
1c020 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
1c030 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
1c040 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  lect);.}...#ifnd
1c050 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1c060 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68  UBQUERY./*.** Th
1c070 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78  is is a Walker.x
1c080 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63  SelectCallback c
1c090 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
1c0a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70  sqlite3SelectTyp
1c0b0 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72  eInfo().** inter
1c0c0 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  face..**.** For 
1c0d0 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65  each FROM-clause
1c0e0 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43   subquery, add C
1c0f0 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20  olumn.zType and 
1c100 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20  Column.zColl.** 
1c110 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
1c120 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
1c130 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  re that represen
1c140 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ts the result se
1c150 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62  t.** of that sub
1c160 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  query..**.** The
1c170 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
1c180 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
1c190 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
1c1a0 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  was constructed.
1c1b0 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61  ** by selectExpa
1c1c0 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74  nder() but the t
1c1d0 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
1c1e0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61  n information wa
1c1f0 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20  s omitted.** at 
1c200 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75  that point becau
1c210 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68  se identifiers h
1c220 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ad not yet been 
1c230 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a  resolved.  This.
1c240 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
1c250 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74  lled after ident
1c260 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e  ifier resolution
1c270 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c280 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
1c290 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72  yTypeInfo(Walker
1c2a0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
1c2b0 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
1c2c0 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b  pParse;.  int i;
1c2d0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
1c2e0 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
1c2f0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
1c300 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  om;..  assert( p
1c310 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1c320 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 61 73  Resolved );.  as
1c330 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
1c340 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
1c350 6e 66 6f 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  nfo)==0 );.  p->
1c360 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48  selFlags |= SF_H
1c370 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50  asTypeInfo;.  pP
1c380 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
1c390 70 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69  pParse;.  pTabLi
1c3a0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
1c3b0 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
1c3c0 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
1c3d0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1c3e0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
1c3f0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1c400 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
1c410 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 21  if( ALWAYS(pTab!
1c420 3d 30 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61  =0) && (pTab->ta
1c430 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
1c440 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  meral)!=0 ){.   
1c450 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
1c460 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
1c470 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
1c480 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
1c490 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
1c4a0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 61  pSelect;.      a
1c4b0 73 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20  ssert( pSel );. 
1c4c0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
1c4d0 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20  ->pPrior ) pSel 
1c4e0 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a  = pSel->pPrior;.
1c4f0 20 20 20 20 20 20 73 65 6c 65 63 74 41 64 64 43        selectAddC
1c500 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
1c510 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  ation(pParse, pT
1c520 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e  ab->nCol, pTab->
1c530 61 43 6f 6c 2c 20 70 53 65 6c 29 3b 0a 20 20 20  aCol, pSel);.   
1c540 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1c550 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
1c560 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
1c570 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
1c580 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f   datatype and co
1c590 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1c5a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a   information to.
1c5b0 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  ** the Table str
1c5c0 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46  uctures of all F
1c5d0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1c5e0 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45  eries in a.** SE
1c5f0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
1c600 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72  **.** Use this r
1c610 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d  outine after nam
1c620 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  e resolution..*/
1c630 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
1c640 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
1c650 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  eInfo(Parse *pPa
1c660 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
1c670 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  lect){.#ifndef S
1c680 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1c690 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  ERY.  Walker w;.
1c6a0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
1c6b0 61 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64 53  ack = selectAddS
1c6c0 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b  ubqueryTypeInfo;
1c6d0 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
1c6e0 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f  ck = exprWalkNoo
1c6f0 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
1c700 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
1c710 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
1c720 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66  pSelect);.#endif
1c730 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1c740 72 6f 75 74 69 6e 65 20 73 65 74 73 20 6f 66 20  routine sets of 
1c750 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1c760 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  nt for processin
1c770 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  g.  The.** follo
1c780 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69  wing is accompli
1c790 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  shed:.**.**     
1c7a0 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e  *  VDBE Cursor n
1c7b0 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67  umbers are assig
1c7c0 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d  ned to all FROM-
1c7d0 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
1c7e0 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61       *  Ephemera
1c7f0 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20  l Table objects 
1c800 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
1c810 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
1c820 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20  subqueries..**  
1c830 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49     *  ON and USI
1c840 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73  NG clauses are s
1c850 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52  hifted into WHER
1c860 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  E statements.** 
1c870 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73      *  Wildcards
1c880 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e   "*" and "TABLE.
1c890 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  *" in result set
1c8a0 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a  s are expanded..
1c8b0 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69  **     *  Identi
1c8c0 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73  fiers in express
1c8d0 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20  ion are matched 
1c8e0 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  to tables..**.**
1c8f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
1c900 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ts recursively o
1c910 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73  n all subqueries
1c920 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45   within the SELE
1c930 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
1c940 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20  te3SelectPrep(. 
1c950 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1c960 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1c970 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
1c980 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1c990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c9a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1c9b0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
1c9c0 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
1c9d0 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61  *pOuterNC  /* Na
1c9e0 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63  me context for c
1c9f0 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20  ontainer */.){. 
1ca00 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1ca10 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
1ca20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
1ca30 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1ca40 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
1ca50 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20   SF_HasTypeInfo 
1ca60 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1ca70 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
1ca80 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
1ca90 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1caa0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1cab0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
1cac0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
1cad0 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
1cae0 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
1caf0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1cb00 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1cb10 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
1cb20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
1cb30 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73  ddTypeInfo(pPars
1cb40 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, p);.}../*.** 
1cb50 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
1cb60 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
1cb70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
1cb80 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
1cb90 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
1cba0 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
1cbb0 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
1cbc0 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
1cbd0 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
1cbe0 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
1cbf0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d  s.** routine sim
1cc00 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  ply stores NULLs
1cc10 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
1cc20 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a   memory cells..*
1cc30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
1cc40 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
1cc50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
1cc60 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
1cc70 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1cc80 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1cc90 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
1cca0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
1ccb0 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e  nc;.  if( pAggIn
1ccc0 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e  fo->nFunc+pAggIn
1ccd0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29  fo->nColumn==0 )
1cce0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1ccf0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
1cd00 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
1cd10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1cd20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1cd30 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67   OP_Null, 0, pAg
1cd40 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
1cd50 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Mem);.  }.  for(
1cd60 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
1cd70 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
1cd80 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
1cd90 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
1cda0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cdb0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1cdc0 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b  0, pFunc->iMem);
1cdd0 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
1cde0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
1cdf0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
1ce00 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
1ce10 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1ce20 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ce30 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1ce40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
1ce50 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
1ce60 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
1ce70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
1ce80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1ce90 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
1cea0 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
1ceb0 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
1cec0 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
1ced0 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
1cee0 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
1cef0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
1cf00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cf10 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1cf20 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
1cf30 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1cf40 20 70 45 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20   pE->x.pList);. 
1cf50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1cf60 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
1cf70 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46  penEphemeral, pF
1cf80 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20  unc->iDistinct, 
1cf90 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfb0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
1cfc0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
1cfd0 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OFF);.      }.  
1cfe0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1cff0 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
1d000 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
1d010 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
1d020 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
1d030 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
1d040 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1d050 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
1d060 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
1d070 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
1d080 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1d090 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1d0a0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1d0b0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1d0c0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
1d0d0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
1d0e0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
1d0f0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
1d100 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
1d110 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
1d120 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
1d130 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
1d140 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1d150 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
1d160 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1d170 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1d180 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
1d190 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
1d1a0 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
1d1b0 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a  ->nExpr : 0, 0,.
1d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1d0 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
1d1e0 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
1d1f0 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
1d200 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
1d210 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
1d220 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
1d230 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
1d240 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
1d250 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
1d260 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1d270 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
1d280 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d290 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1d2a0 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
1d2b0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1d2c0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1d2d0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
1d2e0 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
1d2f0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
1d300 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
1d310 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 73 71 6c 69  Mode = 1;.  sqli
1d320 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
1d330 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
1d340 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
1d350 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
1d360 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
1d370 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  , pF++){.    int
1d380 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61   nArg;.    int a
1d390 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ddrNext = 0;.   
1d3a0 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20   int regAgg;.   
1d3b0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1d3c0 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
1d3d0 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
1d3e0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1d3f0 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
1d400 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
1d410 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
1d420 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c  .      nArg = pL
1d430 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
1d440 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74    regAgg = sqlit
1d450 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
1d460 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20  Parse, nArg);.  
1d470 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1d480 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
1d490 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67  se, pList, regAg
1d4a0 67 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g, 0);.    }else
1d4b0 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
1d4c0 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
1d4d0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1d4e0 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
1d4f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
1d500 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
1d510 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1d520 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
1d530 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63  rg==1 );.      c
1d540 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
1d550 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  se, pF->iDistinc
1d560 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
1d570 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  regAgg);.    }. 
1d580 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
1d590 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1d5a0 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
1d5b0 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
1d5c0 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
1d5d0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1d5e0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1d5f0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1d600 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
1d610 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
1d620 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20  =0 if pF->pFunc 
1d630 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a  has NEEDCOLL */.
1d640 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
1d650 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
1d660 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
1d670 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
1d680 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1d690 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1d6a0 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
1d6b0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
1d6c0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
1d6d0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
1d6e0 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
1d6f0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
1d700 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1d710 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1d720 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
1d730 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
1d740 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
1d750 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d760 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1d770 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72  OP_AggStep, 0, r
1d780 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c  egAgg, pF->iMem,
1d790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d7a0 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
1d7b0 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
1d7c0 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  DEF);.    sqlite
1d7d0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1d7e0 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20   (u8)nArg);.    
1d7f0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1d800 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1d810 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20  regAgg, nArg);. 
1d820 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1d830 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1d840 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
1d850 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28  , nArg);.    if(
1d860 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20   addrNext ){.   
1d870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1d880 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
1d890 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73  drNext);.      s
1d8a0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
1d8b0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
1d8c0 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
1d8d0 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pC=pAggInfo->
1d8e0 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f  aCol; i<pAggInfo
1d8f0 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20  ->nAccumulator; 
1d900 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20  i++, pC++){.    
1d910 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1d920 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70  pParse, pC->pExp
1d930 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20  r, pC->iMem);.  
1d940 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  }.  pAggInfo->di
1d950 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  rectMode = 0;.  
1d960 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1d970 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 7d  Clear(pParse);.}
1d980 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1d990 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45   code for the SE
1d9a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67  LECT statement g
1d9b0 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72  iven in the p ar
1d9c0 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  gument.  .**.** 
1d9d0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
1d9e0 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76  distributed in v
1d9f0 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65  arious ways depe
1da00 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
1da10 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1da20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
1da30 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
1da40 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73  by argument pDes
1da50 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t.** as follows:
1da60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74  .**.**     pDest
1da70 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73 75 6c  ->eDest    Resul
1da80 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  t.**     -------
1da90 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
1daa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1dab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1dac0 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ----.**     SRT_
1dad0 4f 75 74 70 75 74 20 20 20 20 20 20 47 65 6e 65  Output      Gene
1dae0 72 61 74 65 20 61 20 72 6f 77 20 6f 66 20 6f 75  rate a row of ou
1daf0 74 70 75 74 20 28 75 73 69 6e 67 20 74 68 65 20  tput (using the 
1db00 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20  OP_ResultRow.** 
1db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db20 20 20 20 20 6f 70 63 6f 64 65 29 20 66 6f 72 20      opcode) for 
1db30 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
1db40 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a  result set..**.*
1db50 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20  *     SRT_Mem   
1db60 20 20 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64        Only valid
1db70 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 69   if the result i
1db80 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  s a single colum
1db90 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  n..**           
1dba0 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20            Store 
1dbb0 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  the first column
1dbc0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65   of the first re
1dbd0 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20  sult row.**     
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbf0 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73  in register pDes
1dc00 74 2d 3e 69 50 61 72 6d 20 74 68 65 6e 20 61 62  t->iParm then ab
1dc10 61 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a  andon the rest.*
1dc20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1dc30 20 20 20 20 20 20 6f 66 20 74 68 65 20 71 75 65        of the que
1dc40 72 79 2e 20 20 54 68 69 73 20 64 65 73 74 69 6e  ry.  This destin
1dc50 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c  ation implies "L
1dc60 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20  IMIT 1"..**.**  
1dc70 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20     SRT_Set      
1dc80 20 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 75     The result mu
1dc90 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63  st be a single c
1dca0 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61  olumn.  Store ea
1dcb0 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ch.**           
1dcc0 20 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f 66            row of
1dcd0 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 6b   result as the k
1dce0 65 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65 73  ey in table pDes
1dcf0 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20  t->iParm. .**   
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd10 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66 69    Apply the affi
1dd20 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66 69  nity pDest->affi
1dd30 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74 6f 72  nity before stor
1dd40 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1dd50 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
1dd60 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d 70  ts.  Used to imp
1dd70 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c 45  lement "IN (SELE
1dd80 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20  CT ...)"..**.** 
1dd90 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20      SRT_Union   
1dda0 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
1ddb0 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  s as a key in a 
1ddc0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1ddd0 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
1dde0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
1ddf0 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
1de00 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
1de10 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1de20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
1de30 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c  .**     SRT_Tabl
1de40 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  e       Store re
1de50 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61  sults in tempora
1de60 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
1de70 69 50 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20 20  iParm..**       
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
1de90 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 45  is is like SRT_E
1dea0 70 68 65 6d 54 61 62 20 65 78 63 65 70 74 20 74  phemTab except t
1deb0 68 61 74 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a  hat the table.**
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ded0 20 20 20 20 20 69 73 20 61 73 73 75 6d 65 64 20       is assumed 
1dee0 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20 6f 70  to already be op
1def0 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  en..**.**     SR
1df00 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43 72  T_EphemTab    Cr
1df10 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72  eate an temporar
1df20 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
1df30 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a  Parm and store.*
1df40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1df50 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c 74        the result
1df60 20 74 68 65 72 65 2e 20 54 68 65 20 63 75 72 73   there. The curs
1df70 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20  or is left open 
1df80 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  after.**        
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1dfa0 75 72 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73  urning.  This is
1dfb0 20 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20   like SRT_Table 
1dfc0 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20  except that.**  
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfe0 20 20 20 74 68 69 73 20 64 65 73 74 69 6e 61 74     this destinat
1dff0 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e  ion uses OP_Open
1e000 45 70 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65  Ephemeral to cre
1e010 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ate.**          
1e020 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74             the t
1e030 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a  able first..**.*
1e040 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74  *     SRT_Corout
1e050 69 6e 65 20 20 20 47 65 6e 65 72 61 74 65 20 61  ine   Generate a
1e060 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
1e070 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72   returns a new r
1e080 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  ow of.**        
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
1e0a0 75 6c 74 73 20 65 61 63 68 20 74 69 6d 65 20 69  ults each time i
1e0b0 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54  t is invoked.  T
1e0c0 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a  he entry point.*
1e0d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e0e0 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d        of the co-
1e0f0 72 6f 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65  routine is store
1e100 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44  d in register pD
1e110 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
1e120 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74 73  *     SRT_Exists
1e130 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31 20        Store a 1 
1e140 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70  in memory cell p
1e150 44 65 73 74 2d 3e 69 50 61 72 6d 20 69 66 20 74  Dest->iParm if t
1e160 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20  he result.**    
1e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e180 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d 70 74   set is not empt
1e190 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  y..**.**     SRT
1e1a0 5f 44 69 73 63 61 72 64 20 20 20 20 20 54 68 72  _Discard     Thr
1e1b0 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  ow the results a
1e1c0 77 61 79 2e 20 20 54 68 69 73 20 69 73 20 75 73  way.  This is us
1e1d0 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a 2a 20  ed by SELECT.** 
1e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1f0 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73 20 77      statements w
1e200 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 20 77  ithin triggers w
1e210 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73  hose only purpos
1e220 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  e is.**         
1e230 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
1e240 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f 66 20  side-effects of 
1e250 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  functions..**.**
1e260 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1e270 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
1e280 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
1e290 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
1e2a0 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
1e2b0 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
1e2c0 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
1e2d0 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
1e2e0 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
1e2f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1e300 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
1e310 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
1e320 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
1e330 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
1e340 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
1e350 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69  to do that..*/.i
1e360 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
1e370 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1e380 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
1e390 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
1e3a0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e3c0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
1e3d0 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
1e3e0 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
1e3f0 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a  t *pDest      /*
1e400 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
1e410 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
1e420 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
1e430 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
1e440 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1e450 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  rs */.  WhereInf
1e460 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f  o *pWInfo;     /
1e470 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71  * Return from sq
1e480 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1e490 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ) */.  Vdbe *v; 
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e4b0 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
1e4c0 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
1e4d0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
1e4e0 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20   isAgg;         
1e4f0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
1e500 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
1e510 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
1e520 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1e530 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
1e540 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
1e550 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
1e560 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
1e570 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
1e580 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
1e590 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
1e5a0 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
1e5b0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1e5c0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
1e5d0 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
1e5e0 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f   *pOrderBy;    /
1e5f0 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
1e600 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
1e610 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
1e620 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
1e630 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
1e640 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
1e650 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
1e660 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
1e670 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
1e680 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
1e690 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  ULL */.  int isD
1e6a0 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
1e6b0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
1e6c0 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
1e6d0 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
1e6e0 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20  int distinct;   
1e6f0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1e700 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
1e710 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20  istinct set */. 
1e720 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
1e730 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1e740 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
1e750 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
1e760 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49  .  int addrSortI
1e770 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64  ndex;     /* Add
1e780 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70  ress of an OP_Op
1e790 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
1e7a0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67  ruction */.  Agg
1e7b0 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20  Info sAggInfo;  
1e7c0 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
1e7d0 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65  on used by aggre
1e7e0 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
1e7f0 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20    int iEnd;     
1e800 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1e810 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f  ess of the end o
1e820 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
1e830 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
1e840 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1e850 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1e860 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50  on */..  db = pP
1e870 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
1e880 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
1e890 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
1e8a0 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
1e8b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
1e8c0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1e8d0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1e8e0 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
1e8f0 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
1e900 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49  .  memset(&sAggI
1e910 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  nfo, 0, sizeof(s
1e920 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 69 66  AggInfo));..  if
1e930 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72  ( IgnorableOrder
1e940 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
1e950 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65   assert(pDest->e
1e960 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73  Dest==SRT_Exists
1e970 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
1e980 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a  ==SRT_Union || .
1e990 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
1e9a0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63  ->eDest==SRT_Exc
1e9b0 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ept || pDest->eD
1e9c0 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64  est==SRT_Discard
1e9d0 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44  );.    /* If ORD
1e9e0 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64  ER BY makes no d
1e9f0 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
1ea00 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69   output then nei
1ea10 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a  ther does.    **
1ea20 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20   DISTINCT so it 
1ea30 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74  can be removed t
1ea40 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  oo. */.    sqlit
1ea50 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
1ea60 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
1ea70 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
1ea80 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  By = 0;.    p->s
1ea90 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
1eaa0 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73  istinct;.  }.  s
1eab0 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
1eac0 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a  (pParse, p, 0);.
1ead0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
1eae0 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61 62  pOrderBy;.  pTab
1eaf0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
1eb00 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
1eb10 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 50 61 72  List;.  if( pPar
1eb20 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
1eb30 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1eb40 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
1eb50 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73 41 67 67  end;.  }.  isAgg
1eb60 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
1eb70 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
1eb80 3d 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  =0;.  assert( pE
1eb90 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  List!=0 );..  /*
1eba0 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
1ebb0 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76  g code..  */.  v
1ebc0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1ebd0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1ebe0 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c   v==0 ) goto sel
1ebf0 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 47  ect_end;..  /* G
1ec00 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1ec10 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
1ec20 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1ec30 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  use.  */.#if !de
1ec40 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1ec50 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1ec60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1ec70 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28  MIT_VIEW).  for(
1ec80 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20  i=0; !p->pPrior 
1ec90 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  && i<pTabList->n
1eca0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
1ecb0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1ecc0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
1ecd0 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20  bList->a[i];.   
1ece0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
1ecf0 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
1ed00 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ub = pItem->pSel
1ed10 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 41  ect;.    int isA
1ed20 67 67 53 75 62 3b 0a 0a 20 20 20 20 69 66 28 20  ggSub;..    if( 
1ed30 70 53 75 62 3d 3d 30 20 7c 7c 20 70 49 74 65 6d  pSub==0 || pItem
1ed40 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29 20  ->isPopulated ) 
1ed50 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
1ed60 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73  * Increment Pars
1ed70 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65  e.nHeight by the
1ed80 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c   height of the l
1ed90 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f  argest expressio
1eda0 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65  n.    ** tree re
1edb0 66 65 72 65 64 20 74 6f 20 62 79 20 74 68 69 73  fered to by this
1edc0 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c  , the parent sel
1edd0 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73  ect. The child s
1ede0 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79  elect.    ** may
1edf0 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73   contain express
1ee00 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20  ion trees of at 
1ee10 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c  most.    ** (SQL
1ee20 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
1ee30 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74  TH-Parse.nHeight
1ee40 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69  ) height. This i
1ee50 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d  s a bit.    ** m
1ee60 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65  ore conservative
1ee70 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c   than necessary,
1ee80 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72   but much easier
1ee90 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a   than enforcing.
1eea0 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20      ** an exact 
1eeb0 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  limit..    */.  
1eec0 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
1eed0 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t += sqlite3Sele
1eee0 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
1eef0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
1ef00 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 75 62  o see if the sub
1ef10 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73  query can be abs
1ef20 6f 72 62 65 64 20 69 6e 74 6f 20 74 68 65 20 70  orbed into the p
1ef30 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 73  arent. */.    is
1ef40 41 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e  AggSub = (pSub->
1ef50 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
1ef60 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20  gregate)!=0;.   
1ef70 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71   if( flattenSubq
1ef80 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
1ef90 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53  i, isAgg, isAggS
1efa0 75 62 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ub) ){.      if(
1efb0 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20   isAggSub ){.   
1efc0 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a       isAgg = 1;.
1efd0 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c          p->selFl
1efe0 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67  ags |= SF_Aggreg
1eff0 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ate;.      }.   
1f000 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     i = -1;.    }
1f010 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1f020 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1f030 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68  t(&dest, SRT_Eph
1f040 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43  emTab, pItem->iC
1f050 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73  ursor);.      as
1f060 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 73 50  sert( pItem->isP
1f070 6f 70 75 6c 61 74 65 64 3d 3d 30 20 29 3b 0a 20  opulated==0 );. 
1f080 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
1f090 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
1f0a0 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
1f0b0 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
1f0c0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
1f0d0 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e   if( /*pParse->n
1f0e0 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c  Err ||*/ db->mal
1f0f0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1f100 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
1f110 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  nd;.    }.    pP
1f120 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
1f130 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
1f140 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20  prHeight(p);.   
1f150 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
1f160 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49 67  Src;.    if( !Ig
1f170 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
1f180 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70  Dest) ){.      p
1f190 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1f1a0 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  derBy;.    }.  }
1f1b0 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
1f1c0 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20  EList;.#endif.  
1f1d0 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
1f1e0 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d  re;.  pGroupBy =
1f1f0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
1f200 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
1f210 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74 69 6e  ving;.  isDistin
1f220 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ct = (p->selFlag
1f230 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
1f240 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  !=0;..#ifndef SQ
1f250 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
1f260 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49  ND_SELECT.  /* I
1f270 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61  f there is are a
1f280 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65   sequence of que
1f290 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72  ries, do the ear
1f2a0 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e  lier ones first.
1f2b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
1f2c0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
1f2d0 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
1f2e0 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  0 ){.      Selec
1f2f0 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68  t *pLoop, *pRigh
1f300 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
1f310 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20   cnt = 0;.      
1f320 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a 20 20  int mxSelect;.  
1f330 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
1f340 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
1f350 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74  oop->pPrior, cnt
1f360 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  ++){.        pLo
1f370 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  op->pRightmost =
1f380 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   p;.        pLoo
1f390 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67 68  p->pNext = pRigh
1f3a0 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67 68  t;.        pRigh
1f3b0 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20  t = pLoop;.     
1f3c0 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c 65 63   }.      mxSelec
1f3d0 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  t = db->aLimit[S
1f3e0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
1f3f0 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a 20 20  OUND_SELECT];.  
1f400 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65 63 74      if( mxSelect
1f410 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65 63 74   && cnt>mxSelect
1f420 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1f430 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1f440 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65  se, "too many te
1f450 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20  rms in compound 
1f460 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20 20  SELECT");.      
1f470 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1f480 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
1f490 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
1f4a0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
1f4b0 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  t);.  }.#endif..
1f4c0 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20    /* If writing 
1f4d0 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e  to memory or gen
1f4e0 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20  erating a set.  
1f4f0 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ** only a single
1f500 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f   column may be o
1f510 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  utput..  */.#ifn
1f520 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f530 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63  SUBQUERY.  if( c
1f540 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
1f550 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50  mnSelectError(pP
1f560 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c  arse, pDest, pEL
1f570 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
1f580 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
1f590 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
1f5a0 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65    /* If possible
1f5b0 2c 20 72 65 77 72 69 74 65 20 74 68 65 20 71 75  , rewrite the qu
1f5c0 65 72 79 20 74 6f 20 75 73 65 20 47 52 4f 55 50  ery to use GROUP
1f5d0 20 42 59 20 69 6e 73 74 65 61 64 20 6f 66 20 44   BY instead of D
1f5e0 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a 20 47 52  ISTINCT..  ** GR
1f5f0 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75 73 65  OUP BY might use
1f600 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53 54 49   an index, DISTI
1f610 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73 2e 0a  NCT never does..
1f620 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1f630 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 7c 7c  ->pGroupBy==0 ||
1f640 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1f650 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
1f660 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   );.  if( (p->se
1f670 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
1f680 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
1f690 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
1f6a0 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 47 72 6f  t ){.    p->pGro
1f6b0 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
1f6c0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
1f6d0 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20  >pEList, 0);.   
1f6e0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
1f6f0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 2d 3e  GroupBy;.    p->
1f700 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
1f710 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 69 73  Distinct;.    is
1f720 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
1f730 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
1f740 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
1f750 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 69  clause, then thi
1f760 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69  s sorting.  ** i
1f770 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75  ndex might end u
1f780 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69  p being unused i
1f790 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62  f the data can b
1f7a0 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65  e .  ** extracte
1f7b0 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20  d in pre-sorted 
1f7c0 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61 74 20  order.  If that 
1f7d0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
1f7e0 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70  n the.  ** OP_Op
1f7f0 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
1f800 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ruction will be 
1f810 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50  changed to an OP
1f820 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20  _Noop once.  ** 
1f830 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  we figure out th
1f840 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  at the sorting i
1f850 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64  ndex is not need
1f860 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72  ed.  The addrSor
1f870 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69  tIndex.  ** vari
1f880 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
1f890 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74 20  facilitate that 
1f8a0 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  change..  */.  i
1f8b0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
1f8c0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
1f8d0 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Info;.    pKeyIn
1f8e0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
1f8f0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1f900 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
1f910 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
1f920 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
1f930 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72  b++;.    p->addr
1f940 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64  OpenEphm[2] = ad
1f950 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20  drSortIndex =.  
1f960 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f970 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
1f980 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9a0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
1f9b0 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72  iECursor, pOrder
1f9c0 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a  By->nExpr+2, 0,.
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9e0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1f9f0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
1fa00 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
1fa10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64  .  }else{.    ad
1fa20 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31  drSortIndex = -1
1fa30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1fa40 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73  he output is des
1fa50 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70  tined for a temp
1fa60 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65  orary table, ope
1fa70 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20  n that table..  
1fa80 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
1fa90 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
1faa0 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
1fab0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1fac0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1fad0 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
1fae0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
1faf0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
1fb00 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a  e limiter..  */.
1fb10 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33    iEnd = sqlite3
1fb20 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1fb30 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
1fb40 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
1fb50 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f  , p, iEnd);..  /
1fb60 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c  * Open a virtual
1fb70 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
1fb80 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
1fb90 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  et..  */.  if( i
1fba0 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
1fbb0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1fbc0 66 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  fo;.    assert( 
1fbd0 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75 70 42  isAgg || pGroupB
1fbe0 79 20 29 3b 0a 20 20 20 20 64 69 73 74 69 6e 63  y );.    distinc
1fbf0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
1fc00 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  ++;.    pKeyInfo
1fc10 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
1fc20 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1fc30 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  ->pEList);.    s
1fc40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1fc50 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
1fc60 65 72 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20  eral, distinct, 
1fc70 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1fc90 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
1fca0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
1fcb0 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  F);.  }else{.   
1fcc0 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a   distinct = -1;.
1fcd0 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67    }..  /* Aggreg
1fce0 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72  ate and non-aggr
1fcf0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 61 72  egate queries ar
1fd00 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72  e handled differ
1fd10 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21  ently */.  if( !
1fd20 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42  isAgg && pGroupB
1fd30 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  y==0 ){.    /* T
1fd40 68 69 73 20 63 61 73 65 20 69 73 20 66 6f 72 20  his case is for 
1fd50 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
1fd60 65 72 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67  eries.    ** Beg
1fd70 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1fd80 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  scan.    */.    
1fd90 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
1fda0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
1fdb0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
1fdc0 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79 2c 20  ere, &pOrderBy, 
1fdd0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  0);.    if( pWIn
1fde0 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
1fdf0 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
1fe00 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
1fe10 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
1fe20 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
1fe30 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
1fe40 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
1fe50 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
1fe60 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
1fe70 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
1fe80 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
1fe90 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
1fea0 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
1feb0 20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e    if( addrSortIn
1fec0 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72  dex>=0 && pOrder
1fed0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
1fee0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1fef0 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
1ff00 72 74 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20  rtIndex, 1);.   
1ff10 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
1ff20 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[2] = -1;.    
1ff30 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  }..    /* Use th
1ff40 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
1ff50 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20   loop.    */.   
1ff60 20 61 73 73 65 72 74 28 21 69 73 44 69 73 74 69   assert(!isDisti
1ff70 6e 63 74 29 3b 0a 20 20 20 20 73 65 6c 65 63 74  nct);.    select
1ff80 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
1ff90 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20  , p, pEList, 0, 
1ffa0 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c  0, pOrderBy, -1,
1ffb0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
1ffd0 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70  fo->iContinue, p
1ffe0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
1fff0 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  .    /* End the 
20000 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
20010 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  op..    */.    s
20020 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
20030 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  WInfo);.  }else{
20040 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
20050 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66  the processing f
20060 6f 72 20 61 67 67 72 65 67 61 74 65 20 71 75 65  or aggregate que
20070 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65  ries */.    Name
20080 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
20090 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
200a0 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61  for processing a
200b0 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61  ggregate informa
200c0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tion */.    int 
200d0 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iAMem;          
200e0 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
200f0 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67  ress for storing
20100 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
20110 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d  Y */.    int iBM
20120 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
20130 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
20140 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47  s for previous G
20150 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
20160 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20  nt iUseFlag;    
20170 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
20180 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69  s holding flag i
20190 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61  ndicating that a
201a0 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
201b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201c0 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  ** one row of th
201d0 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61  e input to the a
201e0 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65  ggregator has be
201f0 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  en.             
20200 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72             ** pr
20210 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69  ocessed */.    i
20220 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20  nt iAbortFlag;  
20230 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
20240 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71  s which causes q
20250 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f  uery abort if po
20260 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e  sitive */.    in
20270 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20  t groupBySort;  
20280 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66    /* Rows come f
20290 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52  rom source in GR
202a0 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a  OUP BY order */.
202b0 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b      int addrEnd;
202c0 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
202d0 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  f processing for
202e0 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a   this SELECT */.
202f0 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  .    /* Remove a
20300 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73  ny and all alias
20310 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72  es between the r
20320 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68  esult set and th
20330 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42  e.    ** GROUP B
20340 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
20350 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
20360 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  y ){.      int k
20370 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20380 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
20390 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
203a0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
203b0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
203c0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
203d0 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ver expression i
203e0 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20  n a list */..   
203f0 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69     for(k=p->pELi
20400 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
20410 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b  =p->pEList->a; k
20420 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
20430 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
20440 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->iAlias = 0;.  
20450 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
20460 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  k=pGroupBy->nExp
20470 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  r, pItem=pGroupB
20480 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  y->a; k>0; k--, 
20490 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
204a0 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20    pItem->iAlias 
204b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
204c0 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65   }.. .    /* Cre
204d0 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a  ate a label to j
204e0 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77  ump to when we w
204f0 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65  ant to abort the
20500 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64   query */.    ad
20510 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
20520 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
20530 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
20540 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
20550 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
20560 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
20570 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
20580 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
20590 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
205a0 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
205b0 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
205c0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
205d0 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
205e0 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
205f0 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
20600 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
20610 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
20620 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
20630 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67  st;.    sNC.pAgg
20640 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
20650 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  ;.    sAggInfo.n
20660 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20  SortingColumn = 
20670 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75  pGroupBy ? pGrou
20680 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30  pBy->nExpr+1 : 0
20690 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70  ;.    sAggInfo.p
206a0 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
206b0 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  By;.    sqlite3E
206c0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
206d0 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b  t(&sNC, pEList);
206e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
206f0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
20700 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  sNC, pOrderBy);.
20710 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
20720 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20730 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
20740 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
20750 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ing);.    }.    
20760 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75  sAggInfo.nAccumu
20770 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f  lator = sAggInfo
20780 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f  .nColumn;.    fo
20790 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
207a0 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  o.nFunc; i++){. 
207b0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
207c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 73 41  prHasProperty(sA
207d0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
207e0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
207f0 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 71  ect) );.      sq
20800 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
20810 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
20820 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
20830 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
20840 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
20850 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
20860 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
20870 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65  d;..    /* Proce
20880 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
20890 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20  ates with GROUP 
208a0 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65  BY is very diffe
208b0 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  rent and.    ** 
208c0 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  much more comple
208d0 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65  x than aggregate
208e0 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55  s without a GROU
208f0 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  P BY..    */.   
20900 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
20910 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
20920 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65  pKeyInfo;  /* Ke
20930 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ying information
20940 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62   for the group b
20950 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  y clause */.    
20960 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20    int j1;       
20970 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20        /* A-vs-B 
20980 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70  comparision jump
20990 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
209a0 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a  drOutputRow;  /*
209b0 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75   Start of subrou
209c0 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
209d0 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  s a result row *
209e0 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f  /.      int regO
209f0 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52  utputRow;   /* R
20a00 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
20a10 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75  gister for outpu
20a20 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  t subroutine */.
20a30 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65        int addrSe
20a40 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74  tAbort;   /* Set
20a50 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20   the abort flag 
20a60 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
20a70 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f      int addrTopO
20a80 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f  fLoop;  /* Top o
20a90 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  f the input loop
20aa0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
20ab0 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a  drSortingIdx; /*
20ac0 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
20ad0 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f  meral for the so
20ae0 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  rting index */. 
20af0 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73       int addrRes
20b00 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72  et;      /* Subr
20b10 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74  outine for reset
20b20 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
20b30 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ator */.      in
20b40 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20  t regReset;     
20b50 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
20b60 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
20b70 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e   reset subroutin
20b80 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49  e */..      /* I
20b90 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f  f there is a GRO
20ba0 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20  UP BY clause we 
20bb0 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72  might need a sor
20bc0 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20  ting index to.  
20bd0 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
20be0 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74   it.  Allocate t
20bf0 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  hat sorting inde
20c00 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75  x now.  If it tu
20c10 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a  rns out.      **
20c20 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
20c30 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c  need it after al
20c40 6c 2c 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d  l, the OpenEphem
20c50 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
20c60 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
20c70 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
20c80 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20   a Noop.  .     
20c90 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e   */.      sAggIn
20ca0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20  fo.sortingIdx = 
20cb0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
20cc0 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
20cd0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
20ce0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
20cf0 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64  oupBy);.      ad
20d00 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73  drSortingIdx = s
20d10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
20d20 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
20d30 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  eral, .         
20d40 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
20d50 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  gIdx, sAggInfo.n
20d60 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a  SortingColumn, .
20d70 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68            0, (ch
20d80 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
20d90 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
20da0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
20db0 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
20dc0 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
20dd0 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67   GROUP BY aggreg
20de0 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ate processing. 
20df0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55       */.      iU
20e00 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  seFlag = ++pPars
20e10 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
20e20 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50  AbortFlag = ++pP
20e30 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
20e40 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d    regOutputRow =
20e50 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
20e60 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
20e70 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
20e80 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
20e90 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d        regReset =
20ea0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
20eb0 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74  .      addrReset
20ec0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
20ed0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
20ee0 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
20ef0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
20f00 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
20f10 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
20f20 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
20f30 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
20f40 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
20f50 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
20f60 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
20f70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20f80 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
20f90 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
20fa0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
20fb0 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62  nt((v, "clear ab
20fc0 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
20fd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20fe0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
20ff0 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29  er, 0, iUseFlag)
21000 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
21010 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
21020 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d  e accumulator em
21030 70 74 79 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  pty"));..      /
21040 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74  * Begin a loop t
21050 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
21060 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73   all source rows
21070 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
21080 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  er..      ** Thi
21090 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20  s might involve 
210a0 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f  two separate loo
210b0 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f  ps with an OP_So
210c0 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f  rt in between, o
210d0 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  r.      ** it mi
210e0 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ght be a single 
210f0 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61  loop that uses a
21100 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61  n index to extra
21110 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ct information. 
21120 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
21130 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65  ight order to be
21140 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20  gin with..      
21150 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
21160 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21170 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
21180 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
21190 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
211a0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
211b0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
211c0 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70   pWhere, &pGroup
211d0 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  By, 0);.      if
211e0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
211f0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
21200 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42       if( pGroupB
21210 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
21220 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
21230 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
21240 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
21250 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
21260 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
21270 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
21280 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
21290 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
212a0 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
212b0 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
212c0 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
212d0 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
212e0 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
212f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72    */.        pGr
21300 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
21310 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f  pBy;.        gro
21320 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
21330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21340 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
21350 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
21360 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
21370 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
21380 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
21390 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
213a0 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
213b0 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
213c0 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
213d0 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
213e0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
213f0 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
21400 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
21410 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
21420 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
21430 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
21440 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
21450 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
21460 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
21470 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
21480 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
21490 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
214a0 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42  .        nGroupB
214b0 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y = pGroupBy->nE
214c0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  xpr;.        nCo
214d0 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20 31  l = nGroupBy + 1
214e0 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
214f0 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20  roupBy+1;.      
21500 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
21510 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
21520 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
21530 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  f( sAggInfo.aCol
21540 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  [i].iSorterColum
21550 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
21560 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
21570 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
21580 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21590 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61   }.        regBa
215a0 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
215b0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
215c0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
215d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
215e0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
215f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
21600 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
21610 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c  Parse, pGroupBy,
21620 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20   regBase, 0);.  
21630 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21640 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
21650 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f  quence, sAggInfo
21660 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67 42  .sortingIdx,regB
21670 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20  ase+nGroupBy);. 
21680 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
21690 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66  pBy+1;.        f
216a0 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
216b0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
216c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
216d0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
216e0 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f  pCol = &sAggInfo
216f0 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  .aCol[i];.      
21700 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
21710 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
21720 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
21730 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61  t r1 = j + regBa
21740 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
21750 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20  int r2;..       
21760 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
21770 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
21780 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  mn(pParse, .    
21790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217a0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
217b0 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f  >pTab, pCol->iCo
217c0 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62  lumn, pCol->iTab
217d0 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20  le, r1, 0);.    
217e0 20 20 20 20 20 20 20 20 69 66 28 20 72 31 21 3d          if( r1!=
217f0 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r2 ){.          
21800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21810 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
21820 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20  y, r2, r1);.    
21830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21840 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
21850 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
21860 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f  .        regReco
21870 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
21880 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
21890 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
218a0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
218b0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
218c0 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65  ase, nCol, regRe
218d0 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
218e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
218f0 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
21900 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
21910 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64  ngIdx, regRecord
21920 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21930 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
21940 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
21950 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
21960 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
21970 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
21980 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  Base, nCol);.   
21990 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
219a0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
219b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
219c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
219d0 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
219e0 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64  tingIdx, addrEnd
219f0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
21a00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55  omment((v, "GROU
21a10 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20 20  P BY sort"));.  
21a20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75        sAggInfo.u
21a30 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31  seSortingIdx = 1
21a40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21a50 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
21a60 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
21a70 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75  ..      /* Evalu
21a80 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
21a90 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
21aa0 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20  nd store in b0, 
21ab0 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20  b1, b2....      
21ac0 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79  ** (b0 is memory
21ad0 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b   location iBMem+
21ae0 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31  0, b1 is iBMem+1
21af0 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a  , and so forth).
21b00 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f        ** Then co
21b10 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e  mpare the curren
21b20 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
21b30 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f   against the GRO
21b40 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20  UP BY terms.    
21b50 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72    ** from the pr
21b60 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65  evious row curre
21b70 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61  ntly stored in a
21b80 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20  0, a1, a2....   
21b90 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
21ba0 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69  TopOfLoop = sqli
21bb0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
21bc0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
21bd0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
21be0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
21bf0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72    for(j=0; j<pGr
21c00 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b  oupBy->nExpr; j+
21c10 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
21c20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
21c30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21c40 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
21c50 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66  _Column, sAggInf
21c60 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a 2c  o.sortingIdx, j,
21c70 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
21c80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21c90 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72      sAggInfo.dir
21ca0 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ectMode = 1;.   
21cb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
21cc0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
21cd0 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45  GroupBy->a[j].pE
21ce0 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  xpr, iBMem+j);. 
21cf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21d00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21d10 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
21d20 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69  ompare, iAMem, i
21d30 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  BMem, pGroupBy->
21d40 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
21d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d60 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
21d70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
21d80 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65       j1 = sqlite
21d90 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
21da0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
21db0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
21dc0 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30  OP_Jump, j1+1, 0
21dd0 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20  , j1+1);..      
21de0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
21df0 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65   that runs whene
21e00 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  ver the GROUP BY
21e10 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20   changes..      
21e20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68  ** Changes in th
21e30 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64  e GROUP BY are d
21e40 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70  etected by the p
21e50 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20  revious code.   
21e60 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66     ** block.  If
21e70 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63   there were no c
21e80 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f  hanges, this blo
21e90 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  ck is skipped.. 
21ea0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
21eb0 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65   This code copie
21ec0 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20  s current group 
21ed0 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62  by terms in b0,b
21ee0 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a  1,b2,....      *
21ef0 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c  * over to a0,a1,
21f00 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c  a2.  It then cal
21f10 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  ls the output su
21f20 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
21f30 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65  * and resets the
21f40 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
21f50 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
21f60 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a   in preparation.
21f70 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
21f80 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62   next GROUP BY b
21f90 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atch..      */. 
21fa0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21fb0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
21fc0 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70   iBMem, iAMem, p
21fd0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b  GroupBy->nExpr);
21fe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21ff0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
22000 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
22010 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
22020 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
22030 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
22040 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20  t one row"));.  
22050 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22060 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
22070 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61  s, iAbortFlag, a
22080 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56  ddrEnd);.      V
22090 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
220a0 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
220b0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
220c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
220d0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
220e0 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
220f0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
22100 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63  t((v, "reset acc
22110 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
22120 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
22130 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
22140 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f  mulators based o
22150 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
22160 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
22170 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20  rrent row.      
22180 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
22190 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
221a0 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74  j1);.      updat
221b0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
221c0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
221d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
221e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
221f0 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46  nteger, 1, iUseF
22200 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
22210 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
22220 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63  icate data in ac
22230 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
22240 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
22250 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f  he loop.      */
22260 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
22270 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
22280 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22290 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
222a0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
222b0 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f  Idx, addrTopOfLo
222c0 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  op);.      }else
222d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
222e0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
222f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
22300 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
22310 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e  op(v, addrSortin
22320 67 49 64 78 2c 20 31 29 3b 0a 20 20 20 20 20 20  gIdx, 1);.      
22330 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70  }..      /* Outp
22340 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  ut the final row
22350 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20   of result.     
22360 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
22370 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22380 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70  P_Gosub, regOutp
22390 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75  utRow, addrOutpu
223a0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
223b0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75  eComment((v, "ou
223c0 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29  tput final row")
223d0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d  );..      /* Jum
223e0 70 20 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f  p over the subro
223f0 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a  utines.      */.
22400 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22410 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
22420 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64 29 3b  to, 0, addrEnd);
22430 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
22440 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
22450 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
22460 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
22470 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
22480 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62  * set.  This sub
22490 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f  routine first lo
224a0 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46  oks at the iUseF
224b0 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61  lag.  If iUseFla
224c0 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65  g.      ** is le
224d0 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
224e0 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75   to zero, the su
224f0 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f  broutine is a no
22500 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a  -op.  If.      *
22510 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  * the processing
22520 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71   calls for the q
22530 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74  uery to abort, t
22540 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  his subroutine. 
22550 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e       ** incremen
22560 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61  ts the iAbortFla
22570 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  g memory locatio
22580 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
22590 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ng in.      ** o
225a0 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74  rder to signal t
225b0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f  he caller to abo
225c0 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rt..      */.   
225d0 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20     addrSetAbort 
225e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
225f0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
22600 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22610 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
22620 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61  er, 1, iAbortFla
22630 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
22640 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61  mment((v, "set a
22650 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
22660 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22670 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
22680 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
22690 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
226a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
226b0 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  (v, addrOutputRo
226c0 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  w);.      addrOu
226d0 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
226e0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
226f0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
22700 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22710 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c  OP_IfPos, iUseFl
22720 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ag, addrOutputRo
22730 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  w+2);.      Vdbe
22740 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f  Comment((v, "Gro
22750 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
22760 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e  rator entry poin
22770 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t"));.      sqli
22780 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
22790 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
227a0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
227b0 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
227c0 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
227d0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
227e0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
227f0 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
22800 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ng, addrOutputRo
22810 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  w+1, SQLITE_JUMP
22820 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
22830 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
22840 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
22850 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
22860 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
22870 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69             disti
22880 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
22890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228a0 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b    addrOutputRow+
228b0 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 29  1, addrSetAbort)
228c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
228d0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
228e0 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
228f0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
22900 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
22910 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74  d groupby result
22920 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a   generator"));..
22930 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
22940 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
22950 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74  hat will reset t
22960 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75  he group-by accu
22970 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f  mulator.      */
22980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22990 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
229a0 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
229b0 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
229c0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
229d0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
229e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
229f0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
22a00 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a  egReset);.     .
22a10 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
22a20 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20  GroupBy.  Begin 
22a30 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
22a40 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20  s without GROUP 
22a50 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  BY: */.    else 
22a60 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
22a70 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e   *pDel = 0;.#ifn
22a80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22a90 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20  BTREECOUNT.     
22aa0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
22ab0 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20      if( (pTab = 
22ac0 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c  isSimpleCount(p,
22ad0 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20   &sAggInfo))!=0 
22ae0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
22af0 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29   isSimpleCount()
22b00 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
22b10 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74  er to a Table st
22b20 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20  ructure, then.  
22b30 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
22b40 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66   statement is of
22b50 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20   the form:.     
22b60 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
22b70 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
22b80 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20  *) FROM <tbl>.  
22b90 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
22ba0 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54 61   ** where the Ta
22bb0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 72 65  ble structure re
22bc0 74 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74  turned represent
22bd0 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20  s table <tbl>.. 
22be0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
22bf0 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d    ** This statem
22c00 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e  ent is so common
22c10 20 74 68 61 74 20 69 74 20 69 73 20 6f 70 74 69   that it is opti
22c20 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e  mized specially.
22c30 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
22c40 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63  OP_Count instruc
22c50 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64  tion is executed
22c60 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69   either on the i
22c70 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74  ntkey table that
22c80 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
22c90 61 69 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f  ains the data fo
22ca0 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72  r table <tbl> or
22cb0 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69   on one of its i
22cc0 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20  ndexes. It.     
22cd0 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20     ** is better 
22ce0 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 6f  to execute the o
22cf0 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61  p on an index, a
22d00 73 20 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c  s indexes are al
22d10 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  most.        ** 
22d20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20 61 63  always spread ac
22d30 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73 20  ross less pages 
22d40 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65  than their corre
22d50 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e  sponding tables.
22d60 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
22d70 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
22d80 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
22d90 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
22da0 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
22db0 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ma);.        con
22dc0 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50  st int iCsr = pP
22dd0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
22de0 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73    /* Cursor to s
22df0 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  can b-tree */.  
22e00 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
22e10 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
22e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
22e30 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
22e40 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  */.        KeyIn
22e50 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30  fo *pKeyInfo = 0
22e60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22e70 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73  /* Keyinfo for s
22e80 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a  canned index */.
22e90 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
22ea0 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Best = 0;       
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ec0 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64  Best index found
22ed0 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
22ee0 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70     int iRoot = p
22ef0 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20  Tab->tnum;      
22f00 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
22f10 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20  page of scanned 
22f20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20  b-tree */..     
22f30 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
22f40 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
22f50 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  e, iDb);.       
22f60 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
22f70 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
22f80 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
22f90 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  ab->zName);..   
22fa0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
22fb0 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  or the index tha
22fc0 74 20 68 61 73 20 74 68 65 20 6c 65 61 73 74 20  t has the least 
22fd0 61 6d 6f 75 6e 74 20 6f 66 20 63 6f 6c 75 6d 6e  amount of column
22fe0 73 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a  s. If.        **
22ff0 20 74 68 65 72 65 20 69 73 20 73 75 63 68 20 61   there is such a
23000 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 74 20  n index, and it 
23010 68 61 73 20 6c 65 73 73 20 63 6f 6c 75 6d 6e 73  has less columns
23020 20 74 68 61 6e 20 74 68 65 20 74 61 62 6c 65 0a   than the table.
23030 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 2c          ** does,
23040 20 74 68 65 6e 20 77 65 20 63 61 6e 20 61 73 73   then we can ass
23050 75 6d 65 20 74 68 61 74 20 69 74 20 63 6f 6e 73  ume that it cons
23060 75 6d 65 73 20 6c 65 73 73 20 73 70 61 63 65 20  umes less space 
23070 6f 6e 20 64 69 73 6b 20 61 6e 64 0a 20 20 20 20  on disk and.    
23080 20 20 20 20 2a 2a 20 77 69 6c 6c 20 74 68 65 72      ** will ther
23090 65 66 6f 72 65 20 62 65 20 63 68 65 61 70 65 72  efore be cheaper
230a0 20 74 6f 20 73 63 61 6e 20 74 6f 20 64 65 74 65   to scan to dete
230b0 72 6d 69 6e 65 20 74 68 65 20 71 75 65 72 79 20  rmine the query 
230c0 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20  result..        
230d0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
230e0 73 65 74 20 69 52 6f 6f 74 20 74 6f 20 74 68 65  set iRoot to the
230f0 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
23100 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62  r of the index b
23110 2d 74 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a  -tree.        **
23120 20 61 6e 64 20 70 4b 65 79 49 6e 66 6f 20 74 6f   and pKeyInfo to
23130 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
23140 75 63 74 75 72 65 20 72 65 71 75 69 72 65 64 20  ucture required 
23150 74 6f 20 6e 61 76 69 67 61 74 65 20 74 68 65 0a  to navigate the.
23160 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
23170 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
23180 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74       ** In pract
23190 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ice the KeyInfo 
231a0 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e  structure will n
231b0 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69  ot be used. It i
231c0 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20  s only .        
231d0 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65  ** passed to kee
231e0 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61  p OP_OpenRead ha
231f0 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ppy..        */.
23200 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
23210 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
23220 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
23230 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
23240 20 20 69 66 28 20 21 70 42 65 73 74 20 7c 7c 20    if( !pBest || 
23250 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 42  pIdx->nColumn<pB
23260 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  est->nColumn ){.
23270 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73              pBes
23280 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  t = pIdx;.      
23290 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
232a0 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73          if( pBes
232b0 74 20 26 26 20 70 42 65 73 74 2d 3e 6e 43 6f 6c  t && pBest->nCol
232c0 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  umn<pTab->nCol )
232d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f  {.          iRoo
232e0 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b  t = pBest->tnum;
232f0 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49  .          pKeyI
23300 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  nfo = sqlite3Ind
23310 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
23320 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
23330 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
23340 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Open a read-only
23350 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65   cursor, execute
23360 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63   the OP_Count, c
23370 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e  lose the cursor.
23380 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
23390 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
233a0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43   OP_OpenRead, iC
233b0 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 29 3b  sr, iRoot, iDb);
233c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
233d0 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
233e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
233f0 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
23400 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  har *)pKeyInfo, 
23410 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
23420 46 46 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  FF);.        }. 
23430 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23440 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
23450 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67  ount, iCsr, sAgg
23460 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d  Info.aFunc[0].iM
23470 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
23480 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
23490 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72  , OP_Close, iCsr
234a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
234b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
234c0 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20  OMIT_BTREECOUNT 
234d0 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
234e0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
234f0 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f  he query is of o
23500 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
23510 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20  ing forms:.     
23520 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
23530 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29     SELECT min(x)
23540 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
23550 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61    **   SELECT ma
23560 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  x(x) FROM ....  
23570 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
23580 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68   ** If it is, th
23590 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20  en ask the code 
235a0 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74  in where.c to at
235b0 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65  tempt to sort re
235c0 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  sults.        **
235d0 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73   as if there was
235e0 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22   an "ORDER ON x"
235f0 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20   or "ORDER ON x 
23600 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20  DESC" clause. . 
23610 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65         ** If whe
23620 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20  re.c is able to 
23630 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20  produce results 
23640 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f  sorted in this o
23650 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20  rder, then.     
23660 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63     ** add vdbe c
23670 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ode to break out
23680 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69   of the processi
23690 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68  ng loop after th
236a0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  e .        ** fi
236b0 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73  rst iteration (s
236c0 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69  ince the first i
236d0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
236e0 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20  loop is .       
236f0 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
23700 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
23710 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69   row with the mi
23720 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d  nimum or maximum
23730 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c   .        ** val
23740 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c  ue of x, the onl
23750 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e  y row required).
23760 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
23770 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c      ** A special
23780 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61   flag must be pa
23790 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
237a0 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73  hereBegin() to s
237b0 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20  lightly.        
237c0 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69  ** modify behavi
237d0 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  our as follows:.
237e0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
237f0 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65     **   + If the
23800 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c   query is a "SEL
23810 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65  ECT min(x)", the
23820 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64  n the loop coded
23830 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   by.        **  
23840 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c     where.c shoul
23850 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76  d not iterate ov
23860 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69  er any values wi
23870 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a  th a NULL value.
23880 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66          **     f
23890 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  or x..        **
238a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
238b0 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f  The optimizer co
238c0 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74  de in where.c (t
238d0 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65  he thing that de
238e0 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20  cides which.    
238f0 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78      **     index
23900 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75   or indices to u
23910 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65  se) should place
23920 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69   a different pri
23930 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20  ority on .      
23940 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79    **     satisfy
23950 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42  ing the 'ORDER B
23960 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69  Y' clause than i
23970 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20  t does in other 
23980 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  cases..        *
23990 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63  *     Refer to c
239a0 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ode and comments
239b0 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20   in where.c for 
239c0 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20  details..       
239d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
239e0 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20  List *pMinMax = 
239f0 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c  0;.        u8 fl
23a00 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79  ag = minMaxQuery
23a10 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
23a20 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20   flag ){.       
23a30 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
23a40 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70  HasProperty(p->p
23a50 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
23a60 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
23a70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   );.          pM
23a80 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45  inMax = sqlite3E
23a90 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
23aa0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
23ab0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 30 29  Expr->x.pList,0)
23ac0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c  ;.          pDel
23ad0 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20   = pMinMax;.    
23ae0 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61        if( pMinMa
23af0 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  x && !db->malloc
23b00 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
23b10 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
23b20 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
23b30 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45  flag!=WHERE_ORDE
23b40 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20  RBY_MIN ?1:0;.  
23b50 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
23b60 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  x->a[0].pExpr->o
23b70 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
23b80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23b90 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
23ba0 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e  /* This case run
23bb0 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61  s if the aggrega
23bc0 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20  te has no GROUP 
23bd0 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
23be0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
23bf0 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69  ssing is much si
23c00 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72  mpler since ther
23c10 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e is only a sing
23c20 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a  le row.        *
23c30 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20  * of output..   
23c40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23c50 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
23c60 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
23c70 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49  fo);.        pWI
23c80 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
23c90 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
23ca0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
23cb0 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 66 6c 61 67  , &pMinMax, flag
23cc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
23cd0 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  WInfo==0 ){.    
23ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23cf0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
23d00 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  pDel);.         
23d10 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
23d20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23d30 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
23d40 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
23d50 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
23d60 20 20 69 66 28 20 21 70 4d 69 6e 4d 61 78 20 26    if( !pMinMax &
23d70 26 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  & flag ){.      
23d80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23d90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
23da0 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  , 0, pWInfo->iBr
23db0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eak);.          
23dc0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
23dd0 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c  "%s() by index",
23de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23df0 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52   (flag==WHERE_OR
23e00 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a  DERBY_MIN?"min":
23e10 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20  "max")));.      
23e20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
23e30 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
23e40 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e  fo);.        fin
23e50 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
23e60 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
23e70 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  nfo);.      }.. 
23e80 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
23e90 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
23ea0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
23eb0 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
23ec0 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  rEnd, SQLITE_JUM
23ed0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
23ee0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
23ef0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
23f00 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d  List, 0, 0, 0, -
23f10 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  1, .            
23f20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c            pDest,
23f30 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e   addrEnd, addrEn
23f40 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
23f50 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
23f60 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d  db, pDel);.    }
23f70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
23f80 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
23f90 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20  addrEnd);.    . 
23fa0 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72   } /* endif aggr
23fb0 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a  egate query */..
23fc0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
23fd0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
23fe0 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
23ff0 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
24000 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
24010 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
24020 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
24030 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
24040 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
24050 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
24060 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70  (pParse, p, v, p
24070 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44  EList->nExpr, pD
24080 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  est);.  }..  /* 
24090 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
240a0 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  p this query.  *
240b0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
240c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
240d0 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  End);..  /* The 
240e0 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65  SELECT was succe
240f0 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20  ssfully coded.  
24100 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   Set the return 
24110 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74  code to 0.  ** t
24120 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72  o indicate no er
24130 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  rors..  */.  rc 
24140 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72  = 0;..  /* Contr
24150 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65  ol jumps to here
24160 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
24170 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76  encountered abov
24180 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20  e, or upon.  ** 
24190 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e  successful codin
241a0 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  g of the SELECT.
241b0 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64  .  */.select_end
241c0 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  :..  /* Identify
241d0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66   column names if
241e0 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
241f0 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65  SELECT are to be
24200 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20   output..  */.  
24210 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24220 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73  K && pDest->eDes
24230 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
24240 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
24250 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
24260 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
24270 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  t);.  }..  sqlit
24280 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
24290 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73  gInfo.aCol);.  s
242a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
242b0 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29   sAggInfo.aFunc)
242c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
242d0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
242e0 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
242f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
24340 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
24350 63 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f 72  code is used for
24360 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
24370 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68  ugging only.  Th
24380 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66  e code.** that f
24390 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20  ollows does not 
243a0 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c  appear in normal
243b0 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54   builds..**.** T
243c0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
243d0 65 20 75 73 65 64 20 74 6f 20 70 72 69 6e 74 20  e used to print 
243e0 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  out the content 
243f0 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f  of all or part o
24400 66 20 61 20 0a 2a 2a 20 70 61 72 73 65 20 73 74  f a .** parse st
24410 72 75 63 74 75 72 65 73 20 73 75 63 68 20 61 73  ructures such as
24420 20 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72 2e   Select or Expr.
24430 20 20 53 75 63 68 20 70 72 69 6e 74 6f 75 74 73    Such printouts
24440 20 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66   are useful.** f
24450 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e  or helping to un
24460 64 65 72 73 74 61 6e 64 20 77 68 61 74 20 69 73  derstand what is
24470 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 73 69 64   happening insid
24480 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  e the code gener
24490 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74  ator.** during t
244a0 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  he execution of 
244b0 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54 20 73  complex SELECT s
244c0 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
244d0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20 61   These routine a
244e0 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e  re not called an
244f0 79 77 68 65 72 65 20 66 72 6f 6d 20 77 69 74 68  ywhere from with
24500 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a  in the normal.**
24510 20 63 6f 64 65 20 62 61 73 65 2e 20 20 54 68 65   code base.  The
24520 6e 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74  n are intended t
24530 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  o be called from
24540 20 77 69 74 68 69 6e 20 74 68 65 20 64 65 62 75   within the debu
24550 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20  gger.** or from 
24560 74 65 6d 70 6f 72 61 72 79 20 22 70 72 69 6e 74  temporary "print
24570 66 22 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  f" statements in
24580 73 65 72 74 65 64 20 66 6f 72 20 64 65 62 75 67  serted for debug
24590 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ging..*/.void sq
245a0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 45  lite3PrintExpr(E
245b0 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21  xpr *p){.  if( !
245c0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
245d0 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
245e0 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
245f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
24600 75 67 50 72 69 6e 74 66 28 22 28 25 73 22 2c 20  ugPrintf("(%s", 
24610 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  p->u.zToken);.  
24620 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
24630 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
24640 25 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d  %d", p->op);.  }
24650 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20  .  if( p->pLeft 
24660 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
24670 62 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a  bugPrintf(" ");.
24680 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
24690 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a  Expr(p->pLeft);.
246a0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52 69    }.  if( p->pRi
246b0 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
246c0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
246d0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
246e0 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 52 69 67  rintExpr(p->pRig
246f0 68 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ht);.  }.  sqlit
24700 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 29  e3DebugPrintf(")
24710 22 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  ");.}.void sqlit
24720 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28  e3PrintExprList(
24730 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
24740 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
24750 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
24760 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
24770 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
24780 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
24790 70 72 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 70  pr);.    if( i<p
247a0 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b  List->nExpr-1 ){
247b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
247c0 62 75 67 50 72 69 6e 74 66 28 22 2c 20 22 29 3b  bugPrintf(", ");
247d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69  .    }.  }.}.voi
247e0 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65  d sqlite3PrintSe
247f0 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
24800 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73  int indent){.  s
24810 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24820 66 28 22 25 2a 73 53 45 4c 45 43 54 28 25 70 29  f("%*sSELECT(%p)
24830 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20   ", indent, "", 
24840 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 72 69  p);.  sqlite3Pri
24850 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  ntExprList(p->pE
24860 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
24870 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
24880 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63  );.  if( p->pSrc
24890 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50   ){.    char *zP
248a0 72 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 69  refix;.    int i
248b0 3b 0a 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20  ;.    zPrefix = 
248c0 22 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28  "FROM";.    for(
248d0 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e  i=0; i<p->pSrc->
248e0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
248f0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
24900 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
24910 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  p->pSrc->a[i];. 
24920 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24930 67 50 72 69 6e 74 66 28 22 25 2a 73 20 22 2c 20  gPrintf("%*s ", 
24940 69 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69  indent+6, zPrefi
24950 78 29 3b 0a 20 20 20 20 20 20 7a 50 72 65 66 69  x);.      zPrefi
24960 78 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66  x = "";.      if
24970 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
24980 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
24990 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
249a0 28 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73  (\n");.        s
249b0 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63  qlite3PrintSelec
249c0 74 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  t(pItem->pSelect
249d0 2c 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20  , indent+10);.  
249e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
249f0 75 67 50 72 69 6e 74 66 28 22 25 2a 73 29 22 2c  ugPrintf("%*s)",
24a00 20 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a   indent+8, "");.
24a10 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
24a20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a  pItem->zName ){.
24a30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
24a40 65 62 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c  ebugPrintf("%s",
24a50 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
24a60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
24a70 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b  ( pItem->pTab ){
24a80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24a90 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 74 61  DebugPrintf("(ta
24aa0 62 6c 65 3a 20 25 73 29 22 2c 20 70 49 74 65 6d  ble: %s)", pItem
24ab0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pTab->zName);.
24ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
24ad0 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
24ae0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
24af0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
24b00 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  AS %s", pItem->z
24b10 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a  Alias);.      }.
24b20 20 20 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70        if( i<p->p
24b30 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20  Src->nSrc-1 ){. 
24b40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
24b50 62 75 67 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a  bugPrintf(",");.
24b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
24b70 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24b80 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ("\n");.    }.  
24b90 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  }.  if( p->pWher
24ba0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
24bb0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
24bc0 20 57 48 45 52 45 20 22 2c 20 69 6e 64 65 6e 74   WHERE ", indent
24bd0 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  , "");.    sqlit
24be0 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70  e3PrintExpr(p->p
24bf0 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
24c00 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24c10 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
24c20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  p->pGroupBy ){. 
24c30 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24c40 72 69 6e 74 66 28 22 25 2a 73 20 47 52 4f 55 50  rintf("%*s GROUP
24c50 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22   BY ", indent, "
24c60 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
24c70 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  rintExprList(p->
24c80 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
24c90 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24ca0 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  f("\n");.  }.  i
24cb0 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b  f( p->pHaving ){
24cc0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
24cd0 67 50 72 69 6e 74 66 28 22 25 2a 73 20 48 41 56  gPrintf("%*s HAV
24ce0 49 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22  ING ", indent, "
24cf0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
24d00 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 48 61 76  rintExpr(p->pHav
24d10 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ing);.    sqlite
24d20 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
24d30 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ");.  }.  if( p-
24d40 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
24d50 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24d60 6e 74 66 28 22 25 2a 73 20 4f 52 44 45 52 20 42  ntf("%*s ORDER B
24d70 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  Y ", indent, "")
24d80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
24d90 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  ntExprList(p->pO
24da0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c  rderBy);.    sql
24db0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24dc0 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20  "\n");.  }.}./* 
24dd0 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63  End of the struc
24de0 74 75 72 65 20 64 65 62 75 67 20 70 72 69 6e 74  ture debug print
24df0 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a  ing code.*******
24e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24e40 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f  ******/.#endif /
24e50 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
24e60 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
24e70 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
24e80 2a 2f 0a                                         */.