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

Artifact 67b0778c9585905c8aa75aaa469e76ef3c1d315a:


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 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
65a0: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
65b0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
65c0: 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54 61   ){.    pseudoTa
65d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
65e0: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
65f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6600: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65 75  OpenPseudo, pseu
6610: 64 6f 54 61 62 2c 20 65 44 65 73 74 3d 3d 53 52  doTab, eDest==SR
6620: 54 5f 4f 75 74 70 75 74 2c 20 6e 43 6f 6c 75 6d  T_Output, nColum
6630: 6e 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d  n);.  }.  addr =
6640: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
6650: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
6660: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
6670: 61 6b 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  ak);.  codeOffse
6680: 74 28 76 2c 20 70 2c 20 61 64 64 72 43 6f 6e 74  t(v, p, addrCont
6690: 69 6e 75 65 29 3b 0a 20 20 72 65 67 52 6f 77 20  inue);.  regRow 
66a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
66b0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72  Reg(pParse);.  r
66c0: 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  egRowid = sqlite
66d0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
66e0: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
66f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
6700: 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72  olumn, iTab, pOr
6710: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31  derBy->nExpr + 1
6720: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73 77 69  , regRow);.  swi
6730: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
6740: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
6750: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
6760: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
6770: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
6780: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
6790: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
67a0: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
67b0: 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
67c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
67d0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
67e0: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
67f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6800: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
6810: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
6820: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
6830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6840: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
6850: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
6860: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6870: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6880: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
6890: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
68a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
68b0: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
68c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
68d0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
68e0: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31  ecord, regRow, 1
68f0: 2c 20 72 65 67 52 6f 77 69 64 2c 20 26 70 2d 3e  , regRowid, &p->
6900: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
6910: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
6920: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
6930: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  ge(pParse, regRo
6940: 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  w, 1);.      sql
6950: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6960: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
6970: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
6980: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6990: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
69a0: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
69b0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
69c0: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
69d0: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
69e0: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 69  Parse, regRow, i
69f0: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
6a00: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
6a10: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
6a20: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
6a30: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
6a40: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
6a50: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
6a60: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
6a70: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
6a80: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
6a90: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
6aa0: 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65  ine ); .      te
6ab0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6ac0: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
6ad0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
6ae0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
6af0: 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e );.      sqlit
6b00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6b10: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
6b20: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
6b30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6b40: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
6b50: 70 73 65 75 64 6f 54 61 62 2c 20 72 65 67 52 6f  pseudoTab, regRo
6b60: 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  w, regRowid);.  
6b70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
6b80: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
6b90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
6ba0: 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69 4d 65  gRow!=pDest->iMe
6bb0: 6d 2b 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73  m+i );.        s
6bc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6bd0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
6be0: 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65  seudoTab, i, pDe
6bf0: 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20 20  st->iMem+i);.   
6c00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
6c10: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
6c20: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6c30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6c40: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
6c50: 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c  Dest->iMem, nCol
6c60: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  umn);.        sq
6c70: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
6c80: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
6c90: 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d  rse, pDest->iMem
6ca0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
6cb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6cc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6cd0: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
6ce0: 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20  pDest->iParm);. 
6cf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6d00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
6d10: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
6d20: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
6d30: 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65 33  gRow);.  sqlite3
6d40: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6d50: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29  Parse, regRowid)
6d60: 3b 0a 0a 20 20 2f 2a 20 4c 49 4d 49 54 20 68 61  ;..  /* LIMIT ha
6d70: 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74  s been implement
6d80: 65 64 20 62 79 20 74 68 65 20 70 75 73 68 4f 6e  ed by the pushOn
6d90: 74 6f 53 6f 72 74 65 72 28 29 20 72 6f 75 74 69  toSorter() routi
6da0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ne..  */.  asser
6db0: 74 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20  t( p->iLimit==0 
6dc0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74  );..  /* The bot
6dd0: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  tom of the loop.
6de0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
6df0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
6e00: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
6e10: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6e20: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
6e30: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20   iTab, addr);.  
6e40: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
6e50: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
6e60: 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 65 44 65  reak);.  if( eDe
6e70: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
6e80: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
6e90: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71  outine ){.    sq
6ea0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6eb0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65  v, OP_Close, pse
6ec0: 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a  udoTab, 0);.  }.
6ed0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6ee0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
6ef0: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
6f00: 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f   the 'declaratio
6f10: 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a  n type' of the.*
6f20: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * expression pEx
6f30: 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d  pr. The string m
6f40: 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ay be treated as
6f50: 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63   static by the c
6f60: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  aller..**.** The
6f70: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
6f80: 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20 64  e is the exact d
6f90: 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74 69  atatype definiti
6fa0: 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  on extracted fro
6fb0: 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61  m the.** origina
6fc0: 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  l CREATE TABLE s
6fd0: 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20  tatement if the 
6fe0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
6ff0: 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64  column. The.** d
7000: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
7010: 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c  for a ROWID fiel
7020: 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78  d is INTEGER. Ex
7030: 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78  actly when an ex
7040: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63  pression.** is c
7050: 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75  onsidered a colu
7060: 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  mn can be comple
7070: 78 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63  x in the presenc
7080: 65 20 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e  e of subqueries.
7090: 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73   The.** result-s
70a0: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  et expression in
70b0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
70c0: 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61  owing SELECT sta
70d0: 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63  tements is .** c
70e0: 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75  onsidered a colu
70f0: 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  mn by this funct
7100: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ion..**.**   SEL
7110: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
7120: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
7130: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
7140: 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  bl;.**   SELECT 
7150: 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d  (SELECT col FROM
7160: 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45   tbl);.**   SELE
7170: 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c  CT abc FROM (SEL
7180: 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46  ECT col AS abc F
7190: 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a  ROM tbl);.** .**
71a0: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
71b0: 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78   type for any ex
71c0: 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74  pression other t
71d0: 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20  han a column is 
71e0: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
71f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75  const char *colu
7200: 6d 6e 54 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f  mnType(.  NameCo
7210: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45  ntext *pNC, .  E
7220: 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f  xpr *pExpr,.  co
7230: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
7240: 67 69 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  ginDb,.  const c
7250: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61  har **pzOriginTa
7260: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
7270: 2a 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b  **pzOriginCol.){
7280: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
7290: 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72  Type = 0;.  char
72a0: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44   const *zOriginD
72b0: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
72c0: 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20  nst *zOriginTab 
72d0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
72e0: 74 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20  t *zOriginCol = 
72f0: 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66  0;.  int j;.  if
7300: 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
7310: 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ) || pNC->pSrcLi
7320: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
7330: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
7340: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
7350: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
7360: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
7370: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
7380: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
7390: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
73a0: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
73b0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
73c0: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
73d0: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
73e0: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
73f0: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
7400: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
7410: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
7420: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
7430: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
7440: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
7450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7460: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
7470: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
7480: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
7490: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
74b0: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
74c0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
74d0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
74e0: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
74f0: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
7500: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
7510: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  Tab */.      tes
7520: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
7530: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
7540: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7550: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
7560: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
7570: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
7580: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
7590: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
75a0: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
75b0: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
75c0: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
75d0: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
75e0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
75f0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
7600: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
7610: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
7620: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
7630: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
7640: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
7650: 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74     pS = pTabList
7660: 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[j].pSelect;.
7670: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7680: 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70           pNC = p
7690: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  NC->pNext;.     
76a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
76b0: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
76c0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 49  ){.        /* FI
76d0: 58 20 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a  X ME:.        **
76e0: 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 73   This can occurs
76f0: 20 69 66 20 79 6f 75 20 68 61 76 65 20 73 6f 6d   if you have som
7700: 65 74 68 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c  ething like "SEL
7710: 45 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69  ECT new.x;" insi
7720: 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  de.        ** a 
7730: 74 72 69 67 67 65 72 2e 20 20 49 6e 20 6f 74 68  trigger.  In oth
7740: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 79 6f 75  er words, if you
7750: 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
7760: 70 65 63 69 61 6c 20 22 6e 65 77 22 0a 20 20 20  pecial "new".   
7770: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e       ** table in
7780: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
7790: 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 57 65  of a select.  We
77a0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 67   do not have a g
77b0: 6f 6f 64 20 77 61 79 0a 20 20 20 20 20 20 20 20  ood way.        
77c0: 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61  ** to find the a
77d0: 63 74 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65  ctual table type
77e0: 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20 22 54 45  , so call it "TE
77f0: 58 54 22 2e 20 20 54 68 69 73 20 69 73 20 72 65  XT".  This is re
7800: 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  ally.        ** 
7810: 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61 20 62  something of a b
7820: 75 67 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f 74  ug, but I do not
7830: 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69 78   know how to fix
7840: 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   it..        **.
7850: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
7860: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 72  code does not pr
7870: 6f 64 75 63 65 20 74 68 65 20 63 6f 72 72 65 63  oduce the correc
7880: 74 20 61 6e 73 77 65 72 20 2d 20 69 74 20 6a 75  t answer - it ju
7890: 73 74 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20  st prevents.    
78a0: 20 20 20 20 2a 2a 20 61 20 73 65 67 66 61 75 6c      ** a segfaul
78b0: 74 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  t.  See ticket #
78c0: 31 32 32 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f  1229..        */
78d0: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
78e0: 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20 20 20   "TEXT";.       
78f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
7900: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7910: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Tab );.      if(
7920: 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   pS ){.        /
7930: 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73  * The "table" is
7940: 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d   actually a sub-
7950: 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77  select or a view
7960: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
7970: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  use.        ** o
7980: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
7990: 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74  tement. Return t
79a0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
79b0: 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20  ype and origin. 
79c0: 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66         ** data f
79d0: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  or the result-se
79e0: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
79f0: 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20  sub-select..    
7a00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
7a10: 66 28 20 41 4c 57 41 59 53 28 69 43 6f 6c 3e 3d  f( ALWAYS(iCol>=
7a20: 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45  0 && iCol<pS->pE
7a30: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
7a40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
7a50: 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61  iCol is less tha
7a60: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
7a70: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75   expression requ
7a80: 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  ests the.       
7a90: 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74     ** rowid of t
7aa0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72  he sub-select or
7ab0: 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72   view. This expr
7ac0: 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20  ession is legal 
7ad0: 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20  (see .          
7ae0: 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73  ** test case mis
7af0: 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77  c2.2.2) - it alw
7b00: 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ays evaluates to
7b10: 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20   NULL..         
7b20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61   */.          Na
7b30: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
7b40: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
7b50: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
7b60: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20  [iCol].pExpr;.  
7b70: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63          sNC.pSrc
7b80: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
7b90: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
7ba0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
7bb0: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
7bc0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
7bd0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
7be0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
7bf0: 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20   p, &zOriginDb, 
7c00: 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f  &zOriginTab, &zO
7c10: 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20  riginCol); .    
7c20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
7c30: 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61  e if( ALWAYS(pTa
7c40: 62 2d 3e 70 53 63 68 65 6d 61 29 20 29 7b 0a 20  b->pSchema) ){. 
7c50: 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c         /* A real
7c60: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
7c70: 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b    assert( !pS );
7c80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
7c90: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
7ca0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
7cb0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
7cc0: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
7cd0: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
7ce0: 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l) );.        if
7cf0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
7d00: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
7d10: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
7d20: 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20     zOriginCol = 
7d30: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20  "rowid";.       
7d40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7d50: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
7d60: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
7d70: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
7d80: 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61  ginCol = pTab->a
7d90: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
7da0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7db0: 20 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20     zOriginTab = 
7dc0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
7dd0: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
7de0: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
7df0: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
7e00: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
7e10: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
7e20: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
7e30: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
7e40: 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61  ginDb = pNC->pPa
7e50: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
7e60: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
7e70: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
7e80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
7e90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7ea0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
7eb0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
7ec0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
7ed0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75  pression is a su
7ee0: 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e  b-select. Return
7ef0: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
7f00: 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20   type and.      
7f10: 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66  ** origin info f
7f20: 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f  or the single co
7f30: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
7f40: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
7f50: 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74  LECT.      ** st
7f60: 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  atement..      *
7f70: 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74  /.      NameCont
7f80: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53  ext sNC;.      S
7f90: 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70  elect *pS = pExp
7fa0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
7fb0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
7fc0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
7fd0: 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
7fe0: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
7ff0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
8000: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
8010: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
8020: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
8030: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
8040: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72  ;.      sNC.pPar
8050: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
8060: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
8070: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
8080: 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20   p, &zOriginDb, 
8090: 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f  &zOriginTab, &zO
80a0: 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20  riginCol); .    
80b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
80c0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69  endif.  }.  .  i
80d0: 66 28 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b  f( pzOriginDb ){
80e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f  .    assert( pzO
80f0: 72 69 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72  riginTab && pzOr
8100: 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  iginCol );.    *
8110: 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72  pzOriginDb = zOr
8120: 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f  iginDb;.    *pzO
8130: 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67  riginTab = zOrig
8140: 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  inTab;.    *pzOr
8150: 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69  iginCol = zOrigi
8160: 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nCol;.  }.  retu
8170: 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zType;.}../*.
8180: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
8190: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
81a0: 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63  the VDBE the dec
81b0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f  laration types o
81c0: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
81d0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
81e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
81f0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
8200: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
8210: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
8220: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
8230: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
8240: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
8250: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
8260: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
8270: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
8280: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
8290: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66  lt set */.){.#if
82a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
82b0: 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65  _DECLTYPE.  Vdbe
82c0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
82d0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
82e0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
82f0: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
8300: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e  = pTabList;.  sN
8310: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
8320: 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  e;.  for(i=0; i<
8330: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
8340: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
8350: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
8360: 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74  pExpr;.    const
8370: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69   char *zType;.#i
8380: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8390: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
83a0: 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  TA.    const cha
83b0: 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  r *zOrigDb = 0;.
83c0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
83d0: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
83e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
83f0: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  rigCol = 0;.    
8400: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
8410: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
8420: 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c  igDb, &zOrigTab,
8430: 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20   &zOrigCol);..  
8440: 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75    /* The vdbe mu
8450: 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20  st make its own 
8460: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
8470: 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65  mn-type and othe
8480: 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  r .    ** column
8490: 20 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67   specific string
84a0: 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  s, in case the s
84b0: 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62  chema is reset b
84c0: 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a  efore this.    *
84d0: 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
84e0: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20  e is deleted..  
84f0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
8500: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8510: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54  , i, COLNAME_DAT
8520: 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20  ABASE, zOrigDb, 
8530: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
8540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8550: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8560: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45  i, COLNAME_TABLE
8570: 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49  , zOrigTab, SQLI
8580: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
8590: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
85a0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
85b0: 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a  OLNAME_COLUMN, z
85c0: 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  OrigCol, SQLITE_
85d0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73  TRANSIENT);.#els
85e0: 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  e.    zType = co
85f0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
8600: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  , 0, 0, 0);.#end
8610: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
8620: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8630: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54  i, COLNAME_DECLT
8640: 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49  YPE, zType, SQLI
8650: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
8660: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8670: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
8680: 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  E */.}../*.** Ge
8690: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
86a0: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
86b0: 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  DBE the names of
86c0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
86d0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
86e0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
86f0: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
8700: 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c  ide the.** azCol
8710: 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  [] values in the
8720: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
8730: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
8740: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
8750: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8760: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
8770: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
8780: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
8790: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
87a0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
87b0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
87c0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
87d0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
87e0: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
87f0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
8800: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  e;.  int i, j;. 
8810: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8820: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
8830: 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72   fullNames, shor
8840: 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66  tNames;..#ifndef
8850: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
8860: 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69  LAIN.  /* If thi
8870: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c  s is an EXPLAIN,
8880: 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   skip this step 
8890: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
88a0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
88b0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
88c0: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  if..  if( pParse
88d0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
88e0: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c 20   NEVER(v==0) || 
88f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8900: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61   ) return;.  pPa
8910: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
8920: 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65   = 1;.  fullName
8930: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
8940: 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
8950: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72  ames)!=0;.  shor
8960: 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  tNames = (db->fl
8970: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
8980: 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  rtColNames)!=0;.
8990: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
89a0: 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73  NumCols(v, pELis
89b0: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72  t->nExpr);.  for
89c0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
89d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
89e0: 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20   Expr *p;.    p 
89f0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
8a00: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 4e 45  Expr;.    if( NE
8a10: 56 45 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e 74  VER(p==0) ) cont
8a20: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45  inue;.    if( pE
8a30: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
8a40: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
8a50: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
8a60: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
8a70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8a80: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8a90: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
8aa0: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
8ab0: 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
8ac0: 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( (p->op==TK_C
8ad0: 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  OLUMN || p->op==
8ae0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26  TK_AGG_COLUMN) &
8af0: 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20  & pTabList ){.  
8b00: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
8b10: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
8b20: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  l;.      int iCo
8b30: 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  l = p->iColumn;.
8b40: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41        for(j=0; A
8b50: 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74  LWAYS(j<pTabList
8b60: 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20  ->nSrc); j++){. 
8b70: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c         if( pTabL
8b80: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
8b90: 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62  r==p->iTable ) b
8ba0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8bb0: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
8bc0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
8bd0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
8be0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
8bf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
8c00: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
8c10: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
8c20: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
8c30: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
8c40: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
8c50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
8c60: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
8c70: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
8c80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8c90: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
8ca0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
8cb0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
8cc0: 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73   if( !shortNames
8cd0: 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29   && !fullNames )
8ce0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8cf0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8d00: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8d10: 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ME, .           
8d20: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8d30: 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  (db, pEList->a[i
8d40: 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45  ].zSpan), SQLITE
8d50: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
8d60: 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e   }else if( fullN
8d70: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
8d80: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
8d90: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
8da0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8db0: 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  db, "%s.%s", pTa
8dc0: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b  b->zName, zCol);
8dd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8de0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8df0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
8e00: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
8e10: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
8e20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8e30: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8e40: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8e50: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20  AME_NAME, zCol, 
8e60: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
8e70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8e80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
8e90: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8ea0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8eb0: 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20  NAME, .         
8ec0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8ed0: 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  (db, pEList->a[i
8ee0: 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45  ].zSpan), SQLITE
8ef0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
8f00: 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
8f10: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
8f20: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
8f30: 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ist);.}..#ifndef
8f40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
8f50: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
8f60: 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  ** Name of the c
8f70: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74  onnection operat
8f80: 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72  or, used for err
8f90: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
8fa0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
8fb0: 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  r *selectOpName(
8fc0: 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20  int id){.  char 
8fd0: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64  *z;.  switch( id
8fe0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
8ff0: 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ALL:       z = "
9000: 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72  UNION ALL";   br
9010: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9020: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20  _INTERSECT: z = 
9030: 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62  "INTERSECT";   b
9040: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9050: 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d  K_EXCEPT:    z =
9060: 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20   "EXCEPT";      
9070: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
9080: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20  lt:           z 
9090: 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20  = "UNION";      
90a0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
90b0: 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
90c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
90d0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
90e0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  */../*.** Given 
90f0: 61 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  a an expression 
9100: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
9110: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
9120: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
9130: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
9140: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
9150: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
9160: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
9170: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
9180: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
9190: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
91a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
91b0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
91c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
91d0: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
91e0: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
91f0: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
9200: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
9210: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
9220: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
9230: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
9240: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
9250: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
9260: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
9270: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
9280: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
9290: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
92a0: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
92b0: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
92c0: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
92d0: 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
92e0: 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75  c int selectColu
92f0: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
9300: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9310: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
9320: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9330: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
9340: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
9350: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
9360: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
9370: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
9380: 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  nt *pnCol,      
9390: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
93a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
93b0: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
93c0: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
93d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
93e0: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
93f0: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
9400: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9410: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
9420: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
9430: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
9440: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
9450: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
9460: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
9470: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
9480: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
9490: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
94a0: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
94b0: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
94c0: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
94d0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
94e0: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
94f0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
9500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9510: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9520: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
9530: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
9540: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
9550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9560: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
9570: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
9580: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
9590: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
95a0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
95b0: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
95c0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
95d0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
95e0: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
95f0: 20 2a 2f 0a 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20   */..  *pnCol = 
9600: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
9610: 45 78 70 72 3b 0a 20 20 61 43 6f 6c 20 3d 20 2a  Expr;.  aCol = *
9620: 70 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44  paCol = sqlite3D
9630: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
9640: 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
9650: 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 61 43 6f  nCol);.  if( aCo
9660: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
9670: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 66 6f  LITE_NOMEM;.  fo
9680: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
9690: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ; i<nCol; i++, p
96a0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47  Col++){.    /* G
96b0: 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  et an appropriat
96c0: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63  e name for the c
96d0: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  olumn.    */.   
96e0: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
96f0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
9700: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
9710: 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  0 || ExprHasProp
9720: 65 72 74 79 28 70 2d 3e 70 52 69 67 68 74 2c 20  erty(p->pRight, 
9730: 45 50 5f 49 6e 74 56 61 6c 75 65 29 0a 20 20 20  EP_IntValue).   
9740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
9750: 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  ->pRight->u.zTok
9760: 65 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  en==0 || p->pRig
9770: 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  ht->u.zToken[0]!
9780: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  =0 );.    if( (z
9790: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
97a0: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
97b0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
97c0: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
97d0: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
97e0: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
97f0: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
9800: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
9810: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9820: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
9830: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
9840: 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b  r *pColExpr = p;
9850: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
9860: 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20  ion that is the 
9870: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61  result column na
9880: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c  me */.      Tabl
9890: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
98a0: 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69   /* Table associ
98b0: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65  ated with this e
98c0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
98d0: 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78     while( pColEx
98e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pr->op==TK_DOT )
98f0: 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c   pColExpr = pCol
9900: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
9910: 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72      if( pColExpr
9920: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
9930: 26 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78  && ALWAYS(pColEx
9940: 70 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  pr->pTab!=0) ){.
9950: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63          /* For c
9960: 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63  olumns use the c
9970: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20  olumn name name 
9980: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
9990: 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  Col = pColExpr->
99a0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
99b0: 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72   pTab = pColExpr
99c0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
99d0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
99e0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
99f0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
9a00: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
9a10: 64 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20  db, "%s",.      
9a20: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e             iCol>
9a30: 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  =0 ? pTab->aCol[
9a40: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72  iCol].zName : "r
9a50: 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65  owid");.      }e
9a60: 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72  lse if( pColExpr
9a70: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
9a80: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
9a90: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9aa0: 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74  pColExpr, EP_Int
9ab0: 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
9ac0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
9ad0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
9ae0: 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a  ", pColExpr->u.z
9af0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
9b00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
9b10: 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  Use the original
9b20: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c   text of the col
9b30: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  umn expression a
9b40: 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  s its name */.  
9b50: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
9b60: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
9b70: 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61   "%s", pEList->a
9b80: 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  [i].zSpan);.    
9b90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
9ba0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
9bb0: 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ed ){.      sqli
9bc0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
9bd0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
9be0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
9bf0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
9c00: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e  olumn name is un
9c10: 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61  ique.  If the na
9c20: 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  me is not unique
9c30: 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20  ,.    ** append 
9c40: 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  a integer to the
9c50: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
9c60: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
9c70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d  .    */.    nNam
9c80: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
9c90: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
9ca0: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
9cb0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
9cc0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
9cd0: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
9ce0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
9cf0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e       char *zNewN
9d00: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ame;.        zNa
9d10: 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20  me[nName] = 0;. 
9d20: 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20         zNewName 
9d30: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
9d40: 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e  (db, "%s:%d", zN
9d50: 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ame, ++cnt);.   
9d60: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
9d70: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
9d80: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a         zName = z
9d90: 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  NewName;.       
9da0: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
9db0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
9dc0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9dd0: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
9de0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
9df0: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  }.  if( db->mall
9e00: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
9e10: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
9e20: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
9e30: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
9e40: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
9e50: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
9e60: 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
9e70: 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
9e80: 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
9e90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9ea0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65  _NOMEM;.  }.  re
9eb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9ec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70  }../*.** Add typ
9ed0: 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
9ee0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
9ef0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73   column list bas
9f00: 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43  ed on.** a SELEC
9f10: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
9f20: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
9f30: 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63  ist presumably c
9f40: 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43  ame from selectC
9f50: 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78  olumnNamesFromEx
9f60: 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65  prList()..** The
9f70: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73   column list has
9f80: 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74   only names, not
9f90: 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74   types or collat
9fa0: 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72  ions.  This.** r
9fb0: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f  outine goes thro
9fc0: 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65  ugh and adds the
9fd0: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
9fe0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
9ff0: 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72  s routine requir
a000: 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e  es that all iden
a010: 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
a020: 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
a030: 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
a040: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
a050: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
a060: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
a070: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a080: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
a090: 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
a0a0: 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20   int nCol,      
a0b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a0c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20   of columns */. 
a0d0: 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20   Column *aCol,  
a0e0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
a0f0: 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53  f columns */.  S
a100: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
a110: 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75       /* SELECT u
a120: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
a130: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
a140: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  tions */.){.  sq
a150: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a160: 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f  se->db;.  NameCo
a170: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c  ntext sNC;.  Col
a180: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c  umn *pCol;.  Col
a190: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
a1a0: 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b  nt i;.  Expr *p;
a1b0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
a1c0: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61  st_item *a;..  a
a1d0: 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d  ssert( pSelect!=
a1e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
a1f0: 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
a200: 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29  s & SF_Resolved)
a210: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
a220: 20 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e   nCol==pSelect->
a230: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c  pEList->nExpr ||
a240: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a250: 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  d );.  if( db->m
a260: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
a270: 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26  turn;.  memset(&
a280: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
a290: 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63  NC));.  sNC.pSrc
a2a0: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
a2b0: 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c  pSrc;.  a = pSel
a2c0: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a  ect->pEList->a;.
a2d0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
a2e0: 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  aCol; i<nCol; i+
a2f0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
a300: 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  p = a[i].pExpr;.
a310: 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20      pCol->zType 
a320: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
a330: 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65  p(db, columnType
a340: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
a350: 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  0));.    pCol->a
a360: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
a370: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
a380: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e  ;.    if( pCol->
a390: 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43  affinity==0 ) pC
a3a0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
a3b0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
a3c0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
a3d0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
a3e0: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
a3f0: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
a400: 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20    pCol->zColl = 
a410: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
a420: 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  db, pColl->zName
a430: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
a440: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45  /*.** Given a SE
a450: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
a460: 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65  generate a Table
a470: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
a480: 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65  describes.** the
a490: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
a4a0: 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54  hat SELECT..*/.T
a4b0: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73  able *sqlite3Res
a4c0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50  ultSetOfSelect(P
a4d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
a4e0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
a4f0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
a500: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
a510: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
a520: 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20   savedFlags;..  
a530: 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d  savedFlags = db-
a540: 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c  >flags;.  db->fl
a550: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46  ags &= ~SQLITE_F
a560: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64  ullColNames;.  d
a570: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
a580: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
a590: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
a5a0: 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53  tPrep(pParse, pS
a5b0: 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
a5c0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
a5d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c  return 0;.  whil
a5e0: 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e( pSelect->pPri
a5f0: 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70  or ) pSelect = p
a600: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a  Select->pPrior;.
a610: 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61    db->flags = sa
a620: 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62  vedFlags;.  pTab
a630: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
a640: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
a650: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
a660: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
a670: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a680: 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52   /* The sqlite3R
a690: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
a6a0: 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  () is only used 
a6b0: 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65  n contexts where
a6c0: 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20   lookaside.  ** 
a6d0: 69 73 20 64 69 73 61 62 6c 65 64 2c 20 73 6f 20  is disabled, so 
a6e0: 77 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c 6c  we might as well
a6f0: 20 68 61 72 64 2d 63 6f 64 65 20 70 54 61 62 2d   hard-code pTab-
a700: 3e 64 62 4d 65 6d 20 74 6f 20 4e 55 4c 4c 2e 20  >dbMem to NULL. 
a710: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  */.  assert( db-
a720: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
a730: 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54 61 62  led==0 );.  pTab
a740: 2d 3e 64 62 4d 65 6d 20 3d 20 30 3b 0a 20 20 70  ->dbMem = 0;.  p
a750: 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
a760: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30   pTab->zName = 0
a770: 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  ;.  selectColumn
a780: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
a790: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
a7a0: 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
a7b0: 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
a7c0: 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c  ;.  selectAddCol
a7d0: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
a7e0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
a7f0: 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43  ->nCol, pTab->aC
a800: 6f 6c 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  ol, pSelect);.  
a810: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
a820: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
a830: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
a840: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
a850: 6c 65 28 70 54 61 62 29 3b 0a 20 20 20 20 72 65  le(pTab);.    re
a860: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
a870: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
a880: 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
a890: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
a8a0: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
a8b0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
a8c0: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
a8d0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
a8e0: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
a8f0: 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
a900: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
a910: 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
a920: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
a930: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
a940: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
a950: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
a960: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
a970: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56  pVdbe = sqlite3V
a980: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
a990: 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66 20 53  ->db);.#ifndef S
a9a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
a9b0: 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20  .    if( v ){.  
a9c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a9d0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63  ddOp0(v, OP_Trac
a9e0: 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
a9f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
aa00: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
aa10: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
aa20: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
aa30: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
aa40: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
aa50: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
aa60: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
aa70: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
aa80: 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  et hold the expr
aa90: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
aaa0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
aab0: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
aac0: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
aad0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
aae0: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
aaf0: 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
ab00: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
ab10: 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
ab20: 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
ab30: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
ab40: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
ab50: 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
ab60: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
ab70: 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
ab80: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
ab90: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
aba0: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
abb0: 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
abc0: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
abd0: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
abe0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
abf0: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
ac00: 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
ac10: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
ac20: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
ac30: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
ac40: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
ac50: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
ac60: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
ac70: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
ac80: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
ac90: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
aca0: 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75  s.** (usually bu
acb0: 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29  t not always -1)
acc0: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
acd0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
ace0: 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
acf0: 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21  t!=0 or pOffset!
ad00: 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
ad10: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
ad20: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
ad30: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
ad40: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
ad50: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
ad60: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
ad70: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
ad80: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
ad90: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
ada0: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
adb0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
adc0: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
add0: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
ade0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
adf0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
ae00: 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
ae10: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
ae20: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
ae30: 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72  fset;.  int addr
ae40: 31 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  1;.  if( p->iLim
ae50: 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  it ) return;..  
ae60: 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  /* .  ** "LIMIT 
ae70: 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
ae80: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
ae90: 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
aea0: 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74  ontraversy about
aeb0: 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
aec0: 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
aed0: 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
aee0: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
aef0: 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
af00: 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
af10: 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
af20: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
af30: 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
af40: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
af50: 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c   p->pOffset==0 |
af60: 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29  | p->pLimit!=0 )
af70: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  ;.  if( p->pLimi
af80: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  t ){.    p->iLim
af90: 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b  it = iLimit = ++
afa0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
afb0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
afc0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
afd0: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
afe0: 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
aff0: 56 44 42 45 20 73 68 6f 75 6c 64 20 68 61 76 65  VDBE should have
b000: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
b010: 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 73  located */.    s
b020: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
b030: 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74  Parse, p->pLimit
b040: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73  , iLimit);.    s
b050: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b060: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
b070: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 56  , iLimit);.    V
b080: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
b090: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
b0a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b0b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
b0c0: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42  Zero, iLimit, iB
b0d0: 72 65 61 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  reak);.    if( p
b0e0: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
b0f0: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
b100: 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
b110: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
b120: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
b130: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
b140: 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
b150: 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
b160: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
b170: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
b180: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f  , p->pOffset, iO
b190: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
b1a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b1b0: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
b1c0: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
b1d0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
b1e0: 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72   "OFFSET counter
b1f0: 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31  "));.      addr1
b200: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b210: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
b220: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
b230: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b240: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
b250: 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a  r, 0, iOffset);.
b260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b270: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
b280: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
b290: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b2a0: 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20  OP_Add, iLimit, 
b2b0: 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  iOffset, iOffset
b2c0: 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +1);.      VdbeC
b2d0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
b2e0: 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20  T+OFFSET"));.   
b2f0: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
b300: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
b310: 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74  OP_IfPos, iLimit
b320: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b330: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b340: 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f  _Integer, -1, iO
b350: 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  ffset+1);.      
b360: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
b370: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
b380: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
b390: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b3a0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
b3b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
b3c0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
b3d0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
b3e0: 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
b3f0: 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
b400: 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
b410: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
b420: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
b430: 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
b440: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
b450: 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
b460: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
b470: 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
b480: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
b490: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
b4a0: 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
b4b0: 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
b4c0: 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
b4d0: 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
b4e0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
b4f0: 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
b500: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
b510: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
b520: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
b530: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
b540: 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
b550: 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
b560: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
b570: 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
b580: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
b590: 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
b5a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
b5b0: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  et = 0;.  }.  as
b5c0: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b  sert( iCol>=0 );
b5d0: 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26  .  if( pRet==0 &
b5e0: 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74  & iCol<p->pEList
b5f0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ->nExpr ){.    p
b600: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
b610: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
b620: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
b630: 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
b640: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
b650: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b660: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
b670: 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f  SELECT */../* Fo
b680: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
b690: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
b6a0: 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
b6b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b6c0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
b6d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
b6e0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
b6f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
b700: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
b710: 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
b720: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
b730: 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
b740: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
b750: 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
b760: 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  );...#ifndef SQL
b770: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
b780: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54  D_SELECT./*.** T
b790: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
b7a0: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73  alled to process
b7b0: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
b7c0: 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74  y form from.** t
b7d0: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
b7e0: 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e  ate queries usin
b7f0: 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41  g UNION, UNION A
b800: 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a  LL, EXCEPT, or.*
b810: 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a  * INTERSECT.**.*
b820: 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20  * "p" points to 
b830: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  the right-most o
b840: 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65  f the two querie
b850: 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e  s.  the query on
b860: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20   the.** left is 
b870: 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20  p->pPrior.  The 
b880: 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64  left query could
b890: 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f   also be a compo
b8a0: 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20  und query.** in 
b8b0: 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20  which case this 
b8c0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
b8d0: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
b8e0: 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ly. .**.** The r
b8f0: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f  esults of the to
b900: 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f  tal query are to
b910: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
b920: 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a   a destination.*
b930: 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20  * of type eDest 
b940: 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  with parameter i
b950: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  Parm..**.** Exam
b960: 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72  ple 1:  Consider
b970: 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d   a three-way com
b980: 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d  pound SQL statem
b990: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ent..**.**     S
b9a0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
b9b0: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46  UNION SELECT b F
b9c0: 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c  ROM t2 UNION SEL
b9d0: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
b9e0: 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65  .** This stateme
b9f0: 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20  nt is parsed up 
ba00: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
ba10: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  *     SELECT c F
ba20: 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c  ROM t3.**      |
ba30: 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e  .**      `----->
ba40: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
ba50: 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t2.**           
ba60: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
ba70: 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d           `------
ba80: 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  >  SELECT a FROM
ba90: 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72   t1.**.** The ar
baa0: 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67  rows in the diag
bab0: 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73  ram above repres
bac0: 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70  ent the Select.p
bad0: 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a  Prior pointer..*
bae0: 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75  * So if this rou
baf0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
bb00: 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74  ith p equal to t
bb10: 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65  he t3 query, the
bb20: 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c  n.** pPrior will
bb30: 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79   be the t2 query
bb40: 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65  .  p->op will be
bb50: 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69   TK_UNION in thi
bb60: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  s case..**.** No
bb70: 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73  tice that becaus
bb80: 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c  e of the way SQL
bb90: 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f  ite parses compo
bba0: 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65  und SELECTs, the
bbb0: 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73  .** individual s
bbc0: 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72  elects always gr
bbd0: 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  oup from left to
bbe0: 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
bbf0: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
bc00: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
bc10: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
bc20: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
bc30: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
bc40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
bc50: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
bc60: 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
bc70: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
bc80: 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
bc90: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
bca0: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
bcb0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
bcc0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53  QLITE_OK;   /* S
bcd0: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
bce0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
bcf0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
bd00: 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
bd10: 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
bd20: 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
bd30: 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd50: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
bd60: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
bd70: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
bd80: 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  ;      /* Altern
bd90: 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69  ative data desti
bda0: 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  nation */.  Sele
bdb0: 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b  ct *pDelete = 0;
bdc0: 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69    /* Chain of si
bdd0: 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20  mple selects to 
bde0: 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69  delete */.  sqli
bdf0: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
be00: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
be10: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  nnection */..  /
be20: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
be30: 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
be40: 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   or LIMIT clause
be50: 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
be60: 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68  s.  Only.  ** th
be70: 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f  e last (right-mo
be80: 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68  st) SELECT in th
be90: 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
bea0: 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  e an ORDER BY or
beb0: 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61   LIMIT..  */.  a
bec0: 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70  ssert( p && p->p
bed0: 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c  Prior );  /* Cal
bee0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75  ling function gu
bef0: 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75  arantees this mu
bf00: 63 68 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  ch */.  db = pPa
bf10: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f  rse->db;.  pPrio
bf20: 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
bf30: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
bf40: 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72  >pRightmost!=pPr
bf50: 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ior );.  assert(
bf60: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
bf70: 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f  ost==p->pRightmo
bf80: 73 74 20 29 3b 0a 20 20 64 65 73 74 20 3d 20 2a  st );.  dest = *
bf90: 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72  pDest;.  if( pPr
bfa0: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
bfb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
bfc0: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44  rMsg(pParse,"ORD
bfd0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f  ER BY clause sho
bfe0: 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
bff0: 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
c000: 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
c010: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
c020: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
c030: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c040: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69  ;.  }.  if( pPri
c050: 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
c060: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c070: 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20  g(pParse,"LIMIT 
c080: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
c090: 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
c0a0: 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
c0b0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
c0c0: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
c0d0: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
c0e0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
c0f0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
c100: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
c110: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
c120: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c    /* The VDBE al
c130: 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79  ready created by
c140: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
c150: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n */..  /* Creat
c160: 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
c170: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
c180: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
c190: 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65   */.  if( dest.e
c1a0: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
c1b0: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
c1c0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
c1d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c1e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
c1f0: 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69  phemeral, dest.i
c200: 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  Parm, p->pEList-
c210: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73  >nExpr);.    des
c220: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t.eDest = SRT_Ta
c230: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ble;.  }..  /* M
c240: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
c250: 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
c260: 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
c270: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
c280: 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
c290: 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
c2a0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
c2b0: 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
c2c0: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
c2d0: 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
c2e0: 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e  >nExpr!=pPrior->
c2f0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
c300: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
c310: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
c320: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
c330: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
c340: 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
c350: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
c360: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
c370: 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
c380: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
c390: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
c3a0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
c3b0: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
c3c0: 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  * Compound SELEC
c3d0: 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20  Ts that have an 
c3e0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
c3f0: 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
c400: 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  rately..  */.  i
c410: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
c420: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
c430: 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
c440: 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
c450: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
c460: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
c470: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
c480: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
c490: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74  nts..  */.  swit
c4a0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
c4b0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
c4c0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
c4d0: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
c4e0: 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  ( !pPrior->pLimi
c4f0: 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  t );.      pPrio
c500: 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r->pLimit = p->p
c510: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
c520: 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  ior->pOffset = p
c530: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
c540: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
c550: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
c560: 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  or, &dest);.    
c570: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
c580: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
c590: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
c5a0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
c5b0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c5c0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
c5d0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
c5e0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  0;.      p->iLim
c5f0: 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69  it = pPrior->iLi
c600: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  mit;.      p->iO
c610: 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e  ffset = pPrior->
c620: 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  iOffset;.      i
c630: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
c640: 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
c650: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c660: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70  (v, OP_IfZero, p
c670: 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->iLimit);.     
c680: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
c690: 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69  v, "Jump ahead i
c6a0: 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22  f LIMIT reached"
c6b0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
c6c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
c6d0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
c6e0: 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  &dest);.      te
c6f0: 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
c700: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
c710: 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
c720: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
c730: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
c740: 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a      if( addr ){.
c750: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c760: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
c770: 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ddr);.      }.  
c780: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c790: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
c7a0: 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
c7b0: 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
c7c0: 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
c7d0: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
c7e0: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
c7f0: 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
c800: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
c810: 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20   u8 op = 0;     
c820: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
c830: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
c840: 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
c850: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
c860: 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
c870: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
c880: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
c890: 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
c8a0: 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
c8b0: 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
c8c0: 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
c8d0: 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
c8e0: 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
c8f0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
c900: 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f   SelectDest unio
c910: 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65  ndest;..      te
c920: 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
c930: 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20  K_EXCEPT );.    
c940: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
c950: 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
c960: 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53       priorOp = S
c970: 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
c980: 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
c990: 70 72 69 6f 72 4f 70 20 26 26 20 41 4c 57 41 59  priorOp && ALWAY
c9a0: 53 28 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 21  S(!p->pLimit &&!
c9b0: 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20  p->pOffset) ){. 
c9c0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
c9d0: 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
c9e0: 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
c9f0: 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
ca00: 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
ca10: 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
ca20: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
ca30: 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t( p->pRightmost
ca40: 21 3d 70 20 29 3b 20 20 2f 2a 20 43 61 6e 20 6f  !=p );  /* Can o
ca50: 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 72 20 6c  nly happen for l
ca60: 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
ca70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 33 2d        ** of a 3-
caa0: 77 61 79 20 6f 72 20 6d 6f 72 65 20 63 6f 6d 70  way or more comp
cab0: 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
cac0: 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
cad0: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
cae0: 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
caf0: 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
cb00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
cb10: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
cb20: 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20  0 );     /* Not 
cb30: 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
cb40: 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
cb50: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
cb60: 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20   = dest.iParm;. 
cb70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cb80: 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
cb90: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
cba0: 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
cbb0: 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
cbc0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
cbd0: 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
cbe0: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
cbf0: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
cc00: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
cc10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
cc20: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
cc30: 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  );.        addr 
cc40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cc50: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
cc60: 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61  hemeral, unionTa
cc70: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  b, 0);.        a
cc80: 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
cc90: 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
cca0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
ccb0: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
ccc0: 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  addr;.        p-
ccd0: 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c  >pRightmost->sel
cce0: 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
ccf0: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20  Ephemeral;.     
cd00: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
cd10: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
cd20: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
cd30: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
cd40: 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
cd50: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
cd60: 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
cd70: 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
cd80: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
cd90: 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64  DestInit(&uniond
cda0: 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  est, priorOp, un
cdb0: 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 72  ionTab);.      r
cdc0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
cdd0: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
cde0: 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
cdf0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
ce00: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
ce10: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
ce20: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
ce30: 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
ce40: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ce50: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
ce60: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45   if( p->op==TK_E
ce70: 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20  XCEPT ){.       
ce80: 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74   op = SRT_Except
ce90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cea0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ceb0: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
cec0: 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53  ;.        op = S
ced0: 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
cee0: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
cef0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  r = 0;.      pLi
cf00: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
cf10: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
cf20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
cf30: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
cf40: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
cf50: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e  et = 0;.      un
cf60: 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20  iondest.eDest = 
cf70: 6f 70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  op;.      rc = s
cf80: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
cf90: 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65  rse, p, &unionde
cfa0: 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
cfb0: 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
cfc0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51  OK );.      /* Q
cfd0: 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
cfe0: 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
cff0: 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20  () might refill 
d000: 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20  p->pOrderBy..   
d010: 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f     ** Be sure to
d020: 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65   delete p->pOrde
d030: 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20  rBy, therefore, 
d040: 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72  to avoid a memor
d050: 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20  y leak. */.     
d060: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d070: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
d080: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70  rderBy);.      p
d090: 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
d0a0: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
d0b0: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
d0c0: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
d0d0: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
d0e0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
d0f0: 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
d100: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
d110: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
d120: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
d130: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  t;.      p->iLim
d140: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  it = 0;.      p-
d150: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >iOffset = 0;.. 
d160: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
d170: 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
d180: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
d190: 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
d1a0: 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  rm.      ** it i
d1b0: 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
d1c0: 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
d1d0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
d1e0: 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e   unionTab==dest.
d1f0: 69 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44  iParm || dest.eD
d200: 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a  est!=priorOp );.
d210: 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
d220: 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest!=priorOp ){
d230: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
d240: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
d250: 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
d260: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
d270: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73  .        if( des
d280: 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  t.eDest==SRT_Out
d290: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  put ){.         
d2a0: 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
d2b0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = p;.          w
d2c0: 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
d2d0: 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
d2e0: 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
d2f0: 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
d300: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
d310: 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
d320: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
d330: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65    }.        iBre
d340: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
d350: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
d360: 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
d370: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
d380: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63  el(v);.        c
d390: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
d3a0: 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
d3b0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
d3c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d3d0: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
d3e0: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
d3f0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  k);.        iSta
d400: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
d410: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
d420: 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e          selectIn
d430: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
d440: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e  p, p->pEList, un
d450: 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73  ionTab, p->pELis
d460: 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d480: 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20    0, -1, &dest, 
d490: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
d4a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d4b0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
d4c0: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
d4d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d4e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
d4f0: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
d500: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
d510: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
d520: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
d530: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d540: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d550: 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
d560: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
d570: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d580: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
d590: 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
d5a0: 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
d5b0: 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
d5c0: 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
d5d0: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
d5e0: 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
d5f0: 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
d600: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
d610: 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
d620: 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
d630: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
d640: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
d650: 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
d660: 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
d670: 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
d680: 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
d690: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
d6a0: 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
d6b0: 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
d6c0: 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
d6d0: 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
d6e0: 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
d6f0: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
d700: 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
d710: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
d720: 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
d730: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
d740: 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
d750: 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
d760: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
d770: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
d780: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
d790: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
d7a0: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
d7b0: 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
d7c0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
d7d0: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
d7e0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67  r;.      p->pRig
d7f0: 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73  htmost->selFlags
d800: 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
d810: 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  eral;.      asse
d820: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
d830: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
d840: 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
d850: 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
d860: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
d870: 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
d880: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
d890: 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72  tDestInit(&inter
d8a0: 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e  sectdest, SRT_Un
d8b0: 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20  ion, tab1);.    
d8c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
d8d0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
d8e0: 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64  ior, &intersectd
d8f0: 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
d900: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
d910: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
d920: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
d930: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
d940: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
d950: 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
d960: 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
d970: 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d   */.      addr =
d980: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d990: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
d9a0: 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29  emeral, tab2, 0)
d9b0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d9c0: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
d9d0: 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  1] == -1 );.    
d9e0: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
d9f0: 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[1] = addr;.   
da00: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
da10: 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
da20: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
da30: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
da40: 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
da50: 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
da60: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
da70: 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65  0;.      interse
da80: 63 74 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 74  ctdest.iParm = t
da90: 61 62 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ab2;.      rc = 
daa0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
dab0: 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73  arse, p, &inters
dac0: 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
dad0: 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
dae0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
daf0: 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
db00: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
db10: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
db20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
db30: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
db40: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
db50: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
db60: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
db70: 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20  et = pOffset;.. 
db80: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
db90: 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
dba0: 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
dbb0: 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
dbc0: 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
dbd0: 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
dbe0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
dbf0: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
dc00: 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
dc10: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
dc20: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
dc30: 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
dc40: 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
dc50: 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
dc60: 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
dc70: 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  ;.        genera
dc80: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
dc90: 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
dca0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
dcb0: 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
dcc0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
dcd0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
dce0: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
dcf0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
dd00: 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69  .      computeLi
dd10: 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
dd20: 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
dd30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dd40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
dd50: 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
dd60: 65 61 6b 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  eak);.      r1 =
dd70: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
dd80: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
dd90: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
dda0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ddb0: 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c  OP_RowKey, tab1,
ddc0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
ddd0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
dde0: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
ddf0: 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 29 3b 0a  b2, iCont, r1);.
de00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
de10: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
de20: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  se, r1);.      s
de30: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
de40: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
de50: 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45  ist, tab1, p->pE
de60: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c     0, -1, &dest,
de90: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
dea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
deb0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
dec0: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
ded0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dee0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  2(v, OP_Next, ta
def0: 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
df00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
df10: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
df20: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
df30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
df40: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
df50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
df60: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
df70: 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
df80: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
df90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
dfa0: 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
dfb0: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
dfc0: 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70  ed by .  ** temp
dfd0: 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65  orary tables nee
dfe0: 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ded to implement
dff0: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
e000: 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63  lect..  ** Attac
e010: 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  h the KeyInfo st
e020: 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74  ructure to all t
e030: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
e040: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
e050: 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
e060: 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
e070: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
e080: 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
e090: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
e0a0: 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
e0b0: 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
e0c0: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
e0d0: 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
e0e0: 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
e0f0: 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
e100: 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
e110: 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
e120: 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
e130: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
e140: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
e150: 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d  s & SF_UsesEphem
e160: 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  eral ){.    int 
e170: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
e190: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
e1a0: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
e1b0: 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
e1c0: 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
e1d0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
e1e0: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
e1f0: 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e210: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
e220: 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
e230: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c  ments */.    Col
e240: 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20  lSeq **apColl;  
e250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
e260: 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
e270: 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  h pKeyInfo->aCol
e280: 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  l[] */.    int n
e290: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
e2a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e2b0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
e2c0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
e2d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
e2e0: 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a  Rightmost==p );.
e2f0: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45      nCol = p->pE
e300: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
e310: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
e320: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
e330: 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
e340: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
e350: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f  f(*pKeyInfo)+nCo
e360: 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  l*(sizeof(CollSe
e370: 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20 20 69  q*) + 1));.    i
e380: 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  f( !pKeyInfo ){.
e390: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e3a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
e3b0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
e3c0: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _end;.    }..   
e3d0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d   pKeyInfo->enc =
e3e0: 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 4b   ENC(db);.    pK
e3f0: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
e400: 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 0a 20 20 20   (u16)nCol;..   
e410: 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
e420: 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
e430: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
e440: 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
e450: 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
e460: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
e470: 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
e480: 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
e490: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
e4a0: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
e4b0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
e4c0: 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f   }..    for(pLoo
e4d0: 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
e4e0: 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
e4f0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
e500: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
e510: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
e520: 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
e530: 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hm[i];.        i
e540: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
e550: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d         /* If [0]
e560: 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20   is unused then 
e570: 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73  [1] is also unus
e580: 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20  ed.  So we can. 
e590: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
e5a0: 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20  ys safely abort 
e5b0: 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66  as soon as the f
e5c0: 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  irst unused slot
e5d0: 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20   is found */.   
e5e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e5f0: 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
e600: 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20  hm[1]<0 );.     
e610: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e620: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
e630: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
e640: 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29  2(v, addr, nCol)
e650: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e660: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
e670: 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b   addr, (char*)pK
e680: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
e690: 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  FO);.        pLo
e6a0: 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
e6b0: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  [i] = -1;.      
e6c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
e6d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b  te3DbFree(db, pK
e6e0: 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75  eyInfo);.  }..mu
e6f0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a  lti_select_end:.
e700: 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20    pDest->iMem = 
e710: 64 65 73 74 2e 69 4d 65 6d 3b 0a 20 20 70 44 65  dest.iMem;.  pDe
e720: 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73 74 2e  st->nMem = dest.
e730: 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
e740: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
e750: 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75  pDelete);.  retu
e760: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
e770: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
e780: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
e790: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  /../*.** Code an
e7a0: 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
e7b0: 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69  ne for a corouti
e7c0: 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ne implementatio
e7d0: 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  n of a.** SELECT
e7e0: 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   statment..**.**
e7f0: 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
e800: 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69  output is contai
e810: 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 4d 65 6d  ned in pIn->iMem
e820: 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20  .  There are.** 
e830: 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75 6d 6e  pIn->nMem column
e840: 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20  s to be output. 
e850: 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20   pDest is where 
e860: 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c  the output shoul
e870: 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a  d.** be sent..**
e880: 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73  .** regReturn is
e890: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
e8a0: 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  he register hold
e8b0: 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
e8c0: 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64  ne.** return add
e8d0: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  ress..**.** If r
e8e0: 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74  egPrev>0 then it
e8f0: 20 69 73 20 61 20 74 68 65 20 66 69 72 73 74 20   is a the first 
e900: 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65  register in a ve
e910: 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63  ctor that.** rec
e920: 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  ords the previou
e930: 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72  s output.  mem[r
e940: 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61  egPrev] is a fla
e950: 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a  g that is false.
e960: 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ** if there has 
e970: 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73  been no previous
e980: 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67   output.  If reg
e990: 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65  Prev>0 then code
e9a0: 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64   is.** generated
e9b0: 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70   to suppress dup
e9c0: 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e  licates.  pKeyIn
e9d0: 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63  fo is used for c
e9e0: 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73  omparing.** keys
e9f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c  ..**.** If the L
ea00: 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d  IMIT found in p-
ea10: 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68  >iLimit is reach
ea20: 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ed, jump immedia
ea30: 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61  tely to.** iBrea
ea40: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
ea50: 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
ea60: 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72  ubroutine(.  Par
ea70: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ea80: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
ea90: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
eaa0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
eab0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
eac0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
ead0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49    SelectDest *pI
eae0: 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72  n,        /* Cor
eaf0: 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67  outine supplying
eb00: 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
eb10: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
eb20: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
eb30: 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  end the data */.
eb40: 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c    int regReturn,
eb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
eb60: 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
eb70: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
eb80: 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20  t regPrev,      
eb90: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
eba0: 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  s result registe
ebb0: 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73  r.  No uniquenes
ebc0: 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49  s if 0 */.  KeyI
ebd0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
ebe0: 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61      /* For compa
ebf0: 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f  ring with previo
ec00: 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  us entry */.  in
ec10: 74 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20  t p4type,       
ec20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34 20        /* The p4 
ec30: 74 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e 66  type for pKeyInf
ec40: 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  o */.  int iBrea
ec50: 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
ec60: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
ec70: 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
ec80: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
ec90: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
eca0: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
ecb0: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
ecc0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
ecd0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
ece0: 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
ecf0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
ed00: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
ed10: 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
ed20: 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
ed30: 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
ed40: 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
ed50: 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
ed60: 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20  int j1, j2;.    
ed70: 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
ed80: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
ed90: 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20  ot, regPrev);.  
eda0: 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64    j2 = sqlite3Vd
edb0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
edc0: 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d 65  ompare, pIn->iMe
edd0: 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  m, regPrev+1, pI
ede0: 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20  n->nMem,.       
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee00: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
ee10: 65 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29 3b  eyInfo, p4type);
ee20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ee30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
ee40: 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e  p, j2+2, iContin
ee50: 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73  ue, j2+2);.    s
ee60: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
ee70: 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73  re(v, j1);.    s
ee80: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
ee90: 70 79 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  py(pParse, pIn->
eea0: 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c  iMem, regPrev+1,
eeb0: 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20   pIn->nMem);.   
eec0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eed0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
eee0: 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 1, regPrev);. 
eef0: 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
ef00: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
ef10: 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  d ) return 0;.. 
ef20: 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65   /* Suppress the
ef30: 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
ef40: 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65  T entries if the
ef50: 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20  re is an OFFSET 
ef60: 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f  clause.  */.  co
ef70: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69  deOffset(v, p, i
ef80: 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77  Continue);..  sw
ef90: 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65  itch( pDest->eDe
efa0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f  st ){.    /* Sto
efb0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
efc0: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
efd0: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
efe0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
eff0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
f000: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
f010: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
f020: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
f030: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
f040: 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
f050: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
f060: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f070: 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
f080: 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
f090: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65     testcase( pDe
f0a0: 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
f0b0: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
f0c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f0d0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
f0e0: 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  ord, pIn->iMem, 
f0f0: 70 49 6e 2d 3e 6e 4d 65 6d 2c 20 72 31 29 3b 0a  pIn->nMem, r1);.
f100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f110: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
f120: 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69  wRowid, pDest->i
f130: 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20  Parm, r2);.     
f140: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f150: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
f160: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72   pDest->iParm, r
f170: 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  1, r2);.      sq
f180: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
f190: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
f1a0: 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ND);.      sqlit
f1b0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
f1c0: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
f1d0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
f1e0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
f1f0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
f200: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
f210: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
f220: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
f230: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
f240: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
f250: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
f260: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
f270: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
f280: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
f290: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
f2a0: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
f2b0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
f2c0: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
f2d0: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
f2e0: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
f2f0: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
f300: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
f310: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
f320: 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20  >nMem==1 );.    
f330: 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20    p->affinity = 
f340: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
f350: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
f360: 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  (p->pEList->a[0]
f370: 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61  .pExpr, pDest->a
f380: 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20  ffinity);.      
f390: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
f3a0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
f3b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f3c0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
f3d0: 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
f3e0: 4d 65 6d 2c 20 31 2c 20 72 31 2c 20 26 70 2d 3e  Mem, 1, r1, &p->
f3f0: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
f400: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
f410: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
f420: 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
f430: 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  iMem, 1);.      
f440: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f450: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
f460: 74 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c  t, pDest->iParm,
f470: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
f480: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
f490: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
f4a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f4b0: 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65 76  }..#if 0  /* Nev
f4c0: 65 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20  er occurs on an 
f4d0: 4f 52 44 45 52 20 42 59 20 71 75 65 72 79 20 2a  ORDER BY query *
f4e0: 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20  /.    /* If any 
f4f0: 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65  row exist in the
f500: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63   result set, rec
f510: 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e  ord that fact an
f520: 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a  d abort..    */.
f530: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
f540: 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  sts: {.      sql
f550: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f560: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
f570: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a   pDest->iParm);.
f580: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
f590: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
f5a0: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
f5b0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
f5c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
f5d0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
f5e0: 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
f5f0: 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
f600: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
f610: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
f620: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
f630: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
f640: 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
f650: 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
f660: 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
f670: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
f680: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
f690: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
f6a0: 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d  ert( pIn->nMem==
f6b0: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
f6c0: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
f6d0: 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  Parse, pIn->iMem
f6e0: 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
f6f0: 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
f700: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
f710: 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
f720: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
f730: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
f740: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
f750: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f760: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
f770: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
f780: 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
f790: 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
f7a0: 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
f7b0: 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73  starting at pDes
f7c0: 74 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 6e 20 74  t->iMem.  Then t
f7d0: 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69  he co-routine yi
f7e0: 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elds..    */.   
f7f0: 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
f800: 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ine: {.      if(
f810: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20   pDest->iMem==0 
f820: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  ){.        pDest
f830: 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33  ->iMem = sqlite3
f840: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
f850: 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b  rse, pIn->nMem);
f860: 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
f870: 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e 6e 4d 65 6d  nMem = pIn->nMem
f880: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f890: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
f8a0: 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
f8b0: 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69 4d  >iMem, pDest->iM
f8c0: 65 6d 2c 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 29  em, pDest->nMem)
f8d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f8e0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
f8f0: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50  Yield, pDest->iP
f900: 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  arm);.      brea
f910: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
f920: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
f930: 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20  above, then the 
f940: 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69  result destinati
f950: 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a  on must be.    *
f960: 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54  * SRT_Output.  T
f970: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
f980: 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
f990: 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a   any other.    *
f9a0: 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74  * destination ot
f9b0: 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
f9c0: 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20  s handled above 
f9d0: 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20  or SRT_Output.. 
f9e0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
f9f0: 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73   SRT_Output, res
fa00: 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
fa10: 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
fa20: 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20   registers.  .  
fa30: 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50    ** Then the OP
fa40: 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64  _ResultRow opcod
fa50: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75  e is used to cau
fa60: 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  se sqlite3_step(
fa70: 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75  ) to.    ** retu
fa80: 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  rn the next row 
fa90: 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a  of result..    *
faa0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
fab0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
fac0: 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
fad0: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
fae0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
faf0: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
fb00: 6f 77 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70  ow, pIn->iMem, p
fb10: 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  In->nMem);.     
fb20: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
fb30: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
fb40: 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65  pParse, pIn->iMe
fb50: 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20  m, pIn->nMem);. 
fb60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fb70: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  }.  }..  /* Jump
fb80: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
fb90: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
fba0: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
fbb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
fbc0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
fbd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fbe0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e  , OP_AddImm, p->
fbf0: 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20  iLimit, -1);.   
fc00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fc10: 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p2(v, OP_IfZero,
fc20: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
fc30: 61 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ak);.  }..  /* G
fc40: 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72  enerate the subr
fc50: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20  outine return.  
fc60: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
fc70: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
fc80: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71  iContinue);.  sq
fc90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fca0: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
fcb0: 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74  gReturn);..  ret
fcc0: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
fcd0: 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63  ** Alternative c
fce0: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63  ompound select c
fcf0: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f  ode generator fo
fd00: 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65  r cases when the
fd10: 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45  re.** is an ORDE
fd20: 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  R BY clause..**.
fd30: 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71  ** We assume a q
fd40: 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c  uery of the foll
fd50: 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  owing form:.**.*
fd60: 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e  *      <selectA>
fd70: 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73    <operator>  <s
fd80: 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42  electB>  ORDER B
fd90: 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a  Y <orderbylist>.
fda0: 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  **.** <operator>
fdb0: 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e   is one of UNION
fdc0: 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43   ALL, UNION, EXC
fdd0: 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
fde0: 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20  T.  The idea.** 
fdf0: 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20  is to code both 
fe00: 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73  <selectA> and <s
fe10: 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65  electB> with the
fe20: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
fe30: 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e   as.** co-routin
fe40: 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68  es.  Then run th
fe50: 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e  e co-routines in
fe60: 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65   parallel and me
fe70: 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rge the results.
fe80: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ** into the outp
fe90: 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  ut.  In addition
fea0: 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f   to the two coro
feb0: 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73  utines (called s
fec0: 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65  electA and.** se
fed0: 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65  lectB) there are
fee0: 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a   7 subroutines:.
fef0: 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20  **.**    outA:  
ff00: 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
ff10: 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41  t of the selectA
ff20: 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
ff30: 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
ff40: 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
ff50: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
ff60: 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  .**.**    outB: 
ff70: 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
ff80: 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
ff90: 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  B coroutine into
ffa0: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
ffb0: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
ffc0: 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
ffd0: 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74  .  (Only generat
ffe0: 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64  ed for UNION and
fff0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10000 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45  UNION ALL.  EXCE
10010 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43  PT and INSERTSEC
10020 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61  T never output a
10030 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20   row that.**    
10040 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73           appears
10050 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a   only in B.).**.
10060 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43  **    AltB:    C
10070 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
10080 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
10090 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
100a0 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A<B..**.**    
100b0 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AeqB:    Called 
100c0 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
100d0 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
100e0 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42  outines and A==B
100f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a  ..**.**    AgtB:
10100 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
10110 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
10120 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
10130 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a  es and A>B..**.*
10140 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61  *    EofA:    Ca
10150 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
10160 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
10170 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20   selectA..**.** 
10180 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c     EofB:    Call
10190 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
101a0 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
101b0 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68  electB..**.** Th
101c0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
101d0 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66   of the latter f
101e0 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20  ive subroutines 
101f0 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20  depend on which 
10200 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
10210 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a  s used:.**.**.**
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
10230 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55  ON ALL         U
10240 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20  NION            
10250 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20  EXCEPT          
10260 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20  INTERSECT.**    
10270 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
10280 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
10290 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
102a0 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
102b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41  ---------.**   A
102c0 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ltB:   outA, nex
102d0 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
102e0 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
102f0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
10300 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42  xtA.**.**   AeqB
10310 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
10320 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
10330 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20            nextA 
10340 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65          outA, ne
10350 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42  xtA.**.**   AgtB
10360 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
10370 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
10380 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20            nextB 
10390 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42             nextB
103a0 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20  .**.**   EofA:  
103b0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
103c0 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
103d0 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20         halt     
103e0 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
103f0 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74  **   EofB:   out
10400 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
10410 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
10420 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
10430 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49      halt.**.** I
10440 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42  n the AltB, AeqB
10450 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f  , and AgtB subro
10460 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f  utines, an EOF o
10470 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n A following ne
10480 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e  xtA.** causes an
10490 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
104a0 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45  to EofA and an E
104b0 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e  OF on B followin
104c0 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a  g nextB causes.*
104d0 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  * an immediate j
104e0 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69  ump to EofB.  Wi
104f0 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f  thin EofA and Eo
10500 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65  fB, and EOF on e
10510 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f  ntry or.** follo
10520 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65  wing nextX cause
10530 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  s a jump to the 
10540 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63  end of the selec
10550 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  t processing..**
10560 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65  .** Duplicate re
10570 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49  moval in the UNI
10580 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
10590 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20  INTERSECT cases 
105a0 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69  is handled.** wi
105b0 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  thin the output 
105c0 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
105d0 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65   regPrev registe
105e0 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20  r set holds the 
105f0 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75  previously.** ou
10600 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63  tput value.  A c
10610 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64  omparison is mad
10620 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76  e against this v
10630 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74  alue and the out
10640 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65  put.** is skippe
10650 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65  d if the next re
10660 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74  sults would be t
10670 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70  he same as the p
10680 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54  revious..**.** T
10690 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
106a0 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70  n plan is to imp
106b0 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63  lement the two c
106c0 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65  oroutines and se
106d0 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e  ven.** subroutin
106e0 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70  es first, then p
106f0 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c  ut the control l
10700 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74  ogic at the bott
10710 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a  om.  Like this:.
10720 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67  **.**          g
10730 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20  oto Init.**     
10740 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coA: coroutine f
10750 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41  or left query (A
10760 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f  ).**     coB: co
10770 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68  routine for righ
10780 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20  t query (B).**  
10790 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f    outA: output o
107a0 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20  ne row of A.**  
107b0 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f    outB: output o
107c0 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49  ne row of B (UNI
107d0 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c  ON and UNION ALL
107e0 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66   only).**    Eof
107f0 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66  A: ....**    Eof
10800 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74  B: ....**    Alt
10810 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71  B: ....**    Aeq
10820 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74  B: ....**    Agt
10830 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69  B: ....**    Ini
10840 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  t: initialize co
10850 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
10860 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  s.**          yi
10870 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20  eld coA.**      
10880 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f      if eof(A) go
10890 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20  to EofA.**      
108a0 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a      yield coB.**
108b0 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
108c0 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a  (B) goto EofB.**
108d0 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72      Cmpr: Compar
108e0 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20  e A, B.**       
108f0 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65     Jump AltB, Ae
10900 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20  qB, AgtB.**     
10910 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57  End: ....**.** W
10920 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71  e call AltB, Aeq
10930 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61  B, AgtB, EofA, a
10940 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74  nd EofB "subrout
10950 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61  ines" but they a
10960 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c  re not.** actual
10970 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20  ly called using 
10980 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64  Gosub and they d
10990 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45  o not Return.  E
109a0 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f  ofA and EofB loo
109b0 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64  p.** until all d
109c0 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
109d0 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68   then jump to th
109e0 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41  e "end" labe.  A
109f0 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e  ltB, AeqB,.** an
10a00 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65  d AgtB jump to e
10a10 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f  ither L2 or to o
10a20 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f  ne of EofA or Eo
10a30 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  fB..*/.#ifndef S
10a40 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
10a50 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69  UND_SELECT.stati
10a60 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
10a70 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
10a80 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
10a90 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
10aa0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
10ab0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
10ac0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
10ad0 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
10ae0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
10af0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
10b00 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
10b10 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
10b20 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
10b30 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
10b40 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10b50 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ers */.  Select 
10b60 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
10b70 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
10b80 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
10b90 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
10ba0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
10bb0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
10bc0 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
10bd0 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
10be0 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20  t destA;     /* 
10bf0 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
10c00 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20  coroutine A */. 
10c10 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
10c20 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  B;     /* Destin
10c30 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
10c40 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72  ine B */.  int r
10c50 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20  egAddrA;        
10c60 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
10c70 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
10c80 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
10c90 20 69 6e 74 20 72 65 67 45 6f 66 41 3b 20 20 20   int regEofA;   
10ca0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74         /* Flag t
10cb0 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20  o indicate when 
10cc0 73 65 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d 70  select-A is comp
10cd0 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  lete */.  int re
10ce0 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20  gAddrB;         
10cf0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
10d00 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42  ter for select-B
10d10 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
10d20 69 6e 74 20 72 65 67 45 6f 66 42 3b 20 20 20 20  int regEofB;    
10d30 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f        /* Flag to
10d40 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73   indicate when s
10d50 65 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d 70 6c  elect-B is compl
10d60 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ete */.  int add
10d70 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
10d80 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
10d90 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
10da0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
10db0 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
10dc0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
10dd0 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
10de0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
10df0 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
10e00 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
10e10 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
10e20 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
10e30 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
10e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
10e50 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
10e60 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
10e70 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
10e80 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
10e90 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
10ea0 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
10eb0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
10ec0 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30  int addrOutB = 0
10ed0 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
10ee0 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
10ef0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
10f00 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
10f10 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
10f20 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
10f30 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
10f40 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10f50 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20  addrEofB;       
10f60 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10f70 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68  the select-B-exh
10f80 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
10f90 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
10fa0 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ltB;         /* 
10fb0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
10fc0 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  <B subroutine */
10fd0 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b  .  int addrAeqB;
10fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
10ff0 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20  ess of the A==B 
11000 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
11010 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20  int addrAgtB;   
11020 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
11030 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72   of the A>B subr
11040 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
11050 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20  regLimitA;      
11060 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
11070 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
11080 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
11090 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itB;        /* L
110a0 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
110b0 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
110c0 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20  int regPrev;    
110d0 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65        /* A range
110e0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
110f0 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f   hold previous o
11100 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73  utput */.  int s
11110 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20  avedLimit;      
11120 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
11130 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a  of p->iLimit */.
11140 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65    int savedOffse
11150 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  t;      /* Saved
11160 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66   value of p->iOf
11170 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  fset */.  int la
11180 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20  belCmpr;        
11190 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
111a0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65   start of the me
111b0 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f  rge algorithm */
111c0 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b  .  int labelEnd;
111d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
111e0 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  l for the end of
111f0 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c   the overall SEL
11200 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e  ECT stmt */.  in
11210 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20  t j1;           
11220 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74      /* Jump inst
11230 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65  ructions that ge
11240 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f  t retargetted */
11250 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
11260 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
11270 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e  of TK_ALL, TK_UN
11280 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20  ION, TK_EXCEPT, 
11290 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a  TK_INTERSECT */.
112a0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44    KeyInfo *pKeyD
112b0 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61  up = 0; /* Compa
112c0 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
112d0 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  n for duplicate 
112e0 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79  removal */.  Key
112f0 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b  Info *pKeyMerge;
11300 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
11310 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
11320 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f   merging rows */
11330 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
11340 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
11350 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11360 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11370 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68  OrderBy;   /* Th
11380 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
11390 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
113a0 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
113b0 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
113c0 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
113d0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
113e0 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20  *aPermute;      
113f0 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
11400 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  m ORDER BY terms
11410 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63   to result set c
11420 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73  olumns */..  ass
11430 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
11440 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
11450 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f   pKeyDup==0 ); /
11460 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65  * "Managed" code
11470 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69   needs this.  Ti
11480 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20  cket #3382. */. 
11490 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
114a0 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
114b0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
114c0 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
114d0 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e  * Already thrown
114e0 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44   the error if VD
114f0 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  BE alloc failed 
11500 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20  */.  labelEnd = 
11510 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
11520 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c  abel(v);.  label
11530 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Cmpr = sqlite3Vd
11540 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
11550 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20  ..  /* Patch up 
11560 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
11570 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  use.  */.  op = 
11580 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f  p->op;  .  pPrio
11590 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
115a0 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
115b0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
115c0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
115d0 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65  pOrderBy;.  asse
115e0 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a  rt( pOrderBy );.
115f0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
11600 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20  derBy->nExpr;.. 
11610 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72   /* For operator
11620 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  s other than UNI
11630 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74  ON ALL we have t
11640 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
11650 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  .  ** the ORDER 
11660 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73  BY clause covers
11670 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
11680 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
11690 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74  Add.  ** terms t
116a0 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
116b0 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61  lause as necessa
116c0 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ry..  */.  if( o
116d0 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
116e0 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61   for(i=1; db->ma
116f0 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26  llocFailed==0 &&
11700 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   i<=p->pEList->n
11710 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
11720 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
11730 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
11740 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
11750 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
11760 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b   j<nOrderBy; j++
11770 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
11780 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
11790 6d 2d 3e 69 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  m->iCol>0 );.   
117a0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
117b0 69 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b  iCol==i ) break;
117c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
117d0 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29  f( j==nOrderBy )
117e0 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
117f0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
11800 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  pr(db, TK_INTEGE
11810 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  R, 0);.        i
11820 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
11830 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
11840 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
11850 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
11860 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
11870 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
11880 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
11890 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
118a0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
118b0 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65  e, pOrderBy, pNe
118c0 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  w);.        pOrd
118d0 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
118e0 2b 2b 5d 2e 69 43 6f 6c 20 3d 20 28 75 31 36 29  ++].iCol = (u16)
118f0 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
11900 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
11910 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
11920 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e  n permutation an
11930 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69  d keyinfo that i
11940 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a  s used with.  **
11950 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   the permutation
11960 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
11970 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20  ne if the next. 
11980 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c   ** row of resul
11990 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65  ts comes from se
119a0 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42  lectA or selectB
119b0 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c  .  Also add expl
119c0 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  icit.  ** collat
119d0 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45  ions to the ORDE
119e0 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
119f0 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  s so that when t
11a00 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  he subqueries.  
11a10 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  ** to the right 
11a20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65  and the left are
11a30 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79   evaluated, they
11a40 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74   use the correct
11a50 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e  .  ** collation.
11a60 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65  .  */.  aPermute
11a70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
11a80 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
11a90 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b  (int)*nOrderBy);
11aa0 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20  .  if( aPermute 
11ab0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
11ac0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
11ad0 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  em;.    for(i=0,
11ae0 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
11af0 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; i<nOrderBy; 
11b00 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
11b10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
11b20 65 6d 2d 3e 69 43 6f 6c 3e 30 20 20 26 26 20 70  em->iCol>0  && p
11b30 49 74 65 6d 2d 3e 69 43 6f 6c 3c 3d 70 2d 3e 70  Item->iCol<=p->p
11b40 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
11b50 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69        aPermute[i
11b60 5d 20 3d 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20  ] = pItem->iCol 
11b70 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  - 1;.    }.    p
11b80 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20 20 20 20  KeyMerge =.     
11b90 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
11ba0 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
11bb0 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f 72 64 65  pKeyMerge)+nOrde
11bc0 72 42 79 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  rBy*(sizeof(Coll
11bd0 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 20 20 69  Seq*)+1));.    i
11be0 66 28 20 70 4b 65 79 4d 65 72 67 65 20 29 7b 0a  f( pKeyMerge ){.
11bf0 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
11c00 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
11c10 38 2a 29 26 70 4b 65 79 4d 65 72 67 65 2d 3e 61  8*)&pKeyMerge->a
11c20 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a  Coll[nOrderBy];.
11c30 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
11c40 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e  >nField = (u16)n
11c50 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
11c60 4b 65 79 4d 65 72 67 65 2d 3e 65 6e 63 20 3d 20  KeyMerge->enc = 
11c70 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66  ENC(db);.      f
11c80 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
11c90 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
11ca0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
11cb0 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  ;.        Expr *
11cc0 70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79  pTerm = pOrderBy
11cd0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
11ce0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
11cf0 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
11d00 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
11d10 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 54 65 72      pColl = pTer
11d20 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  m->pColl;.      
11d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11d40 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
11d50 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
11d60 61 72 73 65 2c 20 70 2c 20 61 50 65 72 6d 75 74  arse, p, aPermut
11d70 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  e[i]);.         
11d80 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d   pTerm->flags |=
11d90 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
11da0 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
11db0 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
11dc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11dd0 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f    pKeyMerge->aCo
11de0 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[i] = pColl;. 
11df0 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65         pKeyMerge
11e00 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
11e10 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
11e20 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
11e30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
11e40 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65  e{.    pKeyMerge
11e50 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
11e60 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44  Reattach the ORD
11e70 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  ER BY clause to 
11e80 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
11e90 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
11ea0 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69  pOrderBy;.  pPri
11eb0 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  or->pOrderBy = s
11ec0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
11ed0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f  p(pParse->db, pO
11ee0 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f  rderBy, 0);..  /
11ef0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e  * Allocate a ran
11f00 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  ge of temporary 
11f10 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
11f20 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64  e KeyInfo needed
11f30 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f  .  ** for the lo
11f40 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73  gic that removes
11f50 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c   duplicate resul
11f60 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a  t rows when the.
11f70 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73    ** operator is
11f80 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
11f90 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75  or INTERSECT (bu
11fa0 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29  t not UNION ALL)
11fb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
11fc0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
11fd0 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65  egPrev = 0;.  }e
11fe0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
11ff0 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
12000 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  nExpr;.    asser
12010 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78  t( nOrderBy>=nEx
12020 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
12030 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
12040 67 50 72 65 76 20 3d 20 73 71 6c 69 74 65 33 47  gPrev = sqlite3G
12050 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
12060 73 65 2c 20 6e 45 78 70 72 2b 31 29 3b 0a 20 20  se, nExpr+1);.  
12070 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12080 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
12090 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 0, regPrev);.
120a0 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71      pKeyDup = sq
120b0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
120c0 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  o(db,.          
120d0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
120e0 70 4b 65 79 44 75 70 29 20 2b 20 6e 45 78 70 72  pKeyDup) + nExpr
120f0 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
12100 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28  *)+1) );.    if(
12110 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20   pKeyDup ){.    
12120 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
12130 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b  Order = (u8*)&pK
12140 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78  eyDup->aColl[nEx
12150 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 44  pr];.      pKeyD
12160 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31  up->nField = (u1
12170 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 70  6)nExpr;.      p
12180 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d 20 45 4e  KeyDup->enc = EN
12190 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72  C(db);.      for
121a0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
121b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
121c0 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
121d0 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
121e0 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
121f0 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
12200 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
12210 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
12220 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
12230 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
12240 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
12250 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
12260 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
12270 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
12280 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
12290 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
122a0 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
122b0 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  pBy(pParse, p, p
122c0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
122d0 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69  ER");.  if( pPri
122e0 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b  or->pPrior==0 ){
122f0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
12300 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
12310 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
12320 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
12330 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a  , "ORDER");.  }.
12340 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
12350 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
12360 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
12370 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
12380 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64  rse, p, labelEnd
12390 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
123a0 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  it && op==TK_ALL
123b0 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74   ){.    regLimit
123c0 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
123d0 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  em;.    regLimit
123e0 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
123f0 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
12400 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12410 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74  Copy, p->iOffset
12420 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20   ? p->iOffset+1 
12430 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20  : p->iLimit,.   
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
12460 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73  egLimitA);.    s
12470 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12480 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
12490 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74  LimitA, regLimit
124a0 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  B);.  }else{.   
124b0 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67   regLimitA = reg
124c0 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a  LimitB = 0;.  }.
124d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
124e0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
124f0 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  t);.  p->pLimit 
12500 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 0;.  sqlite3Ex
12510 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
12520 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70  pOffset);.  p->p
12530 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72  Offset = 0;..  r
12540 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72  egAddrA = ++pPar
12550 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45  se->nMem;.  regE
12560 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ofA = ++pParse->
12570 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42  nMem;.  regAddrB
12580 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
12590 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d 20 2b  m;.  regEofB = +
125a0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
125b0 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61   regOutA = ++pPa
125c0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
125d0 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutB = ++pParse-
125e0 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
125f0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
12600 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75  destA, SRT_Corou
12610 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b  tine, regAddrA);
12620 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
12630 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c  DestInit(&destB,
12640 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
12650 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a  regAddrB);..  /*
12660 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65 20 76   Jump past the v
12670 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74 69 6e  arious subroutin
12680 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69 6e 65  es and coroutine
12690 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20  s to the main.  
126a0 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20  ** merge loop.  
126b0 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  */.  j1 = sqlite
126c0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
126d0 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64 72 53  P_Goto);.  addrS
126e0 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33  electA = sqlite3
126f0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
12700 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  v);...  /* Gener
12710 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
12720 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
12730 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12740 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66   to the.  ** lef
12750 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  t of the compoun
12760 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65  d operator - the
12770 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a   "A" select..  *
12780 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
12790 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63  ent((v, "Begin c
127a0 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
127b0 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70  t SELECT"));.  p
127c0 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
127d0 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 73 71 6c  regLimitA;.  sql
127e0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
127f0 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
12800 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
12810 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
12820 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66  teger, 1, regEof
12830 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
12840 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
12850 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  eld, regAddrA);.
12860 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12870 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75  t((v, "End corou
12880 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45  tine for left SE
12890 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47  LECT"));..  /* G
128a0 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
128b0 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
128c0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
128d0 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68  ment on .  ** th
128e0 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42  e right - the "B
128f0 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20  " select.  */.  
12900 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71  addrSelectB = sq
12910 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
12920 41 64 64 72 28 76 29 3b 0a 20 20 56 64 62 65 4e  Addr(v);.  VdbeN
12930 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
12940 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20  Begin coroutine 
12950 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43 54  for right SELECT
12960 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69  "));.  savedLimi
12970 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
12980 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70   savedOffset = p
12990 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e  ->iOffset;.  p->
129a0 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
129b0 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  tB;.  p->iOffset
129c0 20 3d 20 30 3b 20 20 0a 20 20 73 71 6c 69 74 65   = 0;  .  sqlite
129d0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
129e0 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d  p, &destB);.  p-
129f0 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c  >iLimit = savedL
12a00 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  imit;.  p->iOffs
12a10 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74  et = savedOffset
12a20 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12a30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
12a40 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42 29  ger, 1, regEofB)
12a50 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12a60 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
12a70 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
12a80 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
12a90 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69  (v, "End corouti
12aa0 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c  ne for right SEL
12ab0 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65  ECT"));..  /* Ge
12ac0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
12ad0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
12ae0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
12af0 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73   of the A.  ** s
12b00 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
12b10 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
12b20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
12b30 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
12b40 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
12b50 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
12b60 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72  for A"));.  addr
12b70 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutA = generateO
12b80 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
12b90 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
12ba0 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
12bb0 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tA, pDest, regOu
12bc0 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tA,.            
12bd0 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
12be0 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46  eyDup, P4_KEYINF
12bf0 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62 65 6c  O_HANDOFF, label
12c00 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65  End);.  .  /* Ge
12c10 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
12c20 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
12c30 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
12c40 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73   of the B.  ** s
12c50 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
12c60 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
12c70 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
12c80 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ect..  */.  if( 
12c90 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
12ca0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
12cb0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12cc0 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
12cd0 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a  utine for B"));.
12ce0 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67      addrOutB = g
12cf0 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
12d00 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73   p, &destB, pDes
12d30 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20  t, regOutB,.    
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
12d50 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50  Prev, pKeyDup, P
12d60 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43  4_KEYINFO_STATIC
12d70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d  , labelEnd);.  }
12d80 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
12d90 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
12da0 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
12db0 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
12dc0 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   A.  ** are exha
12dd0 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
12de0 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20  ata in select B 
12df0 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
12e00 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
12e10 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f  (v, "eof-A subro
12e20 75 74 69 6e 65 22 29 29 3b 0a 20 20 69 66 28 20  utine"));.  if( 
12e30 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
12e40 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
12e50 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
12e60 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  A = sqlite3VdbeA
12e70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
12e80 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  , 0, labelEnd);.
12e90 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 61    }else{  .    a
12ea0 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65  ddrEofA = sqlite
12eb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12ec0 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 6c  P_If, regEofB, l
12ed0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71  abelEnd);.    sq
12ee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12ef0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
12f00 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
12f10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12f20 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
12f30 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20  ld, regAddrB);. 
12f40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12f50 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
12f60 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20   0, addrEofA);. 
12f70 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
12f80 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
12f90 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
12fa0 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
12fb0 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct B.  ** are ex
12fc0 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
12fd0 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
12fe0 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  A remains..  */.
12ff0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54    if( op==TK_INT
13000 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
13010 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66  drEofB = addrEof
13020 41 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  A;.  }else{  .  
13030 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
13040 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62  t((v, "eof-B sub
13050 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
13060 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74  addrEofB = sqlit
13070 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13080 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
13090 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73  labelEnd);.    s
130a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
130b0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
130c0 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29  gOutA, addrOutA)
130d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
130e0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
130f0 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  eld, regAddrA);.
13100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13110 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
13120 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  , 0, addrEofB);.
13130 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
13140 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
13150 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c  e the case of A<
13160 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
13170 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
13180 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  lt-B subroutine"
13190 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d  ));.  addrAltB =
131a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
131b0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
131c0 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
131d0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
131e0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
131f0 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  eld, regAddrA);.
13200 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13210 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
13220 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29  gEofA, addrEofA)
13230 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13240 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
13250 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  , 0, labelCmpr);
13260 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
13270 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
13280 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a  he case of A==B.
13290 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
132a0 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64  K_ALL ){.    add
132b0 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
132c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
132d0 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
132e0 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
132f0 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61   addrAltB;.    a
13300 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c  ddrAltB++;.  }el
13310 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  se{.    VdbeNoop
13320 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65  Comment((v, "A-e
13330 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  q-B subroutine")
13340 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  );.    addrAeqB 
13350 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  =.    sqlite3Vdb
13360 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
13370 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  eld, regAddrA);.
13380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13390 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
133a0 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
133b0 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
133c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
133d0 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
133e0 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  pr);.  }..  /* G
133f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
13400 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
13410 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64  of A>B.  */.  Vd
13420 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
13430 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75  , "A-gt-B subrou
13440 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
13450 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  gtB = sqlite3Vdb
13460 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
13470 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
13480 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
13490 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
134a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
134b0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
134c0 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a   addrOutB);.  }.
134d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
134e0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
134f0 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 73 71   regAddrB);.  sq
13500 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13510 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
13520 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20  B, addrEofB);.  
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 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
13550 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
13560 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e  /* This code run
13570 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61  s once to initia
13580 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e  lize everything.
13590 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
135a0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
135b0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
135c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
135d0 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66  teger, 0, regEof
135e0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
135f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
13600 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66  teger, 0, regEof
13610 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
13620 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
13630 73 75 62 2c 20 72 65 67 41 64 64 72 41 2c 20 61  sub, regAddrA, a
13640 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 73  ddrSelectA);.  s
13650 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13660 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
13670 67 41 64 64 72 42 2c 20 61 64 64 72 53 65 6c 65  gAddrB, addrSele
13680 63 74 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ctB);.  sqlite3V
13690 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
136a0 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64  If, regEofA, add
136b0 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65  rEofA);.  sqlite
136c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
136d0 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61  P_If, regEofB, a
136e0 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20  ddrEofB);..  /* 
136f0 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61  Implement the ma
13700 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20  in merge loop.  
13710 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
13720 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
13730 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71  labelCmpr);.  sq
13740 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13750 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  v, OP_Permutatio
13760 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  n, 0, 0, 0, (cha
13770 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f  r*)aPermute, P4_
13780 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c  INTARRAY);.  sql
13790 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
137a0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65  , OP_Compare, de
137b0 73 74 41 2e 69 4d 65 6d 2c 20 64 65 73 74 42 2e  stA.iMem, destB.
137c0 69 4d 65 6d 2c 20 6e 4f 72 64 65 72 42 79 2c 0a  iMem, nOrderBy,.
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137e0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
137f0 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45  pKeyMerge, P4_KE
13800 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
13810 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13820 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
13830 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65  addrAltB, addrAe
13840 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 0a 0a  qB, addrAgtB);..
13850 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 65 6d    /* Release tem
13860 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
13870 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50  .  */.  if( regP
13880 72 65 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rev ){.    sqlit
13890 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
138a0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 50 72  ge(pParse, regPr
138b0 65 76 2c 20 6e 4f 72 64 65 72 42 79 2b 31 29 3b  ev, nOrderBy+1);
138c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
138d0 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e  to the this poin
138e0 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65  t in order to te
138f0 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72  rminate the quer
13900 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
13910 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
13920 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  l(v, labelEnd);.
13930 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75  .  /* Set the nu
13940 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63  mber of output c
13950 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
13960 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
13970 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
13980 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
13990 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77   = pPrior;.    w
139a0 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
139b0 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
139c0 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
139d0 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
139e0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
139f0 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
13a00 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  t);.  }..  /* Re
13a10 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d  assembly the com
13a20 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74  pound query so t
13a30 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66  hat it will be f
13a40 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  reed correctly. 
13a50 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69   ** by the calli
13a60 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ng function */. 
13a70 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
13a80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
13a90 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
13aa0 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20  >pPrior);.  }.  
13ab0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
13ac0 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a  or;..  /*** TBD:
13ad0 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74    Insert subrout
13ae0 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f  ine calls to clo
13af0 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e  se cursors on in
13b00 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20  complete.  **** 
13b10 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f  subqueries ****/
13b20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13b30 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
13b40 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
13b50 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
13b60 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
13b70 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
13b80 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61  /* Forward Decla
13b90 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
13ba0 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
13bb0 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45  List(sqlite3*, E
13bc0 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45  xprList*, int, E
13bd0 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69  xprList*);.stati
13be0 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
13bf0 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c  ct(sqlite3*, Sel
13c00 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72  ect *, int, Expr
13c10 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  List *);../*.** 
13c20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
13c30 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
13c40 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
13c50 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
13c60 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
13c70 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
13c80 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
13c90 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
13ca0 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
13cb0 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
13cc0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
13cd0 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
13ce0 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
13cf0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13d00 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
13d10 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
13d20 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
13d30 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
13d40 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
13d50 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
13d60 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
13d70 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
13d80 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
13d90 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
13da0 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
13db0 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
13dc0 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
13dd0 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
13de0 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65  routine make the
13df0 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
13e00 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
13e10 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
13e20 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
13e30 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
13e40 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
13e50 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
13e60 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
13e70 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
13e80 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78  ic Expr *substEx
13e90 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
13ea0 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  b,        /* Rep
13eb0 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
13ec0 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63  s to this connec
13ed0 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
13ee0 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
13ef0 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
13f00 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
13f10 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  rs */.  int iTab
13f20 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
13f30 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
13f40 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
13f50 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
13f60 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78  /* Substitute ex
13f70 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  pressions */.){.
13f80 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
13f90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
13fa0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
13fb0 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
13fc0 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29  iTable==iTable )
13fd0 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
13fe0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
13ff0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
14000 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
14010 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
14020 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65  pNew;.      asse
14030 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26  rt( pEList!=0 &&
14040 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
14050 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
14060 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14070 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
14080 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
14090 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
140a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
140b0 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
140c0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
140d0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
140e0 20 69 66 28 20 70 4e 65 77 20 26 26 20 70 45 78   if( pNew && pEx
140f0 70 72 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  pr->pColl ){.   
14100 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c       pNew->pColl
14110 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b   = pExpr->pColl;
14120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
14130 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
14140 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
14150 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b     pExpr = pNew;
14160 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
14170 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
14180 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
14190 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69   pExpr->pLeft, i
141a0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
141b0 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
141c0 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  t = substExpr(db
141d0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
141e0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
141f0 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
14200 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
14210 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
14220 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
14230 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78  ect(db, pExpr->x
14240 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  .pSelect, iTable
14250 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
14260 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73  else{.      subs
14270 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
14280 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54  xpr->x.pList, iT
14290 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
142a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
142b0 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69  n pExpr;.}.stati
142c0 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
142d0 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
142e0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
142f0 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
14300 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
14310 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
14320 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
14330 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
14340 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
14350 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
14360 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
14370 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
14380 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
14390 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
143a0 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
143b0 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
143c0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
143d0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
143e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
143f0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
14400 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
14410 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
14420 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  xpr(db, pList->a
14430 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
14440 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
14450 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
14460 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c  bstSelect(.  sql
14470 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
14480 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
14490 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
144a0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
144b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
144c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
144d0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
144e0 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
144f0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
14500 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
14510 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f  o be replaced */
14520 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
14530 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
14540 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
14550 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
14560 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
14570 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
14580 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
14590 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
145a0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
145b0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  , p->pEList, iTa
145c0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
145d0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
145e0 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  , p->pGroupBy, i
145f0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
14600 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
14610 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
14620 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
14630 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d  ;.  p->pHaving =
14640 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
14650 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
14660 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d  e, pEList);.  p-
14670 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
14680 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  xpr(db, p->pWher
14690 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  e, iTable, pELis
146a0 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63  t);.  substSelec
146b0 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  t(db, p->pPrior,
146c0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
146d0 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
146e0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
146f0 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66  rc );  /* Even f
14700 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65  or (SELECT 1) we
14710 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62   have: pSrc!=0 b
14720 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  ut pSrc->nSrc==0
14730 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
14740 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f  (pSrc) ){.    fo
14750 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
14760 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
14770 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
14780 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
14790 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lect(db, pItem->
147a0 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
147b0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   pEList);.    }.
147c0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
147d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
147e0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
147f0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
14800 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
14810 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
14820 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
14830 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
14840 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
14850 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
14860 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
14870 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
14880 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ies in order to 
14890 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69  speed.** executi
148a0 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  on.  It returns 
148b0 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68  1 if it makes ch
148c0 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e  anges and 0 if n
148d0 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20  o flattening.** 
148e0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
148f0 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
14900 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
14910 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
14920 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
14930 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
14940 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
14950 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
14960 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
14970 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
14980 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
14990 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
149a0 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
149b0 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
149c0 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
149d0 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
149e0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
149f0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
14a00 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
14a10 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
14a20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
14a30 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
14a40 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
14a50 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
14a60 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
14a70 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
14a80 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
14a90 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
14aa0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
14ab0 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
14ac0 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
14ad0 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
14ae0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
14af0 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
14b00 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
14b10 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
14b20 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
14b30 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
14b40 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
14b50 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
14b60 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
14b70 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
14b80 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
14b90 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
14ba0 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  pification gives
14bb0 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
14bc0 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
14bd0 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
14be0 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
14bf0 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
14c00 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
14c10 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
14c20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
14c30 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
14c40 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
14c50 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
14c60 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
14c70 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  d if all of the 
14c80 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
14c90 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
14ca0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
14cb0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
14cc0 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
14cd0 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
14ce0 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73  .**   (2)  The s
14cf0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
14d00 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
14d10 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
14d20 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
14d30 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
14d40 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
14d50 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
14d60 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
14d70 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20   join.**        
14d80 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b  (Originally tick
14d90 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67  et #306.  Streng
14da0 68 74 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74  htened by ticket
14db0 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20   #3300).**.**   
14dc0 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
14dd0 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
14de0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
14df0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
14e00 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20  in..**.**   (5) 
14e10 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
14e20 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
14e30 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14e40 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
14e50 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
14e60 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20  es..**.**   (6) 
14e70 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
14e80 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
14e90 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
14ea0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
14eb0 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
14ec0 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
14ed0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61   The subquery ha
14ee0 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  s a FROM clause.
14ef0 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68  .**.**   (8)  Th
14f00 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
14f10 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
14f20 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14f30 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
14f40 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65  **.**   (9)  The
14f50 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
14f60 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
14f70 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
14f80 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
14f90 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
14fa0 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20  s..**.**  (10)  
14fb0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
14fc0 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
14fd0 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
14fe0 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
14ff0 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c  .**        use L
15000 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31  IMIT..**.**  (11
15010 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
15020 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
15030 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
15040 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
15050 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  auses..**.**  (1
15060 32 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e  2)  Not implemen
15070 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69  ted.  Subsumed i
15080 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
15090 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f  (3).  Was previo
150a0 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61  usly.**        a
150b0 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69   separate restri
150c0 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66  ction deriving f
150d0 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e  rom ticket #350.
150e0 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68  .**.**  (13)  Th
150f0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f  e subquery and o
15100 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
15110 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54  t both use LIMIT
15120 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68  .**.**  (14)  Th
15130 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
15140 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 0a 2a  not use OFFSET.*
15150 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20  *.**  (15)  The 
15160 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
15170 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  ot part of a com
15180 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20  pound select or 
15190 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
151a0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
151b0 68 61 76 65 20 62 6f 74 68 20 61 6e 20 4f 52 44  have both an ORD
151c0 45 52 20 42 59 20 61 6e 64 20 61 20 4c 49 4d 49  ER BY and a LIMI
151d0 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20  T clause..**    
151e0 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
151f0 23 32 33 33 39 29 0a 2a 2a 0a 2a 2a 20 20 28 31  #2339).**.**  (1
15200 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  6)  The outer qu
15210 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
15220 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 73  gregate or the s
15230 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20  ubquery does.** 
15240 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61         not conta
15250 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54  in ORDER BY.  (T
15260 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68  icket #2942)  Th
15270 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d  is used to not m
15280 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  atter.**        
15290 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75  until we introdu
152a0 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f  ced the group_co
152b0 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ncat() function.
152c0 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20    .**.**  (17)  
152d0 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  The sub-query is
152e0 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20   not a compound 
152f0 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73  select, or it is
15300 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a   a UNION ALL .**
15310 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64          compound
15320 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20   clause made up 
15330 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d  entirely of non-
15340 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
15350 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20  s, and .**      
15360 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65    the parent que
15370 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ry:.**.**       
15380 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65     * is not itse
15390 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  lf part of a com
153a0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a  pound select,.**
153b0 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
153c0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
153d0 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72  or DISTINCT quer
153e0 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  y, and.**       
153f0 20 20 20 2a 20 68 61 73 20 6e 6f 20 6f 74 68 65     * has no othe
15400 72 20 74 61 62 6c 65 73 20 6f 72 20 73 75 62 2d  r tables or sub-
15410 73 65 6c 65 63 74 73 20 69 6e 20 74 68 65 20 46  selects in the F
15420 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
15430 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72  *        The par
15440 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72  ent and sub-quer
15450 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48  y may contain WH
15460 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62  ERE clauses. Sub
15470 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20  ject to.**      
15480 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31    rules (11), (1
15490 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65  3) and (14), the
154a0 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  y may also conta
154b0 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20  in ORDER BY,.** 
154c0 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64         LIMIT and
154d0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
154e0 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66  .**.**  (18)  If
154f0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
15500 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
15510 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65  ect, then all te
15520 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  rms of the.**   
15530 20 20 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c       ORDER by cl
15540 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65  ause of the pare
15550 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c  nt must be simpl
15560 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
15570 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  .**        colum
15580 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  ns of the sub-qu
15590 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29  ery..**.**  (19)
155a0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
155b0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
155c0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
155d0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
155e0 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57          have a W
155f0 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
15600 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65  **  (20)  If the
15610 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
15620 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
15630 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f   then it must no
15640 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
15650 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
15660 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37  se.  Ticket #377
15670 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c  3.  We could rel
15680 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ax this constrai
15690 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d  nt.**        som
156a0 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20  ewhat by saying 
156b0 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f  that the terms o
156c0 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
156d0 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20  lause must.**   
156e0 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75       appear as u
156f0 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74  nmodified result
15700 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
15710 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75  outer query.  Bu
15720 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  t.**        have
15730 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74   other optimizat
15740 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20  ions in mind to 
15750 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20 63  deal with that c
15760 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ase..**.** In th
15770 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
15780 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
15790 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
157a0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
157b0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
157c0 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
157d0 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
157e0 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
157f0 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
15800 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75  ggregates and su
15810 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74  bqueryIsAgg is t
15820 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
15830 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
15840 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
15850 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
15860 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
15870 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
15880 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
15890 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
158a0 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
158b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
158c0 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
158d0 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
158e0 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
158f0 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
15900 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
15910 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
15920 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
15930 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
15940 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
15950 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50  tenSubquery(.  P
15960 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15970 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15980 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
15990 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
159a0 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
159b0 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
159c0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
159d0 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
159e0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
159f0 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
15a00 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
15a10 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
15a20 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
15a30 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
15a40 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
15a50 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
15a60 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
15a70 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
15a80 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
15a90 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
15aa0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
15ab0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
15ac0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
15ad0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
15ae0 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  text;.  Select *
15af0 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63  pParent;.  Selec
15b00 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f  t *pSub;       /
15b10 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  * The inner quer
15b20 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20  y or "subquery" 
15b30 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
15b40 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  b1;      /* Poin
15b50 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
15b60 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73  most select in s
15b70 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  ub-query */.  Sr
15b80 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
15b90 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
15ba0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
15bb0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  r query */.  Src
15bc0 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20  List *pSubSrc;  
15bd0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
15be0 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
15bf0 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ery */.  ExprLis
15c00 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  t *pList;    /* 
15c10 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
15c20 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
15c30 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  y */.  int iPare
15c40 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44  nt;        /* VD
15c50 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
15c60 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73   of the pSub res
15c70 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62  ult set temp tab
15c80 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
15c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15ca0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
15cb0 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cd0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
15ce0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
15cf0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
15d00 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54  pSubitem;   /* T
15d10 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
15d20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
15d30 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
15d40 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
15d50 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
15d60 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
15d70 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
15d80 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
15d90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
15da0 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a  pPrior==0 );  /*
15db0 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74   Unable to flatt
15dc0 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  en compound quer
15dd0 69 65 73 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20  ies */.  pSrc = 
15de0 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
15df0 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
15e00 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
15e10 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
15e20 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  bitem = &pSrc->a
15e30 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65  [iFrom];.  iPare
15e40 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
15e50 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d  Cursor;.  pSub =
15e60 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
15e70 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
15e80 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  ub!=0 );.  if( i
15e90 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79  sAgg && subquery
15ea0 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
15eb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15ec0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
15ed0 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73   (1)  */.  if( s
15ee0 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20  ubqueryIsAgg && 
15ef0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
15f00 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
15f10 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
15f20 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53   (2)  */.  pSubS
15f30 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
15f40 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
15f50 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72  rc );.  /* Prior
15f60 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e   to version 3.1.
15f70 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  2, when LIMIT an
15f80 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20  d OFFSET had to 
15f90 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61  be simple consta
15fa0 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72  nts,.  ** not ar
15fb0 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73  bitrary expresss
15fc0 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
15fd0 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
15fe0 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
15ff0 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
16000 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
16010 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
16020 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
16030 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
16040 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
16050 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
16060 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
16070 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
16080 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
16090 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
160a0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
160b0 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
160c0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
160d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
160e0 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
160f0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
16100 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
16130 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
16140 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74  .  if( p->pRight
16150 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c  most && pSub->pL
16160 69 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70 4f  imit && pSub->pO
16170 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65  rderBy ){.    re
16180 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
161c0 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (15) */.  }.  
161d0 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
161e0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16200 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
16210 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20  ction (7)  */.  
16220 69 66 28 20 28 28 70 53 75 62 2d 3e 73 65 6c 46  if( ((pSub->selF
16230 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
16240 63 74 29 21 3d 30 20 7c 7c 20 70 53 75 62 2d 3e  ct)!=0 || pSub->
16250 70 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20  pLimit) .       
16260 20 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63    && (pSrc->nSrc
16270 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 20  >1 || isAgg) ){ 
16280 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
16290 72 69 63 74 69 6f 6e 73 20 28 34 29 28 35 29 28  rictions (4)(5)(
162a0 38 29 28 39 29 20 2a 2f 0a 20 20 20 20 20 72 65  8)(9) */.     re
162b0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 0a 20  turn 0;       . 
162c0 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
162d0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
162e0 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75  nct)!=0 && subqu
162f0 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
16300 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
16310 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
16320 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20  n (6)  */.  }.  
16330 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
16340 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
16350 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
16360 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
16370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16390 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
163a0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
163b0 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
163c0 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
163d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
163e0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
163f0 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
16400 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
16410 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
16420 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
16430 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
16440 20 28 31 39 29 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   (19) */..  /* O
16450 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20  BSOLETE COMMENT 
16460 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74  1:.  ** Restrict
16470 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73  ion 3:  If the s
16480 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69  ubquery is a joi
16490 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
164a0 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20   subquery is .  
164b0 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74  ** not used as t
164c0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
164d0 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69   of an outer joi
164e0 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  n.  Examples of 
164f0 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73  why this.  ** is
16500 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
16510 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
16520 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
16530 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a  IN (t2 JOIN t3).
16540 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
16550 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
16560 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
16570 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
16580 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
16590 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74   JOIN t2) JOIN t
165a0 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63  3.  **.  ** whic
165b0 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  h is not at all 
165c0 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a  the same thing..
165d0 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45    **.  ** OBSOLE
165e0 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20  TE COMMENT 2:.  
165f0 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  ** Restriction 1
16600 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  2:  If the subqu
16610 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
16620 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
16630 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f  ft outer.  ** jo
16640 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
16650 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e  e subquery has n
16660 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  o WHERE clause..
16670 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73    ** An examples
16680 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20   of why this is 
16690 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
166a0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
166b0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
166c0 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
166d0 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30   t2 WHERE t2.x>0
166e0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
166f0 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
16700 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
16710 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
16720 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
16730 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52  ER JOIN t2) WHER
16740 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20  E t2.x>0.  **.  
16750 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e  ** But the t2.x>
16760 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61  0 test will alwa
16770 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c  ys fail on a NUL
16780 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69  L row of t2, whi
16790 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76  ch.  ** effectiv
167a0 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65  ely converts the
167b0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f   OUTER JOIN into
167c0 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a   an INNER JOIN..
167d0 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f    **.  ** THIS O
167e0 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54  VERRIDES OBSOLET
167f0 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44  E COMMENTS 1 AND
16800 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54   2 ABOVE:.  ** T
16810 69 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77  icket #3300 show
16820 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e  s that flattenin
16830 67 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  g the right term
16840 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a   of a LEFT JOIN.
16850 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20    ** is fraught 
16860 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65  with danger.  Be
16870 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20  st to avoid the 
16880 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66  whole thing.  If
16890 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
168a0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
168b0 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a  term of a LEFT J
168c0 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  OIN, then do not
168d0 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   flatten..  */. 
168e0 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e   if( (pSubitem->
168f0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
16900 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  TER)!=0 ){.    r
16910 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
16920 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
16930 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  7: If the sub-qu
16940 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
16950 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69  d SELECT, then i
16960 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  t must.  ** use 
16970 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41  only the UNION A
16980 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64  LL operator. And
16990 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d   none of the sim
169a0 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69  ple select queri
169b0 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b  es.  ** that mak
169c0 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e  e up the compoun
169d0 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c  d SELECT are all
169e0 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65  owed to be aggre
169f0 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74  gate or distinct
16a00 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
16a10 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
16a20 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
16a30 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
16a40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16a50 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74   0;  /* Restrict
16a60 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a  ion 20 */.    }.
16a70 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c      if( isAgg ||
16a80 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
16a90 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
16aa0 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  || pSrc->nSrc!=1
16ab0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16ac0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   0;.    }.    fo
16ad0 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53  r(pSub1=pSub; pS
16ae0 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31  ub1; pSub1=pSub1
16af0 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
16b00 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
16b10 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
16b20 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
16b30 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
16b40 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
16b50 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
16b60 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
16b70 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
16b80 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
16b90 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20  regate );.      
16ba0 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  if( (pSub1->selF
16bb0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
16bc0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
16bd0 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ))!=0.       || 
16be0 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26  (pSub1->pPrior &
16bf0 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f  & pSub1->op!=TK_
16c00 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  ALL) .       || 
16c10 4e 45 56 45 52 28 70 53 75 62 31 2d 3e 70 53 72  NEVER(pSub1->pSr
16c20 63 3d 3d 30 29 20 7c 7c 20 70 53 75 62 31 2d 3e  c==0) || pSub1->
16c30 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 0a 20 20  pSrc->nSrc!=1.  
16c40 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72      ){.        r
16c50 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
16c60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
16c70 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a  estriction 18. *
16c80 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72  /.    if( p->pOr
16c90 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
16ca0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72  nt ii;.      for
16cb0 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72  (ii=0; ii<p->pOr
16cc0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69  derBy->nExpr; ii
16cd0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
16ce0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b   p->pOrderBy->a[
16cf0 69 69 5d 2e 69 43 6f 6c 3d 3d 30 20 29 20 72 65  ii].iCol==0 ) re
16d00 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
16d10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a      }.  }..  /**
16d20 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
16d30 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
16d40 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
16d50 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f  ted. *****/..  /
16d60 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20  * Authorize the 
16d70 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50  subquery */.  pP
16d80 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
16d90 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a  xt = pSubitem->z
16da0 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 41  Name;.  sqlite3A
16db0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
16dc0 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
16dd0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 70 50 61 72  0, 0, 0);.  pPar
16de0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
16df0 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
16e00 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  text;..  /* If t
16e10 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
16e20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
16e30 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
16e40 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f  n (by restrictio
16e50 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31  ns.  ** 17 and 1
16e60 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74  8 above) it must
16e70 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   be a UNION ALL 
16e80 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71  and the parent q
16e90 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20  uery must .  ** 
16ea0 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  be of the form:.
16eb0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
16ec0 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e  LECT <expr-list>
16ed0 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72   FROM (<sub-quer
16ee0 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73  y>) <where-claus
16ef0 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f  e> .  **.  ** fo
16f00 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52  llowed by any OR
16f10 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e  DER BY, LIMIT an
16f20 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75  d/or OFFSET clau
16f30 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a  ses. This block.
16f40 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31    ** creates N-1
16f50 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
16f60 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68  arent query with
16f70 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59  out any ORDER BY
16f80 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a  , LIMIT or .  **
16f90 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20   OFFSET clauses 
16fa0 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74  and joins them t
16fb0 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d  o the left-hand-
16fc0 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67  side of the orig
16fd0 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20  inal.  ** using 
16fe0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
16ff0 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ors. In this cas
17000 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
17010 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a  r of simple.  **
17020 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
17030 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75  ts in the compou
17040 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  nd sub-query..  
17050 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  **.  ** Example:
17060 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
17070 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28  ELECT a+1 FROM (
17080 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
17090 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20  ECT x FROM tab. 
170a0 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
170b0 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
170c0 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y FROM t
170d0 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
170e0 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
170f0 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
17100 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20  z*2) FROM tab2. 
17110 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20   **     ) WHERE 
17120 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a  a!=5 ORDER BY 1.
17130 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66    **.  ** Transf
17140 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  ormed into:.  **
17150 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
17160 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   x+1 FROM tab WH
17170 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE x+1!=5.  ** 
17180 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
17190 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b  **     SELECT y+
171a0 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
171b0 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   y+1!=5.  **    
171c0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
171d0 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
171e0 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20  *2)+1 FROM tab2 
171f0 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31  WHERE abs(z*2)+1
17200 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44  !=5.  **     ORD
17210 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
17220 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74  * We call this t
17230 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  he "compound-sub
17240 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
17250 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53  "..  */.  for(pS
17260 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b  ub=pSub->pPrior;
17270 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62   pSub; pSub=pSub
17280 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53  ->pPrior){.    S
17290 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20  elect *pNew;.   
172a0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
172b0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
172c0 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69  y;.    Expr *pLi
172d0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
172e0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72  .    Select *pPr
172f0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
17300 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
17310 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72   = 0;.    p->pSr
17320 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50  c = 0;.    p->pP
17330 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rior = 0;.    p-
17340 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
17350 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   pNew = sqlite3S
17360 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20  electDup(db, p, 
17370 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69  0);.    p->pLimi
17380 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
17390 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
173a0 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70  rderBy;.    p->p
173b0 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
173c0 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a  p->op = TK_ALL;.
173d0 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
173e0 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  t = 0;.    if( p
173f0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
17400 70 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20  pNew = pPrior;. 
17410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17420 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
17430 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65  Prior;.      pNe
17440 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  w->pRightmost = 
17450 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  0;.    }.    p->
17460 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
17470 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
17480 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
17490 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   1;.  }..  /* Be
174a0 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  gin flattening t
174b0 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  he iFrom-th entr
174c0 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
174d0 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68  ause .  ** in th
174e0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
174f0 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75   */.  pSub = pSu
17500 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  b1 = pSubitem->p
17510 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65  Select;..  /* De
17520 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65  lete the transie
17530 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
17540 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
17550 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
17560 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
17570 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
17580 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
17590 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
175a0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
175b0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
175c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
175d0 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
175e0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  .  pSubitem->zDa
175f0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53  tabase = 0;.  pS
17600 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
17610 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
17620 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75  Alias = 0;.  pSu
17630 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  bitem->pSelect =
17640 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20   0;..  /* Defer 
17650 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62  deleting the Tab
17660 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  le object associ
17670 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
17680 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69  ** subquery unti
17690 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
176a0 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  n is.  ** comple
176b0 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  te, since there 
176c0 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20  may still exist 
176d0 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65  Expr.pTab entrie
176e0 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65  s that.  ** refe
176f0 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  r to the subquer
17700 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61  y even after fla
17710 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74  ttening.  Ticket
17720 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a   #3346..  **.  *
17730 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  * pSubitem->pTab
17740 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e   is always non-N
17750 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74  ULL by test rest
17760 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73  rictions and tes
17770 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20  ts above..  */. 
17780 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62   if( ALWAYS(pSub
17790 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29  item->pTab!=0) )
177a0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
177b0 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65  bToDel = pSubite
177c0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
177d0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
177e0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 54 61  ==1 ){.      pTa
177f0 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d  bToDel->pNextZom
17800 62 69 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 5a  bie = pParse->pZ
17810 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20  ombieTab;.      
17820 70 50 61 72 73 65 2d 3e 70 5a 6f 6d 62 69 65 54  pParse->pZombieT
17830 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
17840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17850 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
17860 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
17870 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
17880 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
17890 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
178a0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
178b0 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
178c0 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
178d0 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
178e0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
178f0 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
17900 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
17910 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
17920 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
17930 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
17940 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
17950 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
17960 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
17970 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
17980 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
17990 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
179a0 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
179b0 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
179c0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
179d0 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
179e0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
179f0 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
17a00 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
17a10 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
17a20 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
17a30 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
17a40 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
17a50 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
17a60 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
17a70 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
17a80 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
17a90 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
17aa0 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
17ab0 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
17ac0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
17ad0 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
17ae0 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
17af0 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
17b00 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
17b10 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
17b20 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
17b30 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
17b40 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
17b50 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
17b60 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
17b70 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
17b80 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
17b90 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
17ba0 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
17bb0 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
17bc0 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
17bd0 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
17be0 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
17bf0 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
17c00 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
17c10 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
17c20 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
17c30 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
17c40 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
17c50 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
17c60 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
17c70 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
17c80 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
17c90 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
17ca0 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
17cb0 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
17cc0 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
17cd0 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
17ce0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
17cf0 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
17d00 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  >jointype;.    }
17d10 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
17d20 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
17d30 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
17d40 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
17d50 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
17d60 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
17d70 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
17d80 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
17d90 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
17da0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
17db0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
17dc0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
17dd0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
17de0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
17df0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
17e00 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
17e10 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
17e20 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
17e30 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
17e40 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
17e50 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
17e60 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
17e70 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
17e80 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
17e90 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
17ea0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17eb0 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
17ec0 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
17ed0 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
17ee0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
17ef0 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
17f00 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
17f10 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
17f20 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
17f30 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
17f40 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
17f50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
17f60 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
17f70 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
17f80 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
17f90 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
17fa0 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
17fb0 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
17fc0 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
17fd0 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
17fe0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
17ff0 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
18000 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
18010 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74   query to 4 slot
18020 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20  s.  The middle. 
18030 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78     ** slot is ex
18040 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
18050 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
18060 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74  make space for t
18070 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c  he.    ** two el
18080 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
18090 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
180a0 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
180b0 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
180c0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
180d0 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
180e0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
180f0 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
18100 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
18110 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
18120 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
18130 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
18140 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
18150 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
18160 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
18170 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
18180 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
18190 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
181a0 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
181b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
181c0 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
181d0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
181e0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
181f0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
18200 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63  ing);.      pSrc
18210 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
18220 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
18230 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
18240 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
18250 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
18260 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
18270 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
18280 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
18290 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
182a0 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
182b0 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
182c0 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
182d0 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
182e0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
182f0 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
18300 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
18310 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
18320 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
18330 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
18340 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
18350 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
18360 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
18370 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
18380 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
18390 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
183a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
183b0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
183c0 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
183d0 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
183e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
183f0 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
18400 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18410 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
18420 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
18430 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
18440 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
18450 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
18460 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
18470 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
18480 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
18490 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
184a0 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
184b0 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
184c0 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
184d0 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
184e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
184f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
18500 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
18510 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
18520 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
18530 73 74 20 63 68 61 72 20 2a 7a 53 70 61 6e 20 3d  st char *zSpan =
18540 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70   pList->a[i].zSp
18550 61 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  an;.        if( 
18560 41 4c 57 41 59 53 28 7a 53 70 61 6e 29 20 29 7b  ALWAYS(zSpan) ){
18570 0a 20 20 20 20 20 20 20 20 20 20 70 4c 69 73 74  .          pList
18580 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
18590 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
185a0 62 2c 20 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  b, zSpan);.     
185b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
185c0 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72   }.    substExpr
185d0 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
185e0 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
185f0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
18600 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  ;.    if( isAgg 
18610 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
18620 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
18630 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  nt->pGroupBy, iP
18640 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
18650 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
18660 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
18670 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
18680 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
18690 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
186a0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
186b0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
186c0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rBy ){.      ass
186d0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f  ert( pParent->pO
186e0 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
186f0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
18700 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
18710 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
18720 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
18730 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
18740 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
18750 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
18760 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
18770 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  ent->pOrderBy, i
18780 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
18790 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
187a0 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
187b0 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72  e ){.      pWher
187c0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
187d0 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
187e0 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ere, 0);.    }el
187f0 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65  se{.      pWhere
18800 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
18810 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
18820 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
18830 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  t( pParent->pHav
18840 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ing==0 );.      
18850 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
18860 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65   = pParent->pWhe
18870 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
18880 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  t->pWhere = pWhe
18890 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
188a0 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
188b0 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
188c0 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
188d0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
188e0 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
188f0 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  nt->pHaving = sq
18900 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
18910 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
18920 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18940 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18950 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
18960 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20  Having, 0));.   
18970 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
18980 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  nt->pGroupBy==0 
18990 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
189a0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
189b0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
189c0 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
189d0 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  By, 0);.    }els
189e0 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e{.      pParent
189f0 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
18a00 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
18a10 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
18a20 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
18a30 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
18a40 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
18a50 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
18a60 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57  rent->pWhere, pW
18a70 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  here);.    }.  .
18a80 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74      /* The flatt
18a90 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
18aa0 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
18ab0 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
18ac0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
18ad0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
18ae0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  . .    */.    pP
18af0 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20  arent->selFlags 
18b00 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  |= pSub->selFlag
18b10 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b  s & SF_Distinct;
18b20 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
18b30 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
18b40 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
18b50 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
18b60 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
18b70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
18b80 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
18b90 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
18ba0 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
18bb0 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
18bc0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
18bd0 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
18be0 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
18bf0 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
18c00 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
18c10 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
18c20 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
18c30 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
18c40 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
18c50 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
18c60 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
18c70 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
18c80 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
18c90 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
18ca0 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
18cb0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
18cc0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31  Delete(db, pSub1
18cd0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
18ce0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
18cf0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
18d00 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
18d10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
18d20 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
18d30 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53  ** Analyze the S
18d40 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
18d50 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
18d60 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20  ument to see if 
18d70 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69 6e 28 29  it.** is a min()
18d80 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
18d90 20 52 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   Return WHERE_OR
18da0 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45  DERBY_MIN or WHE
18db0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20 69  RE_ORDERBY_MAX i
18dc0 66 20 0a 2a 2a 20 69 74 20 69 73 2c 20 6f 72 20  f .** it is, or 
18dd0 30 20 6f 74 68 65 72 77 69 73 65 2e 20 41 74 20  0 otherwise. At 
18de0 70 72 65 73 65 6e 74 2c 20 61 20 71 75 65 72 79  present, a query
18df0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74   is considered t
18e00 6f 20 62 65 0a 2a 2a 20 61 20 6d 69 6e 28 29 2f  o be.** a min()/
18e10 6d 61 78 28 29 20 71 75 65 72 79 20 69 66 3a 0a  max() query if:.
18e20 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65 72 65  **.**   1. There
18e30 20 69 73 20 61 20 73 69 6e 67 6c 65 20 6f 62 6a   is a single obj
18e40 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ect in the FROM 
18e50 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
18e60 32 2e 20 54 68 65 72 65 20 69 73 20 61 20 73 69  2. There is a si
18e70 6e 67 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20  ngle expression 
18e80 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
18e90 74 2c 20 61 6e 64 20 69 74 20 69 73 0a 2a 2a 20  t, and it is.** 
18ea0 20 20 20 20 20 65 69 74 68 65 72 20 6d 69 6e 28       either min(
18eb0 78 29 20 6f 72 20 6d 61 78 28 78 29 2c 20 77 68  x) or max(x), wh
18ec0 65 72 65 20 78 20 69 73 20 61 20 63 6f 6c 75 6d  ere x is a colum
18ed0 6e 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2f 0a  n reference..*/.
18ee0 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78  static u8 minMax
18ef0 51 75 65 72 79 28 53 65 6c 65 63 74 20 2a 70 29  Query(Select *p)
18f00 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
18f10 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
18f20 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
18f30 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ..  if( pEList->
18f40 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
18f50 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
18f60 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45 78 70 72 20  NORMAL;.  pExpr 
18f70 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  = pEList->a[0].p
18f80 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70  Expr;.  if( pExp
18f90 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
18fa0 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
18fb0 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 45  0;.  if( NEVER(E
18fc0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
18fd0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
18fe0 63 74 29 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ct)) ) return 0;
18ff0 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70  .  pEList = pExp
19000 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66  r->x.pList;.  if
19010 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  ( pEList==0 || p
19020 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
19030 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
19040 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ( pEList->a[0].p
19050 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
19060 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
19070 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
19080 4f 52 4d 41 4c 3b 0a 20 20 61 73 73 65 72 74 28  ORMAL;.  assert(
19090 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
190a0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
190b0 61 6c 75 65 29 20 29 3b 0a 20 20 69 66 28 20 73  alue) );.  if( s
190c0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
190d0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d  xpr->u.zToken,"m
190e0 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  in")==0 ){.    r
190f0 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
19100 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73 65  RBY_MIN;.  }else
19110 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
19120 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Cmp(pExpr->u.zTo
19130 6b 65 6e 2c 22 6d 61 78 22 29 3d 3d 30 20 29 7b  ken,"max")==0 ){
19140 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48 45 52  .    return WHER
19150 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20  E_ORDERBY_MAX;. 
19160 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 48 45 52   }.  return WHER
19170 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
19180 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
19190 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
191a0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
191b0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
191c0 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
191d0 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ry..** The secon
191e0 64 20 61 72 67 6d 65 6e 74 20 69 73 20 74 68 65  d argment is the
191f0 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72   associated aggr
19200 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63  egate-info objec
19210 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  t. This .** func
19220 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68  tion tests if th
19230 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74  e SELECT is of t
19240 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
19250 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
19260 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a   FROM <tbl>.**.*
19270 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73  * where table is
19280 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
19290 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c  e, not a sub-sel
192a0 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20  ect or view. If 
192b0 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65  the query.** doe
192c0 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74  s match this pat
192d0 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69  tern, then a poi
192e0 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c  nter to the Tabl
192f0 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65  e object represe
19300 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69  nting.** <tbl> i
19310 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
19320 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
19330 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
19340 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43  Table *isSimpleC
19350 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  ount(Select *p, 
19360 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
19370 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  o){.  Table *pTa
19380 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  b;.  Expr *pExpr
19390 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d  ;..  assert( !p-
193a0 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20  >pGroupBy );..  
193b0 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c  if( p->pWhere ||
193c0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
193d0 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70  r!=1 .   || p->p
193e0 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20  Src->nSrc!=1 || 
193f0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
19400 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72  elect.  ){.    r
19410 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
19420 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
19430 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70  [0].pTab;.  pExp
19440 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
19450 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73  [0].pExpr;.  ass
19460 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54  ert( pTab && !pT
19470 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70  ab->pSelect && p
19480 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49  Expr );..  if( I
19490 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
194a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
194b0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
194c0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
194d0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
194e0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
194f0 5d 2e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 26 53  ].pFunc->flags&S
19500 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54  QLITE_FUNC_COUNT
19510 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
19520 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
19530 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20  ags&EP_Distinct 
19540 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72  ) return 0;..  r
19550 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
19560 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72  *.** If the sour
19570 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73  ce-list item pas
19580 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
19590 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64  nt was augmented
195a0 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45   with an.** INDE
195b0 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
195c0 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74  hen try to locat
195d0 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
195e0 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a  index. If there.
195f0 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c  ** was such a cl
19600 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d  ause and the nam
19610 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  ed index cannot 
19620 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
19630 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
19640 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65  R and leave an e
19650 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20  rror in pParse. 
19660 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c  Otherwise, popul
19670 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70  ate .** pFrom->p
19680 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e  Index and return
19690 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
196a0 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  nt sqlite3Indexe
196b0 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20  dByLookup(Parse 
196c0 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
196d0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
196e0 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f  rom){.  if( pFro
196f0 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d  m->pTab && pFrom
19700 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->zIndex ){.    
19710 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
19720 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63  rom->pTab;.    c
19730 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46  har *zIndex = pF
19740 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20  rom->zIndex;.   
19750 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
19760 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
19770 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20  >pIndex; .      
19780 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65    pIdx && sqlite
19790 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a  3StrICmp(pIdx->z
197a0 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a  Name, zIndex); .
197b0 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64          pIdx=pId
197c0 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a  x->pNext.    );.
197d0 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b      if( !pIdx ){
197e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
197f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
19800 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
19810 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a  s", zIndex, 0);.
19820 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19830 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
19840 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64  .    pFrom->pInd
19850 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20  ex = pIdx;.  }. 
19860 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19870 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
19880 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61   routine is a Wa
19890 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f  lker callback fo
198a0 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20  r "expanding" a 
198b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
198c0 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22  ..** "Expanding"
198d0 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65   means to do the
198e0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
198f0 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
19900 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
19910 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
19920 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
19930 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
19940 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
19950 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
19960 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
19970 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
19980 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
19990 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
199a0 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
199b0 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
199c0 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
199d0 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
199e0 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
199f0 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
19a00 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
19a10 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
19a20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
19a30 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
19a40 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
19a50 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
19a60 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
19a70 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
19a80 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
19a90 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
19aa0 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
19ab0 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
19ac0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
19ad0 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
19ae0 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
19af0 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69  ing up the presi
19b00 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
19b10 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
19b20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
19b30 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
19b40 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
19b50 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
19b60 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52  modate the NATUR
19b70 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20  AL keyword.**   
19b80 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61        on joins a
19b90 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  nd the ON and US
19ba0 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f  ING clause of jo
19bb0 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34  ins..**.**    (4
19bc0 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74  )  Scan the list
19bd0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
19be0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70  he result set (p
19bf0 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a  EList) looking.*
19c00 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e  *         for in
19c10 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22  stances of the "
19c20 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74  *" operator or t
19c30 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61  he TABLE.* opera
19c40 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tor..**         
19c50 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64  If found, expand
19c60 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20   each "*" to be 
19c70 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
19c80 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20  every table.**  
19c90 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45         and TABLE
19ca0 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  .* to be every c
19cb0 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a  olumn in TABLE..
19cc0 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
19cd0 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
19ce0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
19cf0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
19d00 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
19d10 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
19d20 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20    int i, j, k;. 
19d30 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
19d40 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
19d50 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  pEList;.  struct
19d60 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
19d70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  From;.  sqlite3 
19d80 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
19d90 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  ;..  if( db->mal
19da0 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20  locFailed  ){.  
19db0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
19dc0 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45  rt;.  }.  if( NE
19dd0 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20  VER(p->pSrc==0) 
19de0 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
19df0 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d  & SF_Expanded)!=
19e00 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
19e10 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
19e20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
19e30 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 70  SF_Expanded;.  p
19e40 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
19e50 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
19e60 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d  >pEList;..  /* M
19e70 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
19e80 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
19e90 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
19ea0 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
19eb0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
19ec0 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
19ed0 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
19ee0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
19ef0 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
19f00 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
19f10 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
19f20 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
19f30 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
19f40 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
19f50 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
19f60 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
19f70 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
19f80 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
19f90 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
19fa0 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
19fb0 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
19fc0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
19fd0 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
19fe0 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
19ff0 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
1a000 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
1a010 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1a020 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
1a030 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
1a040 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
1a050 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b!=0 ){.      /*
1a060 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
1a070 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1a080 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72   prepared.  Ther
1a090 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
1a0a0 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74     ** to go furt
1a0b0 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  her. */.      as
1a0c0 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20  sert( i==0 );.  
1a0d0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1a0e0 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rune;.    }.    
1a0f0 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
1a100 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
1a110 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1a120 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74  ERY.      Select
1a130 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
1a140 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f  pSelect;.      /
1a150 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
1a160 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1a170 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
1a180 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1a190 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  el!=0 );.      a
1a1a0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
1a1b0 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ab==0 );.      s
1a1c0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
1a1d0 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
1a1e0 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
1a1f0 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
1a200 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
1a210 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
1a220 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ));.      if( pT
1a230 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
1a240 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
1a250 70 54 61 62 2d 3e 64 62 4d 65 6d 20 3d 20 64 62  pTab->dbMem = db
1a260 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
1a270 62 6c 65 64 20 3f 20 64 62 20 3a 20 30 3b 0a 20  bled ? db : 0;. 
1a280 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20       pTab->nRef 
1a290 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  = 1;.      pTab-
1a2a0 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
1a2b0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c  MPrintf(db, "sql
1a2c0 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f  ite_subquery_%p_
1a2d0 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b  ", (void*)pTab);
1a2e0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53  .      while( pS
1a2f0 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53  el->pPrior ){ pS
1a300 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
1a310 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63  r; }.      selec
1a320 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
1a330 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
1a340 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  l->pEList, &pTab
1a350 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
1a360 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Col);.      pTab
1a370 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
1a380 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
1a390 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
1a3a0 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  al;.#endif.    }
1a3b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
1a3c0 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
1a3d0 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e   or view name in
1a3e0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1a3f0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1a400 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
1a410 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d   );.      pFrom-
1a420 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a  >pTab = pTab = .
1a430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
1a440 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
1a450 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  e,0,pFrom->zName
1a460 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73  ,pFrom->zDatabas
1a470 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  e);.      if( pT
1a480 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
1a490 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
1a4a0 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69  pTab->nRef++;.#i
1a4b0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1a4c0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
1a4d0 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45  !defined (SQLITE
1a4e0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1a4f0 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70 54  LE).      if( pT
1a500 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49  ab->pSelect || I
1a510 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
1a520 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
1a530 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68  reach here if th
1a540 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
1a550 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77   a really a view
1a560 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1a570 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
1a580 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
1a590 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  , pTab) ) return
1a5a0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
1a5b0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
1a5c0 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  m->pSelect==0 );
1a5d0 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
1a5e0 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
1a5f0 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
1a600 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Tab->pSelect, 0)
1a610 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1a620 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
1a630 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ker, pFrom->pSel
1a640 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ect);.      }.#e
1a650 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
1a660 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  /* Locate the in
1a670 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65  dex named by the
1a680 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1a690 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  se, if any. */. 
1a6a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e     if( sqlite3In
1a6b0 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50  dexedByLookup(pP
1a6c0 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
1a6d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
1a6e0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
1a6f0 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
1a700 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
1a710 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
1a720 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
1a730 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
1a740 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a750 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73   || sqliteProces
1a760 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29  sJoin(pParse, p)
1a770 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
1a780 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
1a790 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a   /* For every "*
1a7a0 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  " that occurs in
1a7b0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
1a7c0 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  , insert the nam
1a7d0 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63  es of.  ** all c
1a7e0 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
1a7f0 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65  bles.  And for e
1a800 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73  very TABLE.* ins
1a810 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20  ert the names.  
1a820 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ** of all column
1a830 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65  s in TABLE.  The
1a840 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64   parser inserted
1a850 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
1a860 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ssion.  ** with 
1a870 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61  the TK_ALL opera
1a880 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
1a890 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
1a8a0 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
1a8b0 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  t..  ** The foll
1a8c0 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20  owing code just 
1a8d0 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  has to locate th
1a8e0 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73  e TK_ALL express
1a8f0 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a  ions and expand.
1a900 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f    ** each one to
1a910 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
1a920 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
1a930 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
1a940 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  * The first loop
1a950 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20   just checks to 
1a960 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
1a970 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f   any "*" operato
1a980 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65  rs.  ** that nee
1a990 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a  d expanding..  *
1a9a0 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70  /.  for(k=0; k<p
1a9b0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
1a9c0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1a9d0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
1a9e0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
1a9f0 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20  E->op==TK_ALL ) 
1aa00 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
1aa10 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
1aa20 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21  T || pE->pRight!
1aa30 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1aa40 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
1aa50 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d   || (pE->pLeft!=
1aa60 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  0 && pE->pLeft->
1aa70 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20  op==TK_ID) );.  
1aa80 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
1aa90 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
1aaa0 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  ht->op==TK_ALL )
1aab0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
1aac0 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ( k<pEList->nExp
1aad0 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  r ){.    /*.    
1aae0 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72  ** If we get her
1aaf0 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72  e it means the r
1ab00 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69  esult set contai
1ab10 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22  ns one or more "
1ab20 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  *".    ** operat
1ab30 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
1ab40 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c   be expanded.  L
1ab50 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
1ab60 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
1ab70 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
1ab80 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20   set and expand 
1ab90 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  them one by one.
1aba0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75  .    */.    stru
1abb0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1abc0 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b   *a = pEList->a;
1abd0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1abe0 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  New = 0;.    int
1abf0 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d   flags = pParse-
1ac00 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  >db->flags;.    
1ac10 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20  int longNames = 
1ac20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1ac30 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
1ac40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ac50 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73         && (flags
1ac60 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
1ac70 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20  olNames)==0;..  
1ac80 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
1ac90 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
1aca0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
1acb0 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
1acc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
1acd0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
1ace0 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  E->pRight!=0 );.
1acf0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
1ad00 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d  !=TK_ALL && (pE-
1ad10 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
1ad20 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  E->pRight->op!=T
1ad30 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  K_ALL) ){.      
1ad40 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
1ad50 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
1ad60 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
1ad70 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
1ad80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ad90 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
1ada0 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
1adb0 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d  arse, pNew, a[k]
1adc0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
1add0 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
1ade0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
1adf0 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
1ae00 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
1ae10 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
1ae20 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
1ae30 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e  1].zSpan = a[k].
1ae40 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20  zSpan;.         
1ae50 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
1ae60 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
1ae70 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20  zSpan = 0;.     
1ae80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b     }.        a[k
1ae90 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ].pExpr = 0;.   
1aea0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1aeb0 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
1aec0 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
1aed0 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
1aee0 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
1aef0 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
1af00 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
1af10 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
1af20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
1af30 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
1af40 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hes */.        c
1af50 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20  har *zTName;    
1af60 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20          /* text 
1af70 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
1af80 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1af90 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pE->op==TK_DOT )
1afa0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
1afb0 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30  rt( pE->pLeft!=0
1afc0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
1afd0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1afe0 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74  operty(pE->pLeft
1aff0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1b000 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  ;.          zTNa
1b010 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  me = pE->pLeft->
1b020 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
1b030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b040 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20     zTName = 0;. 
1b050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b060 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
1b070 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
1b080 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1b090 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
1b0a0 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
1b0b0 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
1b0c0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  b;.          cha
1b0d0 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
1b0e0 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
1b0f0 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
1b100 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
1b110 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
1b120 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
1b130 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b140 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
1b150 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b  ocFailed ) break
1b160 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1b170 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65  zTName && sqlite
1b180 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c  3StrICmp(zTName,
1b190 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b   zTabName)!=0 ){
1b1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
1b1b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1b1c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62   }.          tab
1b1d0 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  leSeen = 1;.    
1b1e0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1b1f0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
1b200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
1b210 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69  xpr *pExpr, *pRi
1b220 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
1b230 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
1b240 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
1b250 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
1b260 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20  char *zColname; 
1b270 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64   /* The computed
1b280 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
1b290 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
1b2a0 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20   *zToFree;   /* 
1b2b0 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20  Malloced string 
1b2c0 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
1b2d0 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20   freed */.      
1b2e0 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c        Token sCol
1b2f0 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74  name;  /* Comput
1b300 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61  ed column name a
1b310 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20  s a token */..  
1b320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1b330 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b  a column is mark
1b340 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28  ed as 'hidden' (
1b350 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70  currently only p
1b360 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
1b370 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75      ** for virtu
1b380 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e  al tables), do n
1b390 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e  ot include it in
1b3a0 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20   the expanded.  
1b3b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73            ** res
1b3c0 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20  ult-set list..  
1b3d0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1b3e0 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48           if( IsH
1b3f0 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61  iddenColumn(&pTa
1b400 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20  b->aCol[j]) ){. 
1b410 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1b420 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54  ert(IsVirtual(pT
1b430 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ab));.          
1b440 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1b450 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1b460 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
1b470 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b   && zTName==0 ){
1b480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
1b490 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1b4a0 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61  em *pLeft = &pTa
1b4b0 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20  bList->a[i-1];. 
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1b4d0 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74   (pLeft[1].joint
1b4e0 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
1b4f0 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b510 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66  columnIndex(pLef
1b520 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e  t->pTab, zName)>
1b530 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1b540 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
1b550 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
1b560 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
1b570 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
1b580 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1b590 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
1b5a0 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
1b5b0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1b5e0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
1b5f0 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73  dex(pLeft[1].pUs
1b600 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  ing, zName)>=0 )
1b610 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b620 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
1b630 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
1b640 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
1b650 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
1b660 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67          ** using
1b670 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
1b680 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
1b690 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght. */.        
1b6a0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1b6b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b6c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
1b6e0 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
1b6f0 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d  (db, TK_ID, zNam
1b700 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1b710 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65  zColname = zName
1b720 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  ;.            zT
1b730 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  oFree = 0;.     
1b740 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
1b750 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74  ames || pTabList
1b760 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  ->nSrc>1 ){.    
1b770 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
1b780 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  pLeft;.         
1b790 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
1b7a0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
1b7b0 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20  ID, zTabName);. 
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1b7d0 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
1b7e0 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
1b7f0 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
1b800 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
1b810 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
1b820 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b830 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73      zColname = s
1b840 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1b850 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e  , "%s.%s", zTabN
1b860 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f               zTo
1b880 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b  Free = zColname;
1b890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1b8a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
1b8b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1b8c0 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74    pExpr = pRight
1b8d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
1b8f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1b900 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
1b910 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20   pNew, pExpr);. 
1b920 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e             sColn
1b930 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65  ame.z = zColname
1b940 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43  ;.            sC
1b950 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74  olname.n = sqlit
1b960 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e  e3Strlen30(zColn
1b970 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1b980 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
1b990 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
1b9a0 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65   pNew, &sColname
1b9b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1b9c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1b9d0 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20  db, zToFree);.  
1b9e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b9f0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1ba00 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20  !tableSeen ){.  
1ba10 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
1ba20 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
1ba30 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1ba40 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
1ba50 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a  ch table: %s", z
1ba60 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  TName);.        
1ba70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ba80 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1ba90 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
1baa0 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
1bab0 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  d");.          }
1bac0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bad0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1bae0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
1baf0 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a  te(db, pEList);.
1bb00 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20      p->pEList = 
1bb10 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51  pNew;.  }.#if SQ
1bb20 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
1bb30 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20    if( p->pEList 
1bb40 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  && p->pEList->nE
1bb50 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  xpr>db->aLimit[S
1bb60 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
1bb70 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
1bb80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1bb90 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
1bba0 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
1bbb0 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  et");.  }.#endif
1bbc0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
1bbd0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
1bbe0 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66   No-op routine f
1bbf0 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65  or the parse-tre
1bc00 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20  e walker..**.** 
1bc10 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
1bc20 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e  e is the Walker.
1bc30 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
1bc40 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  en expression tr
1bc50 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65  ees.** are walke
1bc60 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63  d without any ac
1bc70 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65  tions being take
1bc80 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20  n at each node. 
1bc90 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20   Presumably,.** 
1bca0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
1bcb0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61  e is used for Wa
1bcc0 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
1bcd0 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b  ck then .** Walk
1bce0 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
1bcf0 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20  ck is set to do 
1bd00 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c  something useful
1bd10 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73   for every .** s
1bd20 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70  ubquery in the p
1bd30 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73  arser tree..*/.s
1bd40 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 57 61  tatic int exprWa
1bd50 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e  lkNoop(Walker *N
1bd60 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f  otUsed, Expr *No
1bd70 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
1bd80 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
1bd90 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
1bda0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
1bdb0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
1bdc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65   This routine "e
1bdd0 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54  xpands" a SELECT
1bde0 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61   statement and a
1bdf0 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65  ll of its subque
1be00 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64  ries..** For add
1be10 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
1be20 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d  ion on what it m
1be30 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22  eans to "expand"
1be40 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61   a SELECT.** sta
1be50 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20  tement, see the 
1be60 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73  comment on the s
1be70 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b  electExpand work
1be80 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76  er callback abov
1be90 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69  e..**.** Expandi
1bea0 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ng a SELECT stat
1beb0 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ement is the fir
1bec0 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65  st step in proce
1bed0 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43  ssing a.** SELEC
1bee0 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  T statement.  Th
1bef0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1bf00 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e  nt must be expan
1bf10 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61  ded before.** na
1bf20 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73  me resolution is
1bf30 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a   performed..**.*
1bf40 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  * If anything go
1bf50 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72  es wrong, an err
1bf60 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
1bf70 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73  itten into pPars
1bf80 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  e..** The callin
1bf90 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64  g function can d
1bfa0 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65  etect the proble
1bfb0 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  m by looking at 
1bfc0 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20  pParse->nErr.** 
1bfd0 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64  and/or pParse->d
1bfe0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e  b->mallocFailed.
1bff0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c000 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
1c010 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  and(Parse *pPars
1c020 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
1c030 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ct){.  Walker w;
1c040 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
1c050 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70  back = selectExp
1c060 61 6e 64 65 72 3b 0a 20 20 77 2e 78 45 78 70 72  ander;.  w.xExpr
1c070 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57  Callback = exprW
1c080 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
1c090 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
1c0a0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
1c0b0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
1c0c0 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
1c0d0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1c0e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
1c0f0 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
1c100 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b  allback callback
1c110 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
1c120 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29  SelectTypeInfo()
1c130 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
1c140 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52  *.** For each FR
1c150 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
1c160 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a  ry, add Column.z
1c170 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e  Type and Column.
1c180 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  zColl.** informa
1c190 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c  tion to the Tabl
1c1a0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
1c1b0 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
1c1c0 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66  result set.** of
1c1d0 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a   that subquery..
1c1e0 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  **.** The Table 
1c1f0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
1c200 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
1c210 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e  sult set was con
1c220 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73  structed.** by s
1c230 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20  electExpander() 
1c240 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  but the type and
1c250 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
1c260 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74  mation was omitt
1c270 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f  ed.** at that po
1c280 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e  int because iden
1c290 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20  tifiers had not 
1c2a0 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  yet been resolve
1c2b0 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
1c2c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
1c2d0 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72  ter identifier r
1c2e0 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
1c2f0 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 41  atic int selectA
1c300 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
1c310 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
1c320 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
1c330 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1c340 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
1c350 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
1c360 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1c370 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
1c380 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
1c390 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
1c3a0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  d );.  assert( (
1c3b0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1c3c0 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
1c3d0 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
1c3e0 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
1c3f0 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
1c400 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
1c410 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
1c420 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
1c430 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
1c440 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
1c450 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
1c460 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
1c470 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
1c480 54 61 62 3b 0a 20 20 20 20 69 66 28 20 41 4c 57  Tab;.    if( ALW
1c490 41 59 53 28 70 54 61 62 21 3d 30 29 20 26 26 20  AYS(pTab!=0) && 
1c4a0 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
1c4b0 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
1c4c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
1c4d0 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
1c4e0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1c4f0 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
1c500 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
1c510 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
1c520 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c530 70 53 65 6c 20 29 3b 0a 20 20 20 20 20 20 77 68  pSel );.      wh
1c540 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
1c550 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d  r ) pSel = pSel-
1c560 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73  >pPrior;.      s
1c570 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
1c580 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
1c590 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f  Parse, pTab->nCo
1c5a0 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70  l, pTab->aCol, p
1c5b0 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sel);.    }.  }.
1c5c0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1c5d0 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  tinue;.}.#endif.
1c5e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1c5f0 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79  tine adds dataty
1c600 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  pe and collating
1c610 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d   sequence inform
1c620 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20  ation to.** the 
1c630 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73  Table structures
1c640 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   of all FROM-cla
1c650 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69  use subqueries i
1c660 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  n a.** SELECT st
1c670 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55  atement..**.** U
1c680 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
1c690 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
1c6a0 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
1c6b0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
1c6c0 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50  ectAddTypeInfo(P
1c6d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
1c6e0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
1c6f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c700 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57  MIT_SUBQUERY.  W
1c710 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65  alker w;.  w.xSe
1c720 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
1c730 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
1c740 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45  TypeInfo;.  w.xE
1c750 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
1c760 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
1c770 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
1c780 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
1c790 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
1c7a0 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
1c7b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c7c0 20 73 65 74 73 20 6f 66 20 61 20 53 45 4c 45 43   sets of a SELEC
1c7d0 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
1c7e0 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
1c7f0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
1c800 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a   accomplished:.*
1c810 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45  *.**     *  VDBE
1c820 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   Cursor numbers 
1c830 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  are assigned to 
1c840 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
1c850 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  terms..**     * 
1c860 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   Ephemeral Table
1c870 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
1c880 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f  ated for all FRO
1c890 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
1c8a0 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f  ies..**     *  O
1c8b0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
1c8c0 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20  ses are shifted 
1c8d0 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65  into WHERE state
1c8e0 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20  ments.**     *  
1c8f0 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e  Wildcards "*" an
1c900 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72  d "TABLE.*" in r
1c910 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65  esult sets are e
1c920 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20  xpanded..**     
1c930 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69  *  Identifiers i
1c940 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65  n expression are
1c950 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c   matched to tabl
1c960 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
1c970 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75  outine acts recu
1c980 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73  rsively on all s
1c990 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e  ubqueries within
1c9a0 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
1c9b0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1c9c0 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20  ctPrep(.  Parse 
1c9d0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1c9e0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
1c9f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1ca00 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1ca10 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
1ca20 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
1ca30 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
1ca40 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
1ca50 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74  NC  /* Name cont
1ca60 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65  ext for containe
1ca70 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  r */.){.  sqlite
1ca80 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56  3 *db;.  if( NEV
1ca90 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(p==0) ) retur
1caa0 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  n;.  db = pParse
1cab0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 73  ->db;.  if( p->s
1cac0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
1cad0 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72  TypeInfo ) retur
1cae0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
1caf0 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c  ctExpand(pParse,
1cb00 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   p);.  if( pPars
1cb10 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
1cb20 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
1cb30 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52  turn;.  sqlite3R
1cb40 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
1cb50 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  s(pParse, p, pOu
1cb60 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50  terNC);.  if( pP
1cb70 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
1cb80 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1cb90 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
1cba0 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49  e3SelectAddTypeI
1cbb0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  nfo(pParse, p);.
1cbc0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
1cbd0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
1cbe0 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  umulator..**.** 
1cbf0 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  The aggregate ac
1cc00 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73  cumulator is a s
1cc10 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  et of memory cel
1cc20 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20  ls that hold.** 
1cc30 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
1cc40 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75  ults while calcu
1cc50 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67  lating an aggreg
1cc60 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ate.  This.** ro
1cc70 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f  utine simply sto
1cc80 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c  res NULLs in all
1cc90 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79   of those memory
1cca0 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
1ccb0 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75  c void resetAccu
1ccc0 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
1ccd0 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
1cce0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
1ccf0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1cd00 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
1cd10 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1cd20 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69  func *pFunc;.  i
1cd30 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  f( pAggInfo->nFu
1cd40 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f  nc+pAggInfo->nCo
1cd50 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72  lumn==0 ){.    r
1cd60 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72  eturn;.  }.  for
1cd70 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
1cd80 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
1cd90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1cda0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1cdb0 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  l, 0, pAggInfo->
1cdc0 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20  aCol[i].iMem);. 
1cdd0 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70   }.  for(pFunc=p
1cde0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20  AggInfo->aFunc, 
1cdf0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
1ce00 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75  >nFunc; i++, pFu
1ce10 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  nc++){.    sqlit
1ce20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ce30 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75 6e  OP_Null, 0, pFun
1ce40 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66  c->iMem);.    if
1ce50 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  ( pFunc->iDistin
1ce60 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ct>=0 ){.      E
1ce70 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d  xpr *pE = pFunc-
1ce80 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
1ce90 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1cea0 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49  operty(pE, EP_xI
1ceb0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
1cec0 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73    if( pE->x.pLis
1ced0 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c  t==0 || pE->x.pL
1cee0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  ist->nExpr!=1 ){
1cef0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1cf00 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1cf10 20 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65   "DISTINCT aggre
1cf20 67 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20  gates must have 
1cf30 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20  exactly one ".  
1cf40 20 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65           "argume
1cf50 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46  nt");.        pF
1cf60 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  unc->iDistinct =
1cf70 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1cf80 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  {.        KeyInf
1cf90 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65  o *pKeyInfo = ke
1cfa0 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
1cfb0 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e  t(pParse, pE->x.
1cfc0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pList);.        
1cfd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cfe0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
1cff0 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44  meral, pFunc->iD
1d000 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  istinct, 0, 0,. 
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d020 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1d030 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
1d040 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
1d050 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
1d070 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c   the OP_AggFinal
1d080 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65  ize opcode for e
1d090 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66  very aggregate f
1d0a0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  unction.** in th
1d0b0 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
1d0c0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
1d0d0 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46  oid finalizeAggF
1d0e0 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a  unctions(Parse *
1d0f0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
1d100 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
1d110 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1d120 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
1d130 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1d140 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72  _func *pF;.  for
1d150 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
1d160 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
1d170 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
1d180 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70  , pF++){.    Exp
1d190 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
1d1a0 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
1d1b0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
1d1c0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1d1d0 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
1d1e0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
1d1f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d200 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c  4(v, OP_AggFinal
1d210 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73  , pF->iMem, pLis
1d220 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
1d230 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20   : 0, 0,.       
1d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1d250 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
1d260 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
1d270 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  }.}../*.** Updat
1d280 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  e the accumulato
1d290 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  r memory cells f
1d2a0 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  or an aggregate 
1d2b0 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  based on.** the 
1d2c0 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
1d2d0 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  osition..*/.stat
1d2e0 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63  ic void updateAc
1d2f0 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
1d300 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
1d310 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
1d320 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1d330 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
1d340 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
1d350 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74  o_func *pF;.  st
1d360 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
1d370 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66   *pC;..  pAggInf
1d380 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
1d390 31 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  1;.  sqlite3Expr
1d3a0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
1d3b0 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
1d3c0 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
1d3d0 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
1d3e0 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
1d3f0 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  {.    int nArg;.
1d400 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
1d410 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
1d420 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  gAgg;.    ExprLi
1d430 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
1d440 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
1d450 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1d460 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
1d470 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
1d480 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
1d490 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
1d4a0 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nArg = pList->nE
1d4b0 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67  xpr;.      regAg
1d4c0 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1d4d0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1d4e0 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  nArg);.      sql
1d4f0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
1d500 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
1d510 73 74 2c 20 72 65 67 41 67 67 2c 20 30 29 3b 0a  st, regAgg, 0);.
1d520 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d530 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20   nArg = 0;.     
1d540 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20   regAgg = 0;.   
1d550 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69   }.    if( pF->i
1d560 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
1d570 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20       addrNext = 
1d580 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1d590 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
1d5a0 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29  ssert( nArg==1 )
1d5b0 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  ;.      codeDist
1d5c0 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
1d5d0 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
1d5e0 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
1d5f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d600 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67 73  pF->pFunc->flags
1d610 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
1d620 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
1d630 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
1d640 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63  = 0;.      struc
1d650 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1d660 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e  *pItem;.      in
1d670 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
1d680 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20  t( pList!=0 );  
1d690 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70  /* pList!=0 if p
1d6a0 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45  F->pFunc has NEE
1d6b0 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66  DCOLL */.      f
1d6c0 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
1d6d0 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
1d6e0 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70  & j<nArg; j++, p
1d6f0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
1d700 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1d710 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1d720 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
1d730 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d740 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
1d750 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
1d760 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
1d770 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
1d780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d790 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
1d7a0 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  Seq, 0, 0, 0, (c
1d7b0 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
1d7c0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a  COLLSEQ);.    }.
1d7d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d7e0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53  ddOp4(v, OP_AggS
1d7f0 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20  tep, 0, regAgg, 
1d800 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20  pF->iMem,.      
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d820 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
1d830 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
1d840 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1d850 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41  angeP5(v, (u8)nA
1d860 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
1d870 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1d880 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
1d890 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
1d8a0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1d8b0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1d8c0 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
1d8d0 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65  ;.    if( addrNe
1d8e0 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  xt ){.      sqli
1d8f0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1d900 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29  bel(v, addrNext)
1d910 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1d920 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
1d930 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  arse);.    }.  }
1d940 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70  .  for(i=0, pC=p
1d950 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69  AggInfo->aCol; i
1d960 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75  <pAggInfo->nAccu
1d970 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43  mulator; i++, pC
1d980 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1d990 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1d9a0 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e   pC->pExpr, pC->
1d9b0 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67  iMem);.  }.  pAg
1d9c0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
1d9d0 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
1d9e0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
1d9f0 50 61 72 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Parse);.}../*.**
1da00 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1da10 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  or the SELECT st
1da20 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e  atement given in
1da30 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e   the p argument.
1da40 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73    .**.** The res
1da50 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62  ults are distrib
1da60 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20  uted in various 
1da70 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  ways depending o
1da80 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  n the.** content
1da90 73 20 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44  s of the SelectD
1daa0 65 73 74 20 73 74 72 75 63 74 75 72 65 20 70 6f  est structure po
1dab0 69 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67 75  inted to by argu
1dac0 6d 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73  ment pDest.** as
1dad0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
1dae0 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
1daf0 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20      Result.**   
1db00 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20    ------------  
1db10 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
1db20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1db30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
1db40 20 20 20 20 20 53 52 54 5f 4f 75 74 70 75 74 20       SRT_Output 
1db50 20 20 20 20 20 47 65 6e 65 72 61 74 65 20 61 20       Generate a 
1db60 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 28 75  row of output (u
1db70 73 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 73 75  sing the OP_Resu
1db80 6c 74 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  ltRow.**        
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 63               opc
1dba0 6f 64 65 29 20 66 6f 72 20 65 61 63 68 20 72 6f  ode) for each ro
1dbb0 77 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  w in the result 
1dbc0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  set..**.**     S
1dbd0 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 4f  RT_Mem         O
1dbe0 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 74 68 65  nly valid if the
1dbf0 20 72 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e   result is a sin
1dc00 67 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20  gle column..**  
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc20 20 20 20 53 74 6f 72 65 20 74 68 65 20 66 69 72     Store the fir
1dc30 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
1dc40 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f   first result ro
1dc50 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
1dc60 20 20 20 20 20 20 20 20 20 69 6e 20 72 65 67 69           in regi
1dc70 73 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61 72  ster pDest->iPar
1dc80 6d 20 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74  m then abandon t
1dc90 68 65 20 72 65 73 74 0a 2a 2a 20 20 20 20 20 20  he rest.**      
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1dcb0 66 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68  f the query.  Th
1dcc0 69 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  is destination i
1dcd0 6d 70 6c 69 65 73 20 22 4c 49 4d 49 54 20 31 22  mplies "LIMIT 1"
1dce0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1dcf0 53 65 74 20 20 20 20 20 20 20 20 20 54 68 65 20  Set         The 
1dd00 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 61  result must be a
1dd10 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20   single column. 
1dd20 20 53 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20   Store each.**  
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd40 20 20 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74     row of result
1dd50 20 61 73 20 74 68 65 20 6b 65 79 20 69 6e 20 74   as the key in t
1dd60 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72  able pDest->iPar
1dd70 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  m. .**          
1dd80 20 20 20 20 20 20 20 20 20 20 20 41 70 70 6c 79             Apply
1dd90 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 70 44   the affinity pD
1dda0 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 62 65  est->affinity be
1ddb0 66 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a 2a 20  fore storing.** 
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddd0 20 20 20 20 72 65 73 75 6c 74 73 2e 20 20 55 73      results.  Us
1dde0 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
1ddf0 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  "IN (SELECT ...)
1de00 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  "..**.**     SRT
1de10 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f  _Union       Sto
1de20 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20  re results as a 
1de30 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  key in a tempora
1de40 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
1de50 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
1de60 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20   SRT_Except     
1de70 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20   Remove results 
1de80 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61  from the tempora
1de90 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
1dea0 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
1deb0 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20   SRT_Table      
1dec0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
1ded0 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
1dee0 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  e pDest->iParm..
1def0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1df00 20 20 20 20 20 20 20 54 68 69 73 20 69 73 20 6c         This is l
1df10 69 6b 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ike SRT_EphemTab
1df20 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
1df30 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
1df50 20 61 73 73 75 6d 65 64 20 74 6f 20 61 6c 72 65   assumed to alre
1df60 61 64 79 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a  ady be open..**.
1df70 2a 2a 20 20 20 20 20 53 52 54 5f 45 70 68 65 6d  **     SRT_Ephem
1df80 54 61 62 20 20 20 20 43 72 65 61 74 65 20 61 6e  Tab    Create an
1df90 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1dfa0 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 61 6e   pDest->iParm an
1dfb0 64 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20  d store.**      
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1dfd0 68 65 20 72 65 73 75 6c 74 20 74 68 65 72 65 2e  he result there.
1dfe0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
1dff0 65 66 74 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a  eft open after.*
1e000 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e010 20 20 20 20 20 20 72 65 74 75 72 6e 69 6e 67 2e        returning.
1e020 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53    This is like S
1e030 52 54 5f 54 61 62 6c 65 20 65 78 63 65 70 74 20  RT_Table except 
1e040 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1e050 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
1e060 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 75 73 65   destination use
1e070 73 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  s OP_OpenEphemer
1e080 61 6c 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20  al to create.** 
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0a0 20 20 20 20 74 68 65 20 74 61 62 6c 65 20 66 69      the table fi
1e0b0 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  rst..**.**     S
1e0c0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 47  RT_Coroutine   G
1e0d0 65 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75  enerate a co-rou
1e0e0 74 69 6e 65 20 74 68 61 74 20 72 65 74 75 72 6e  tine that return
1e0f0 73 20 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a  s a new row of.*
1e100 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e110 20 20 20 20 20 20 72 65 73 75 6c 74 73 20 65 61        results ea
1e120 63 68 20 74 69 6d 65 20 69 74 20 69 73 20 69 6e  ch time it is in
1e130 76 6f 6b 65 64 2e 20 20 54 68 65 20 65 6e 74 72  voked.  The entr
1e140 79 20 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20  y point.**      
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1e160 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  f the co-routine
1e170 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
1e180 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69 50  gister pDest->iP
1e190 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
1e1a0 52 54 5f 45 78 69 73 74 73 20 20 20 20 20 20 53  RT_Exists      S
1e1b0 74 6f 72 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f  tore a 1 in memo
1e1c0 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69  ry cell pDest->i
1e1d0 50 61 72 6d 20 69 66 20 74 68 65 20 72 65 73 75  Parm if the resu
1e1e0 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
1e1f0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69 73            set is
1e200 20 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a   not empty..**.*
1e210 2a 20 20 20 20 20 53 52 54 5f 44 69 73 63 61 72  *     SRT_Discar
1e220 64 20 20 20 20 20 54 68 72 6f 77 20 74 68 65 20  d     Throw the 
1e230 72 65 73 75 6c 74 73 20 61 77 61 79 2e 20 20 54  results away.  T
1e240 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 53  his is used by S
1e250 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
1e260 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61               sta
1e270 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74  tements within t
1e280 72 69 67 67 65 72 73 20 77 68 6f 73 65 20 6f 6e  riggers whose on
1e290 6c 79 20 70 75 72 70 6f 73 65 20 69 73 0a 2a 2a  ly purpose is.**
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2b0 20 20 20 20 20 74 68 65 20 73 69 64 65 2d 65 66       the side-ef
1e2c0 66 65 63 74 73 20 6f 66 20 66 75 6e 63 74 69 6f  fects of functio
1e2d0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
1e2e0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
1e2f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
1e300 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
1e310 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
1e320 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
1e330 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
1e340 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
1e350 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
1e360 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
1e370 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
1e380 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
1e390 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
1e3a0 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
1e3b0 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
1e3c0 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
1e3d0 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  hat..*/.int sqli
1e3e0 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72  te3Select(.  Par
1e3f0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1e400 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
1e410 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
1e420 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1e430 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
1e440 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
1e450 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
1e460 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
1e470 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  t      /* What t
1e480 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75  o do with the qu
1e490 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
1e4a0 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
1e4b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1e4c0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
1e4d0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1e4e0 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
1e4f0 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
1e500 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
1e510 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
1e520 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
1e530 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
1e540 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1e550 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
1e560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e570 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
1e580 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
1e590 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
1e5a0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
1e5b0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
1e5c0 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
1e5d0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1e5e0 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
1e5f0 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
1e600 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
1e610 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
1e620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e630 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
1e640 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1e650 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
1e660 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy;    /* The O
1e670 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
1e680 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
1e690 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
1e6a0 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
1e6b0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
1e6c0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
1e6d0 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
1e6e0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
1e6f0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
1e700 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
1e710 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
1e720 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
1e730 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
1e740 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
1e750 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ent */.  int dis
1e760 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
1e770 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20  /* Table to use 
1e780 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
1e790 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63   set */.  int rc
1e7a0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1e7b0 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
1e7c0 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
1e7d0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
1e7e0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
1e7f0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1e800 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   an OP_OpenEphem
1e810 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
1e820 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41   */.  AggInfo sA
1e830 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20  ggInfo;      /* 
1e840 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
1e850 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75   by aggregate qu
1e860 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  eries */.  int i
1e870 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
1e880 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1e890 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71  the end of the q
1e8a0 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
1e8b0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
1e8c0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1e8d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
1e8e0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1e8f0 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  b;.  if( p==0 ||
1e900 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1e910 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
1e920 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
1e930 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
1e940 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1e950 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
1e960 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
1e970 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73  return 1;.  mems
1e980 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c  et(&sAggInfo, 0,
1e990 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f   sizeof(sAggInfo
1e9a0 29 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72  ));..  if( Ignor
1e9b0 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
1e9c0 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  t) ){.    assert
1e9d0 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53  (pDest->eDest==S
1e9e0 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65  RT_Exists || pDe
1e9f0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55  st->eDest==SRT_U
1ea00 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20  nion || .       
1ea10 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
1ea20 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20  ==SRT_Except || 
1ea30 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1ea40 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20  T_Discard);.    
1ea50 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d  /* If ORDER BY m
1ea60 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  akes no differen
1ea70 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ce in the output
1ea80 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f   then neither do
1ea90 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e  es.    ** DISTIN
1eaa0 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20  CT so it can be 
1eab0 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a  removed too. */.
1eac0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
1ead0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
1eae0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
1eaf0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
1eb00 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
1eb10 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
1eb20 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
1eb30 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
1eb40 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65  , p, 0);.  pOrde
1eb50 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
1eb60 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  y;.  pTabList = 
1eb70 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
1eb80 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
1eb90 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1eba0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1ebb0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
1ebc0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1ebd0 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e  }.  isAgg = (p->
1ebe0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
1ebf0 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61  gregate)!=0;.  a
1ec00 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
1ec10 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
1ec20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
1ec30 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
1ec40 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1ec50 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
1ec60 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1ec70 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1ec80 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
1ec90 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
1eca0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
1ecb0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
1ecc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1ecd0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1ece0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1ecf0 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
1ed00 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
1ed10 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1ed20 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
1ed30 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1ed40 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
1ed50 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
1ed60 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
1ed70 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
1ed80 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
1ed90 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a    int isAggSub;.
1eda0 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
1edb0 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70   || pItem->isPop
1edc0 75 6c 61 74 65 64 20 29 20 63 6f 6e 74 69 6e 75  ulated ) continu
1edd0 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65  e;..    /* Incre
1ede0 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
1edf0 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
1ee00 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
1ee10 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
1ee20 2a 20 74 72 65 65 20 72 65 66 65 72 65 64 20 74  * tree refered t
1ee30 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70  o by this, the p
1ee40 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68  arent select. Th
1ee50 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20  e child select. 
1ee60 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69     ** may contai
1ee70 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
1ee80 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20  es of at most.  
1ee90 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58    ** (SQLITE_MAX
1eea0 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73  _EXPR_DEPTH-Pars
1eeb0 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68  e.nHeight) heigh
1eec0 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74  t. This is a bit
1eed0 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e  .    ** more con
1eee0 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e  servative than n
1eef0 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75  ecessary, but mu
1ef00 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65  ch easier than e
1ef10 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20  nforcing.    ** 
1ef20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a  an exact limit..
1ef30 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73      */.    pPars
1ef40 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71  e->nHeight += sq
1ef50 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
1ef60 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f  eight(p);..    /
1ef70 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1ef80 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63  f the subquery c
1ef90 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69  an be absorbed i
1efa0 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20  nto the parent. 
1efb0 2a 2f 0a 20 20 20 20 69 73 41 67 67 53 75 62 20  */.    isAggSub 
1efc0 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  = (pSub->selFlag
1efd0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
1efe0 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c  )!=0;.    if( fl
1eff0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
1f000 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
1f010 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a  g, isAggSub) ){.
1f020 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53        if( isAggS
1f030 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ub ){.        is
1f040 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Agg = 1;.       
1f050 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
1f060 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
1f070 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20      }.      i = 
1f080 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
1f090 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
1f0a0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
1f0b0 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20  , SRT_EphemTab, 
1f0c0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
1f0d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f0e0 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
1f0f0 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  d==0 );.      sq
1f100 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
1f110 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
1f120 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69  ;.      pItem->i
1f130 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a  sPopulated = 1;.
1f140 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a      }.    if( /*
1f150 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a  pParse->nErr ||*
1f160 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  / db->mallocFail
1f170 65 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  ed ){.      goto
1f180 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
1f190 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e   }.    pParse->n
1f1a0 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65  Height -= sqlite
1f1b0 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
1f1c0 74 28 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69  t(p);.    pTabLi
1f1d0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
1f1e0 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65    if( !Ignorable
1f1f0 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
1f200 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  {.      pOrderBy
1f210 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
1f220 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69      }.  }.  pELi
1f230 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
1f240 23 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20  #endif.  pWhere 
1f250 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
1f260 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
1f270 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67  oupBy;.  pHaving
1f280 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
1f290 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 28 70   isDistinct = (p
1f2a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1f2b0 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23  Distinct)!=0;..#
1f2c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f2d0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
1f2e0 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  CT.  /* If there
1f2f0 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e   is are a sequen
1f300 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64  ce of queries, d
1f310 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e  o the earlier on
1f320 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20  es first..  */. 
1f330 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
1f340 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69  {.    if( p->pRi
1f350 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20  ghtmost==0 ){.  
1f360 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
1f370 70 2c 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a  p, *pRight = 0;.
1f380 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20        int cnt = 
1f390 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53  0;.      int mxS
1f3a0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 66 6f 72  elect;.      for
1f3b0 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b  (pLoop=p; pLoop;
1f3c0 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
1f3d0 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20  rior, cnt++){.  
1f3e0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69        pLoop->pRi
1f3f0 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20  ghtmost = p;.   
1f400 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78       pLoop->pNex
1f410 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
1f420 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f      pRight = pLo
1f430 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  op;.      }.    
1f440 20 20 6d 78 53 65 6c 65 63 74 20 3d 20 64 62 2d    mxSelect = db-
1f450 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
1f460 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
1f470 4c 45 43 54 5d 3b 0a 20 20 20 20 20 20 69 66 28  LECT];.      if(
1f480 20 6d 78 53 65 6c 65 63 74 20 26 26 20 63 6e 74   mxSelect && cnt
1f490 3e 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  >mxSelect ){.   
1f4a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1f4b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
1f4c0 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20  o many terms in 
1f4d0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22  compound SELECT"
1f4e0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1f4f0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
1f500 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75   }.    return mu
1f510 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
1f520 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  , p, pDest);.  }
1f530 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1f540 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f   writing to memo
1f550 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  ry or generating
1f560 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79   a set.  ** only
1f570 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
1f580 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a   may be output..
1f590 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1f5a0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1f5b0 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72  Y.  if( checkFor
1f5c0 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
1f5d0 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
1f5e0 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Dest, pEList->nE
1f5f0 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  xpr) ){.    goto
1f600 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
1f610 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1f620 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 77 72 69   possible, rewri
1f630 74 65 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  te the query to 
1f640 75 73 65 20 47 52 4f 55 50 20 42 59 20 69 6e 73  use GROUP BY ins
1f650 74 65 61 64 20 6f 66 20 44 49 53 54 49 4e 43 54  tead of DISTINCT
1f660 2e 0a 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20  ..  ** GROUP BY 
1f670 6d 69 67 68 74 20 75 73 65 20 61 6e 20 69 6e 64  might use an ind
1f680 65 78 2c 20 44 49 53 54 49 4e 43 54 20 6e 65 76  ex, DISTINCT nev
1f690 65 72 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20  er does..  */.  
1f6a0 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
1f6b0 70 42 79 3d 3d 30 20 7c 7c 20 28 70 2d 3e 73 65  pBy==0 || (p->se
1f6c0 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
1f6d0 65 67 61 74 65 29 21 3d 30 20 29 3b 0a 20 20 69  egate)!=0 );.  i
1f6e0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1f6f0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1f700 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
1f710 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  F_Distinct ){.  
1f720 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20    p->pGroupBy = 
1f730 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1f740 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
1f750 2c 20 30 29 3b 0a 20 20 20 20 70 47 72 6f 75 70  , 0);.    pGroup
1f760 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
1f770 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
1f780 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
1f790 74 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  t;.    isDistinc
1f7a0 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t = 0;.  }..  /*
1f7b0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
1f7c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
1f7d0 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69   then this sorti
1f7e0 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69  ng.  ** index mi
1f7f0 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
1f800 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64   unused if the d
1f810 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a  ata can be .  **
1f820 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72   extracted in pr
1f830 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20  e-sorted order. 
1f840 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
1f850 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  case, then the. 
1f860 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   ** OP_OpenEphem
1f870 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
1f880 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
1f890 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f   to an OP_Noop o
1f8a0 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75  nce.  ** we figu
1f8b0 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  re out that the 
1f8c0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73  sorting index is
1f8d0 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68   not needed.  Th
1f8e0 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a  e addrSortIndex.
1f8f0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
1f900 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
1f910 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e  ate that change.
1f920 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
1f930 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
1f940 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
1f950 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
1f960 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
1f970 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
1f980 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42  By);.    pOrderB
1f990 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  y->iECursor = pP
1f9a0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
1f9b0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
1f9c0 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49  m[2] = addrSortI
1f9d0 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c  ndex =.      sql
1f9e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1f9f0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
1fa00 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1fa20 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
1fa30 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  r, pOrderBy->nEx
1fa40 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20  pr+2, 0,.       
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa60 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
1fa70 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
1fa80 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73  HANDOFF);.  }els
1fa90 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49  e{.    addrSortI
1faa0 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  ndex = -1;.  }..
1fab0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
1fac0 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
1fad0 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
1fae0 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
1faf0 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
1fb00 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
1fb10 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
1fb20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1fb30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
1fb40 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74  Ephemeral, pDest
1fb50 2d 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  ->iParm, pEList-
1fb60 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
1fb70 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
1fb80 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
1fb90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1fba0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d  eLabel(v);.  com
1fbb0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
1fbc0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45  rs(pParse, p, iE
1fbd0 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  nd);..  /* Open 
1fbe0 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
1fbf0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
1fc00 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
1fc10 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e  /.  if( isDistin
1fc20 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  ct ){.    KeyInf
1fc30 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
1fc40 20 61 73 73 65 72 74 28 20 69 73 41 67 67 20 7c   assert( isAgg |
1fc50 7c 20 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20  | pGroupBy );.  
1fc60 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61    distinct = pPa
1fc70 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
1fc80 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
1fc90 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
1fca0 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
1fcb0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
1fcc0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1fcd0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
1fce0 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  istinct, 0, 0,. 
1fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd00 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1fd10 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
1fd20 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d  FO_HANDOFF);.  }
1fd30 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e  else{.    distin
1fd40 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ct = -1;.  }..  
1fd50 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e 64  /* Aggregate and
1fd60 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71   non-aggregate q
1fd70 75 65 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c  ueries are handl
1fd80 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a  ed differently *
1fd90 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26  /.  if( !isAgg &
1fda0 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  & pGroupBy==0 ){
1fdb0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
1fdc0 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67  e is for non-agg
1fdd0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 0a 20  regate queries. 
1fde0 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65 20     ** Begin the 
1fdf0 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20  database scan.  
1fe00 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20    */.    pWInfo 
1fe10 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
1fe20 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
1fe30 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
1fe40 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20  OrderBy, 0);.   
1fe50 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
1fe60 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1fe70 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  ;..    /* If sor
1fe80 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
1fe90 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
1fea0 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
1feb0 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
1fec0 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
1fed0 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
1fee0 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
1fef0 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
1ff00 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
1ff10 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
1ff20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61      */.    if( a
1ff30 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
1ff40 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  && pOrderBy==0 )
1ff50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1ff60 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
1ff70 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  v, addrSortIndex
1ff80 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  , 1);.      p->a
1ff90 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
1ffa0 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
1ffb0 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
1ffc0 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20  ard inner loop. 
1ffd0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1ffe0 28 21 69 73 44 69 73 74 69 6e 63 74 29 3b 0a 20  (!isDistinct);. 
1fff0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
20000 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
20010 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
20020 65 72 42 79 2c 20 2d 31 2c 20 70 44 65 73 74 2c  erBy, -1, pDest,
20030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20040 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f       pWInfo->iCo
20050 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e  ntinue, pWInfo->
20060 69 42 72 65 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a  iBreak);..    /*
20070 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   End the databas
20080 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
20090 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57   */.    sqlite3W
200a0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
200b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
200c0 20 54 68 69 73 20 69 73 20 74 68 65 20 70 72 6f   This is the pro
200d0 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
200e0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f  egate queries */
200f0 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
20100 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65   sNC;    /* Name
20110 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f   context for pro
20120 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74  cessing aggregat
20130 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
20140 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20  .    int iAMem; 
20150 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
20160 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
20170 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e  r storing curren
20180 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  t GROUP BY */.  
20190 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20    int iBMem;    
201a0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
201b0 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70  em address for p
201c0 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59  revious GROUP BY
201d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65   */.    int iUse
201e0 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Flag;       /* M
201f0 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69  em address holdi
20200 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69  ng flag indicati
20210 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  ng that at least
20220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20230 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20           ** one 
20240 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74  row of the input
20250 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
20260 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  or has been.    
20270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20280 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
20290 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f   */.    int iAbo
202a0 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d  rtFlag;     /* M
202b0 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68  em address which
202c0 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62   causes query ab
202d0 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20  ort if positive 
202e0 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70  */.    int group
202f0 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f  BySort;    /* Ro
20300 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75  ws come from sou
20310 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20  rce in GROUP BY 
20320 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  order */.    int
20330 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20   addrEnd;       
20340 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65   /* End of proce
20350 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53  ssing for this S
20360 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ELECT */..    /*
20370 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20   Remove any and 
20380 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77  all aliases betw
20390 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73  een the result s
203a0 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  et and the.    *
203b0 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  * GROUP BY claus
203c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
203d0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
203e0 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20      int k;      
203f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20400 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20410 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  r */.      struc
20420 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
20430 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20  *pItem;  /* For 
20440 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70  looping over exp
20450 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73  ression in a lis
20460 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  t */..      for(
20470 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  k=p->pEList->nEx
20480 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c  pr, pItem=p->pEL
20490 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  ist->a; k>0; k--
204a0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
204b0 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61      pItem->iAlia
204c0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
204d0 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75       for(k=pGrou
204e0 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  pBy->nExpr, pIte
204f0 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b  m=pGroupBy->a; k
20500 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
20510 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
20520 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->iAlias = 0;.  
20530 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 0a 20      }.    }.. . 
20540 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c     /* Create a l
20550 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
20560 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
20570 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20  abort the query 
20580 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d  */.    addrEnd =
20590 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
205a0 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
205b0 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c  * Convert TK_COL
205c0 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54  UMN nodes into T
205d0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64  K_AGG_COLUMN and
205e0 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e   make entries in
205f0 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f  .    ** sAggInfo
20600 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f   for all TK_AGG_
20610 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
20620 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  n expressions of
20630 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
20640 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
20650 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
20660 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
20670 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
20680 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
20690 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
206a0 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20   = pTabList;.   
206b0 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20   sNC.pAggInfo = 
206c0 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73  &sAggInfo;.    s
206d0 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
206e0 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42  Column = pGroupB
206f0 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y ? pGroupBy->nE
20700 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73  xpr+1 : 0;.    s
20710 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79  AggInfo.pGroupBy
20720 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
20730 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
20740 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
20750 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71   pEList);.    sq
20760 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
20770 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f  AggList(&sNC, pO
20780 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
20790 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
207a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
207b0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
207c0 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20  sNC, pHaving);. 
207d0 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
207e0 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d  o.nAccumulator =
207f0 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
20800 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  n;.    for(i=0; 
20810 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
20820 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
20830 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
20840 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e  operty(sAggInfo.
20850 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20  aFunc[i].pExpr, 
20860 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
20870 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
20880 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
20890 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e  (&sNC, sAggInfo.
208a0 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e  aFunc[i].pExpr->
208b0 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  x.pList);.    }.
208c0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
208d0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
208e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20  select_end;..   
208f0 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66   /* Processing f
20900 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69  or aggregates wi
20910 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76  th GROUP BY is v
20920 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e  ery different an
20930 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f  d.    ** much mo
20940 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20  re complex than 
20950 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f  aggregates witho
20960 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20  ut a GROUP BY.. 
20970 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
20980 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
20990 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
209a0 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e  o;  /* Keying in
209b0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
209c0 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73  e group by claus
209d0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  e */.      int j
209e0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
209f0 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69  * A-vs-B compari
20a00 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20  sion jump */.   
20a10 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75     int addrOutpu
20a20 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20  tRow;  /* Start 
20a30 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  of subroutine th
20a40 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73  at outputs a res
20a50 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ult row */.     
20a60 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f   int regOutputRo
20a70 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  w;   /* Return a
20a80 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
20a90 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f  for output subro
20aa0 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69  utine */.      i
20ab0 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b  nt addrSetAbort;
20ac0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62     /* Set the ab
20ad0 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74  ort flag and ret
20ae0 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  urn */.      int
20af0 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20   addrTopOfLoop; 
20b00 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
20b10 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
20b20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69     int addrSorti
20b30 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50  ngIdx; /* The OP
20b40 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66  _OpenEphemeral f
20b50 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  or the sorting i
20b60 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
20b70 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
20b80 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
20b90 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68  for resetting th
20ba0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f  e accumulator */
20bb0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
20bc0 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  set;       /* Re
20bd0 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
20be0 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20  ister for reset 
20bf0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  subroutine */.. 
20c00 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
20c10 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63   is a GROUP BY c
20c20 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  lause we might n
20c30 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  eed a sorting in
20c40 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  dex to.      ** 
20c50 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41  implement it.  A
20c60 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72  llocate that sor
20c70 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20  ting index now. 
20c80 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74   If it turns out
20c90 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
20ca0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74  e do not need it
20cb0 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20   after all, the 
20cc0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
20cd0 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20  struction.      
20ce0 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  ** will be conve
20cf0 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70  rted into a Noop
20d00 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  .  .      */.   
20d10 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
20d20 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d  ingIdx = pParse-
20d30 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
20d40 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
20d50 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
20d60 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b  arse, pGroupBy);
20d70 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
20d80 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56  ngIdx = sqlite3V
20d90 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
20da0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a  OpenEphemeral, .
20db0 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
20dc0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
20dd0 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
20de0 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20  Column, .       
20df0 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65     0, (char*)pKe
20e00 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
20e10 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20  O_HANDOFF);..   
20e20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
20e30 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
20e40 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
20e50 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
20e60 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
20e70 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
20e80 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
20e90 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
20ea0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
20eb0 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75  Mem;.      regOu
20ec0 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72  tputRow = ++pPar
20ed0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
20ee0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
20ef0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
20f00 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72  abel(v);.      r
20f10 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72  egReset = ++pPar
20f20 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
20f30 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
20f40 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
20f50 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  (v);.      iAMem
20f60 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
20f70 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
20f80 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
20f90 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
20fa0 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
20fb0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
20fc0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
20fd0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
20fe0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
20ff0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21000 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62  _Integer, 0, iAb
21010 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
21020 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
21030 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61  "clear abort fla
21040 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
21050 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21060 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
21070 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
21080 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
21090 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d   "indicate accum
210a0 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
210b0 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
210c0 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
210d0 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
210e0 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
210f0 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
21100 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
21110 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
21120 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
21130 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
21140 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
21150 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
21160 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
21170 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
21180 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
21190 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
211a0 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
211b0 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
211c0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
211d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
211e0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
211f0 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
21200 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49  eset);.      pWI
21210 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
21220 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
21230 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
21240 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30 29 3b  , &pGroupBy, 0);
21250 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
21260 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
21270 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
21280 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
21290 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
212a0 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c  optimizer is abl
212b0 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77  e to deliver row
212c0 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72  s in group by or
212d0 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a  der so.        *
212e0 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  * we do not have
212f0 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f   to sort.  The O
21300 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
21310 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20  table will be.  
21320 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c        ** cancell
21330 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65  ed later because
21340 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
21350 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e  o use the pKeyIn
21360 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  fo.        */.  
21370 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d        pGroupBy =
21380 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
21390 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
213a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 0;.      }el
213b0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52  se{.        /* R
213c0 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f  ows are coming o
213d0 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e  ut in undetermin
213e0 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61  ed order.  We ha
213f0 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20  ve to push.     
21400 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69     ** each row i
21410 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  nto a sorting in
21420 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74  dex, terminate t
21430 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20  he first loop,. 
21440 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c         ** then l
21450 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72  oop over the sor
21460 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72  ting index in or
21470 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f  der to get the o
21480 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a  utput.        **
21490 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
214a0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
214b0 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
214c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
214d0 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20  Record;.        
214e0 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  int nCol;.      
214f0 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a    int nGroupBy;.
21500 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
21510 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sort = 1;.      
21520 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72    nGroupBy = pGr
21530 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
21540 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72        nCol = nGr
21550 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20  oupBy + 1;.     
21560 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b     j = nGroupBy+
21570 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
21580 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
21590 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
215a0 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67          if( sAgg
215b0 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f  Info.aCol[i].iSo
215c0 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
215d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
215e0 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l++;.           
215f0 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
21600 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21610 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71      regBase = sq
21620 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
21630 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b  e(pParse, nCol);
21640 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21650 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
21660 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
21670 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
21680 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
21690 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73  pGroupBy, regBas
216a0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
216b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
216c0 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
216d0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
216e0 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72  gIdx,regBase+nGr
216f0 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20  oupBy);.        
21700 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a  j = nGroupBy+1;.
21710 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
21720 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
21730 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
21740 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
21750 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
21760 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
21770 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
21780 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
21790 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
217a0 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
217b0 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
217c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b           int r2;
217d0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32  ..            r2
217e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
217f0 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
21800 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21820 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
21830 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
21840 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c  Col->iTable, r1,
21850 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
21860 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20   if( r1!=r2 ){. 
21870 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
21880 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21890 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20  , OP_SCopy, r2, 
218a0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
218b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a   }.            j
218c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
218d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
218e0 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
218f0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
21900 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
21910 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21920 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
21930 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  ord, regBase, nC
21940 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
21950 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
21960 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21970 49 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49  IdxInsert, sAggI
21980 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
21990 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
219a0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
219b0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
219c0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
219d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
219e0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
219f0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
21a00 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
21a10 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
21a20 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
21a30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21a40 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67  (v, OP_Sort, sAg
21a50 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
21a60 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
21a70 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
21a80 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f  (v, "GROUP BY so
21a90 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73  rt"));.        s
21aa0 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69  AggInfo.useSorti
21ab0 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20  ngIdx = 1;.     
21ac0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
21ad0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
21ae0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
21af0 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
21b00 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
21b10 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72  Y terms and stor
21b20 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e  e in b0, b1, b2.
21b30 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20  ...      ** (b0 
21b40 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  is memory locati
21b50 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69  on iBMem+0, b1 i
21b60 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73  s iBMem+1, and s
21b70 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a  o forth).      *
21b80 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74  * Then compare t
21b90 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
21ba0 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73   BY terms agains
21bb0 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
21bc0 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  erms.      ** fr
21bd0 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  om the previous 
21be0 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74  row currently st
21bf0 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20  ored in a0, a1, 
21c00 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  a2....      */. 
21c10 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f       addrTopOfLo
21c20 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
21c30 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
21c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21c50 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
21c60 73 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  se);.      for(j
21c70 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
21c80 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
21c90 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
21ca0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
21cb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21cc0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
21cd0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
21ce0 6e 67 49 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b  ngIdx, j, iBMem+
21cf0 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  j);.        }els
21d00 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  e{.          sAg
21d10 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65  gInfo.directMode
21d20 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
21d30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
21d40 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
21d50 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42  ->a[j].pExpr, iB
21d60 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
21d70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
21d80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21d90 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
21da0 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70   iAMem, iBMem, p
21db0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a  GroupBy->nExpr,.
21dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21dd0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
21de0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
21df0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31  YINFO);.      j1
21e00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
21e10 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
21e20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21e30 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
21e40 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29  , j1+1, 0, j1+1)
21e50 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
21e60 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
21e70 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
21e80 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
21e90 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
21ea0 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50  ges in the GROUP
21eb0 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64   BY are detected
21ec0 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
21ed0 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62   code.      ** b
21ee0 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20  lock.  If there 
21ef0 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c  were no changes,
21f00 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73   this block is s
21f10 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  kipped..      **
21f20 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63  .      ** This c
21f30 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65  ode copies curre
21f40 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d  nt group by term
21f50 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e  s in b0,b1,b2,..
21f60 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  ..      ** over 
21f70 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74  to a0,a1,a2.  It
21f80 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20   then calls the 
21f90 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
21fa0 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  e.      ** and r
21fb0 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67  esets the aggreg
21fc0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
21fd0 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65  registers in pre
21fe0 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  paration.      *
21ff0 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47  * for the next G
22000 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20  ROUP BY batch.. 
22010 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
22020 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
22030 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c  e(pParse, iBMem,
22040 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iAMem, pGroupBy
22050 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
22060 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22070 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
22080 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
22090 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
220a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
220b0 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72  v, "output one r
220c0 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
220d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
220e0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f  , OP_IfPos, iAbo
220f0 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29  rtFlag, addrEnd)
22100 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
22110 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61  ent((v, "check a
22120 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
22130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22140 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
22150 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
22160 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56  rReset);.      V
22170 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
22180 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f  reset accumulato
22190 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
221a0 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65  Update the aggre
221b0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
221c0 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
221d0 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20  ontent of.      
221e0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ** the current r
221f0 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow.      */.    
22200 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
22210 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
22220 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
22230 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
22240 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
22250 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22260 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
22270 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   1, iUseFlag);. 
22280 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
22290 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64  ((v, "indicate d
222a0 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
222b0 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
222c0 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
222d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
222e0 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
222f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22300 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22310 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  OP_Next, sAggInf
22320 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
22330 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
22340 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22350 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
22360 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
22370 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
22380 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
22390 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31  ddrSortingIdx, 1
223a0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
223b0 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
223c0 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
223d0 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
223e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
223f0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
22400 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
22410 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
22420 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
22430 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69  t((v, "output fi
22440 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20  nal row"));..   
22450 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20     /* Jump over 
22460 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a  the subroutines.
22470 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
22480 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22490 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
224a0 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20  addrEnd);..     
224b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
224c0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
224d0 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20  utputs a single 
224e0 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
224f0 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20  t.      ** set. 
22500 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   This subroutine
22510 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20   first looks at 
22520 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49  the iUseFlag.  I
22530 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20  f iUseFlag.     
22540 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e   ** is less than
22550 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
22560 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  o, the subroutin
22570 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
22580 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70  f.      ** the p
22590 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20  rocessing calls 
225a0 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f  for the query to
225b0 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62   abort, this sub
225c0 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
225d0 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
225e0 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72  iAbortFlag memor
225f0 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72  y location befor
22600 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20  e returning in. 
22610 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f       ** order to
22620 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c   signal the call
22630 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20  er to abort..   
22640 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
22650 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74  SetAbort = sqlit
22660 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
22670 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
22680 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22690 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
226a0 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
226b0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
226c0 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c  v, "set abort fl
226d0 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
226e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
226f0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
22700 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
22710 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
22720 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
22730 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
22740 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
22750 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
22760 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
22770 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22780 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
22790 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64  s, iUseFlag, add
227a0 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20  rOutputRow+2);. 
227b0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
227c0 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65  ((v, "Groupby re
227d0 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65  sult generator e
227e0 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20  ntry point"));. 
227f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22800 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
22810 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
22820 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69  w);.      finali
22830 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
22840 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
22850 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22860 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
22870 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
22880 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51  rOutputRow+1, SQ
22890 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
228a0 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
228b0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
228c0 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
228d0 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20   0, pOrderBy,.  
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228f0 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20 70 44      distinct, pD
22900 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
22910 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f             addrO
22920 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72  utputRow+1, addr
22930 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20  SetAbort);.     
22940 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22950 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
22960 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
22970 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
22980 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70  t((v, "end group
22990 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
229a0 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
229b0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
229c0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
229d0 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75  l reset the grou
229e0 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72  p-by accumulator
229f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22a00 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
22a10 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52  veLabel(v, addrR
22a20 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73  eset);.      res
22a30 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
22a40 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
22a50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22a60 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
22a70 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74  Return, regReset
22a80 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f  );.     .    } /
22a90 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79  * endif pGroupBy
22aa0 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61  .  Begin aggrega
22ab0 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f  te queries witho
22ac0 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a  ut GROUP BY: */.
22ad0 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20      else {.     
22ae0 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20   ExprList *pDel 
22af0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
22b00 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
22b10 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20  UNT.      Table 
22b20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  *pTab;.      if(
22b30 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c   (pTab = isSimpl
22b40 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49  eCount(p, &sAggI
22b50 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  nfo))!=0 ){.    
22b60 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70      /* If isSimp
22b70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e  leCount() return
22b80 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
22b90 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
22ba0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
22bb0 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * the SQL statem
22bc0 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ent is of the fo
22bd0 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  rm:.        **. 
22be0 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
22bf0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
22c00 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a   <tbl>.        *
22c10 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65  *.        ** whe
22c20 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  re the Table str
22c30 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
22c40 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65  represents table
22c50 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20   <tbl>..        
22c60 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
22c70 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
22c80 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69  so common that i
22c90 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73  t is optimized s
22ca0 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20  pecially. The.  
22cb0 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e        ** OP_Coun
22cc0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  t instruction is
22cd0 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72   executed either
22ce0 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74   on the intkey t
22cf0 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20  able that.      
22d00 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
22d10 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65  e data for table
22d20 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65   <tbl> or on one
22d30 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e   of its indexes.
22d40 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   It.        ** i
22d50 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63  s better to exec
22d60 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e  ute the op on an
22d70 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78   index, as index
22d80 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20  es are almost.  
22d90 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
22da0 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65  spread across le
22db0 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68  ss pages than th
22dc0 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  eir correspondin
22dd0 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  g tables..      
22de0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e    */.        con
22df0 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  st int iDb = sql
22e00 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
22e10 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
22e20 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
22e30 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
22e40 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iCsr = pParse->n
22e50 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75  Tab++;     /* Cu
22e60 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74  rsor to scan b-t
22e70 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  ree */.        I
22e80 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
22eb0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
22ec0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
22ed0 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20  yInfo = 0;      
22ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69           /* Keyi
22ef0 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20  nfo for scanned 
22f00 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
22f10 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20   Index *pBest = 
22f20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
22f30 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e        /* Best in
22f40 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72  dex found so far
22f50 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
22f60 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e  iRoot = pTab->tn
22f70 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
22f80 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
22f90 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20   scanned b-tree 
22fa0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69  */..        sqli
22fb0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
22fc0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
22fd0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
22fe0 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
22ff0 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
23000 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
23010 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  me);..        /*
23020 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
23030 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74  index that has t
23040 68 65 20 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20  he least amount 
23050 6f 66 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20  of columns. If. 
23060 20 20 20 20 20 20 20 2a 2a 20 74 68 65 72 65 20         ** there 
23070 69 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78  is such an index
23080 2c 20 61 6e 64 20 69 74 20 68 61 73 20 6c 65 73  , and it has les
23090 73 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20 74  s columns than t
230a0 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20  he table.       
230b0 20 2a 2a 20 64 6f 65 73 2c 20 74 68 65 6e 20 77   ** does, then w
230c0 65 20 63 61 6e 20 61 73 73 75 6d 65 20 74 68 61  e can assume tha
230d0 74 20 69 74 20 63 6f 6e 73 75 6d 65 73 20 6c 65  t it consumes le
230e0 73 73 20 73 70 61 63 65 20 6f 6e 20 64 69 73 6b  ss space on disk
230f0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
23100 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62  will therefore b
23110 65 20 63 68 65 61 70 65 72 20 74 6f 20 73 63 61  e cheaper to sca
23120 6e 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  n to determine t
23130 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e  he query result.
23140 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  .        ** In t
23150 68 69 73 20 63 61 73 65 20 73 65 74 20 69 52 6f  his case set iRo
23160 6f 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  ot to the root p
23170 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
23180 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 0a 20  e index b-tree. 
23190 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 4b         ** and pK
231a0 65 79 49 6e 66 6f 20 74 6f 20 74 68 65 20 4b 65  eyInfo to the Ke
231b0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
231c0 72 65 71 75 69 72 65 64 20 74 6f 20 6e 61 76 69  required to navi
231d0 67 61 74 65 20 74 68 65 0a 20 20 20 20 20 20 20  gate the.       
231e0 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 20 20 20   ** index..     
231f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
23200 20 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65   In practice the
23210 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
23220 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  re will not be u
23230 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20  sed. It is only 
23240 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73  .        ** pass
23250 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70  ed to keep OP_Op
23260 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20  enRead happy..  
23270 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
23280 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
23290 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
232a0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
232b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
232c0 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 6e  pBest || pIdx->n
232d0 43 6f 6c 75 6d 6e 3c 70 42 65 73 74 2d 3e 6e 43  Column<pBest->nC
232e0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
232f0 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64       pBest = pId
23300 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  x;.          }. 
23310 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23320 20 69 66 28 20 70 42 65 73 74 20 26 26 20 70 42   if( pBest && pB
23330 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 54 61  est->nColumn<pTa
23340 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
23350 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65       iRoot = pBe
23360 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  st->tnum;.      
23370 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
23380 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
23390 66 6f 28 70 50 61 72 73 65 2c 20 70 42 65 73 74  fo(pParse, pBest
233a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
233b0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20        /* Open a 
233c0 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
233d0 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50  , execute the OP
233e0 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68  _Count, close th
233f0 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20  e cursor. */.   
23400 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23410 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
23420 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f  nRead, iCsr, iRo
23430 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  ot, iDb);.      
23440 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
23450 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
23460 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
23470 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70  v, -1, (char *)p
23480 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
23490 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
234a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
234b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
234c0 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69  2(v, OP_Count, i
234d0 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  Csr, sAggInfo.aF
234e0 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20  unc[0].iMem);.  
234f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23500 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
23510 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20  ose, iCsr);.    
23520 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
23530 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  * SQLITE_OMIT_BT
23540 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20  REECOUNT */.    
23550 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43    {.        /* C
23560 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72  heck if the quer
23570 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  y is of one of t
23580 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
23590 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ms:.        **. 
235a0 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
235b0 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e  CT min(x) FROM .
235c0 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ...        **   
235d0 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52  SELECT max(x) FR
235e0 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
235f0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20  *.        ** If 
23600 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20  it is, then ask 
23610 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72  the code in wher
23620 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74  e.c to attempt t
23630 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20  o sort results. 
23640 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20         ** as if 
23650 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52  there was an "OR
23660 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52  DER ON x" or "OR
23670 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63  DER ON x DESC" c
23680 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20  lause. .        
23690 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73  ** If where.c is
236a0 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65   able to produce
236b0 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20   results sorted 
236c0 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74  in this order, t
236d0 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hen.        ** a
236e0 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20  dd vdbe code to 
236f0 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
23700 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70   processing loop
23710 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20   after the .    
23720 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65      ** first ite
23730 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68  ration (since th
23740 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
23750 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73  n of the loop is
23760 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61   .        ** gua
23770 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61  ranteed to opera
23780 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69  te on the row wi
23790 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f  th the minimum o
237a0 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20  r maximum .     
237b0 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78     ** value of x
237c0 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72  , the only row r
237d0 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20  equired)..      
237e0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
237f0 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d  A special flag m
23800 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f  ust be passed to
23810 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
23820 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79  in() to slightly
23830 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69  .        ** modi
23840 66 79 20 62 65 68 61 76 69 6f 75 72 20 61 73 20  fy behaviour as 
23850 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20  follows:.       
23860 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
23870 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20   + If the query 
23880 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e  is a "SELECT min
23890 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c  (x)", then the l
238a0 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20  oop coded by.   
238b0 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72       **     wher
238c0 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69  e.c should not i
238d0 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20  terate over any 
238e0 76 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55  values with a NU
238f0 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  LL value.       
23900 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20   **     for x.. 
23910 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
23920 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74    **   + The opt
23930 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77  imizer code in w
23940 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e  here.c (the thin
23950 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77  g that decides w
23960 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
23970 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64      index or ind
23980 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f  ices to use) sho
23990 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66  uld place a diff
239a0 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f  erent priority o
239b0 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  n .        **   
239c0 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65    satisfying the
239d0 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75   'ORDER BY' clau
239e0 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20  se than it does 
239f0 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a  in other cases..
23a00 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52          **     R
23a10 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64  efer to code and
23a20 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65   comments in whe
23a30 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73  re.c for details
23a40 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
23a50 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
23a60 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20  MinMax = 0;.    
23a70 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20 6d 69      u8 flag = mi
23a80 6e 4d 61 78 51 75 65 72 79 28 70 29 3b 0a 20 20  nMaxQuery(p);.  
23a90 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29        if( flag )
23aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
23ab0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
23ac0 65 72 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e  erty(p->pEList->
23ad0 61 5b 30 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78  a[0].pExpr, EP_x
23ae0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
23af0 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d         pMinMax =
23b00 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
23b10 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
23b20 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 78  t->a[0].pExpr->x
23b30 2e 70 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20 20  .pList,0);.     
23b40 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e       pDel = pMin
23b50 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Max;.          i
23b60 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64  f( pMinMax && !d
23b70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
23b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
23b90 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72  MinMax->a[0].sor
23ba0 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57  tOrder = flag!=W
23bb0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
23bc0 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20   ?1:0;.         
23bd0 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
23be0 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f  .pExpr->op = TK_
23bf0 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
23c00 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
23c10 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
23c20 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68   case runs if th
23c30 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  e aggregate has 
23c40 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
23c50 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  se.  The.       
23c60 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69   ** processing i
23c70 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73  s much simpler s
23c80 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e  ince there is on
23c90 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a  ly a single row.
23ca0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75          ** of ou
23cb0 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tput..        */
23cc0 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41 63  .        resetAc
23cd0 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
23ce0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
23cf0 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
23d00 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
23d10 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
23d20 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4d 69 6e  t, pWhere, &pMin
23d30 4d 61 78 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20  Max, flag);.    
23d40 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
23d50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
23d60 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
23d70 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
23d80 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
23d90 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
23da0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64     }.        upd
23db0 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
23dc0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
23dd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
23de0 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c 61 67 20  pMinMax && flag 
23df0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
23e00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23e10 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57  , OP_Goto, 0, pW
23e20 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20  Info->iBreak);. 
23e30 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
23e40 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62  ment((v, "%s() b
23e50 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20  y index",.      
23e60 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d            (flag=
23e70 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
23e80 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29  IN?"min":"max"))
23e90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
23ea0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
23eb0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
23ec0 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
23ed0 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
23ee0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
23ef0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4f       }..      pO
23f00 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
23f10 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
23f20 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
23f30 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53  ving, addrEnd, S
23f40 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
23f50 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
23f60 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
23f70 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30   p, p->pEList, 0
23f80 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20  , 0, 0, -1, .   
23f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fa0 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e     pDest, addrEn
23fb0 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  d, addrEnd);.   
23fc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
23fd0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
23fe0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
23ff0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
24000 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64  Label(v, addrEnd
24010 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65  );.    .  } /* e
24020 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71  ndif aggregate q
24030 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  uery */..  /* If
24040 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
24050 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
24060 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
24070 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
24080 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
24090 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
240a0 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
240b0 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
240c0 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  y ){.    generat
240d0 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65  eSortTail(pParse
240e0 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e  , p, v, pEList->
240f0 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20  nExpr, pDest);. 
24100 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65   }..  /* Jump he
24110 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20  re to skip this 
24120 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
24130 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
24140 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a  abel(v, iEnd);..
24150 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
24160 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
24170 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68   coded.   Set th
24180 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
24190 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63   0.  ** to indic
241a0 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20  ate no errors.. 
241b0 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20   */.  rc = 0;.. 
241c0 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70   /* Control jump
241d0 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20  s to here if an 
241e0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
241f0 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75  ered above, or u
24200 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  pon.  ** success
24210 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68  ful coding of th
24220 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73  e SELECT..  */.s
24230 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a  elect_end:..  /*
24240 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
24250 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74   names if result
24260 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
24270 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74  are to be output
24280 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
24290 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
242a0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
242b0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65  Output ){.    ge
242c0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
242d0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
242e0 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
242f0 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
24300 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
24310 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Col);.  sqlite3D
24320 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e  bFree(db, sAggIn
24330 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74  fo.aFunc);.  ret
24340 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64  urn rc;.}..#if d
24350 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
24360 42 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  BUG)./*.********
24370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
243a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
243b0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66  *******.** The f
243c0 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69 73  ollowing code is
243d0 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
243e0 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
243f0 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 64 65 0a  only.  The code.
24400 2a 2a 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ** that follows 
24410 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20  does not appear 
24420 69 6e 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  in normal builds
24430 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
24440 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
24450 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65  to print out the
24460 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20   content of all 
24470 6f 72 20 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a  or part of a .**
24480 20 70 61 72 73 65 20 73 74 72 75 63 74 75 72 65   parse structure
24490 73 20 73 75 63 68 20 61 73 20 53 65 6c 65 63 74  s such as Select
244a0 20 6f 72 20 45 78 70 72 2e 20 20 53 75 63 68 20   or Expr.  Such 
244b0 70 72 69 6e 74 6f 75 74 73 20 61 72 65 20 75 73  printouts are us
244c0 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70  eful.** for help
244d0 69 6e 67 20 74 6f 20 75 6e 64 65 72 73 74 61 6e  ing to understan
244e0 64 20 77 68 61 74 20 69 73 20 68 61 70 70 65 6e  d what is happen
244f0 69 6e 67 20 69 6e 73 69 64 65 20 74 68 65 20 63  ing inside the c
24500 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
24510 20 64 75 72 69 6e 67 20 74 68 65 20 65 78 65 63   during the exec
24520 75 74 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78  ution of complex
24530 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
24540 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ts..**.** These 
24550 72 6f 75 74 69 6e 65 20 61 72 65 20 6e 6f 74 20  routine are not 
24560 63 61 6c 6c 65 64 20 61 6e 79 77 68 65 72 65 20  called anywhere 
24570 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
24580 6e 6f 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62  normal.** code b
24590 61 73 65 2e 20 20 54 68 65 6e 20 61 72 65 20 69  ase.  Then are i
245a0 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 63 61  ntended to be ca
245b0 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
245c0 20 74 68 65 20 64 65 62 75 67 67 65 72 0a 2a 2a   the debugger.**
245d0 20 6f 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61   or from tempora
245e0 72 79 20 22 70 72 69 6e 74 66 22 20 73 74 61 74  ry "printf" stat
245f0 65 6d 65 6e 74 73 20 69 6e 73 65 72 74 65 64 20  ements inserted 
24600 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a  for debugging..*
24610 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72  /.void sqlite3Pr
24620 69 6e 74 45 78 70 72 28 45 78 70 72 20 2a 70 29  intExpr(Expr *p)
24630 7b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  {.  if( !ExprHas
24640 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
24650 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
24660 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 73  .zToken ){.    s
24670 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24680 66 28 22 28 25 73 22 2c 20 70 2d 3e 75 2e 7a 54  f("(%s", p->u.zT
24690 6f 6b 65 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  oken);.  }else{.
246a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
246b0 50 72 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d  Printf("(%d", p-
246c0 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >op);.  }.  if( 
246d0 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  p->pLeft ){.    
246e0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
246f0 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c  tf(" ");.    sql
24700 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
24710 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69  >pLeft);.  }.  i
24720 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a  f( p->pRight ){.
24730 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24740 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20  Printf(" ");.   
24750 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
24760 72 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  r(p->pRight);.  
24770 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
24780 50 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76  Printf(")");.}.v
24790 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
247a0 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
247b0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
247c0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
247d0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
247e0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
247f0 50 72 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d  PrintExpr(pList-
24800 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
24810 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e    if( i<pList->n
24820 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20  Expr-1 ){.      
24830 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24840 74 66 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a  tf(", ");.    }.
24850 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
24860 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65  e3PrintSelect(Se
24870 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64  lect *p, int ind
24880 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44  ent){.  sqlite3D
24890 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53  ebugPrintf("%*sS
248a0 45 4c 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64  ELECT(%p) ", ind
248b0 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73  ent, "", p);.  s
248c0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
248d0 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  ist(p->pEList);.
248e0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
248f0 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66  intf("\n");.  if
24900 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20  ( p->pSrc ){.   
24910 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a   char *zPrefix;.
24920 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a      int i;.    z
24930 50 72 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b  Prefix = "FROM";
24940 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
24950 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69  p->pSrc->nSrc; i
24960 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
24970 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
24980 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63  pItem = &p->pSrc
24990 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71  ->a[i];.      sq
249a0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
249b0 28 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b  ("%*s ", indent+
249c0 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20  6, zPrefix);.   
249d0 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b     zPrefix = "";
249e0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
249f0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
24a00 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24a10 67 50 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a  gPrintf("(\n");.
24a20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
24a30 72 69 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d  rintSelect(pItem
24a40 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e  ->pSelect, inden
24a50 74 2b 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73  t+10);.        s
24a60 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24a70 66 28 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74  f("%*s)", indent
24a80 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d  +8, "");.      }
24a90 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e  else if( pItem->
24aa0 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
24ab0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24ac0 6e 74 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d  ntf("%s", pItem-
24ad0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
24ae0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
24af0 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ->pTab ){.      
24b00 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24b10 69 6e 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73  intf("(table: %s
24b20 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  )", pItem->pTab-
24b30 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
24b40 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
24b50 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
24b60 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24b70 50 72 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c  Printf(" AS %s",
24b80 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
24b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
24ba0 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  f( i<p->pSrc->nS
24bb0 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc-1 ){.        
24bc0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24bd0 74 66 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d  tf(",");.      }
24be0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
24bf0 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
24c00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
24c10 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20   p->pWhere ){.  
24c20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24c30 69 6e 74 66 28 22 25 2a 73 20 57 48 45 52 45 20  intf("%*s WHERE 
24c40 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
24c50 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
24c60 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b  Expr(p->pWhere);
24c70 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
24c80 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
24c90 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f   }.  if( p->pGro
24ca0 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  upBy ){.    sqli
24cb0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24cc0 25 2a 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20  %*s GROUP BY ", 
24cd0 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
24ce0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
24cf0 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
24d00 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  y);.    sqlite3D
24d10 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
24d20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
24d30 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71  Having ){.    sq
24d40 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24d50 28 22 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20  ("%*s HAVING ", 
24d60 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
24d70 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
24d80 72 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  r(p->pHaving);. 
24d90 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24da0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
24db0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
24dc0 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
24dd0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
24de0 73 20 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e  s ORDER BY ", in
24df0 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
24e00 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
24e10 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  ist(p->pOrderBy)
24e20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
24e30 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
24e40 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20    }.}./* End of 
24e50 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64 65  the structure de
24e60 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64  bug printing cod
24e70 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.**************
24e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
24ec0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
24ed0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
24ee0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
24ef0 45 5f 44 45 42 55 47 29 20 2a 2f 0a              E_DEBUG) */.