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

Artifact a3d8a0185e437e10adf82b69cd41c987bb2e58bb:


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 31  select.c,v 1.521
0200: 20 32 30 30 39 2f 30 35 2f 33 30 20 32 30 3a 34   2009/05/30 20:4
0210: 39 3a 32 30 20 64 72 68 20 45 78 70 20 24 0a 2a  9:20 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 69 52 69 67 68 74 4a 6f 69 6e 54  le = iRightJoinT
1cd0: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 45  able;.  }.  *ppE
1ce0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1cf0: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
1d00: 2a 70 70 45 78 70 72 2c 20 70 45 29 3b 0a 7d 0a  *ppExpr, pE);.}.
1d10: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
1d20: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
1d30: 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  rty on all terms
1d40: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
1d50: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64  pression..** And
1d60: 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69 52   set the Expr.iR
1d70: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f  ightJoinTable to
1d80: 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72   iTable for ever
1d90: 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a  y term in the.**
1da0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
1db0: 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  ** The EP_FromJo
1dc0: 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  in property is u
1dd0: 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20  sed on terms of 
1de0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  an expression to
1df0: 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46   tell.** the LEF
1e00: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f  T OUTER JOIN pro
1e10: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68  cessing logic th
1e20: 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73 20  at this term is 
1e30: 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a  part of the.** j
1e40: 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20  oin restriction 
1e50: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
1e60: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
1e70: 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61  use and not a pa
1e80: 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72  rt.** of the mor
1e90: 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20  e general WHERE 
1ea0: 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20 74  clause.  These t
1eb0: 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f  erms are moved o
1ec0: 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48  ver to the.** WH
1ed0: 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e  ERE clause durin
1ee0: 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e  g join processin
1ef0: 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f  g but we need to
1f00: 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74   remember that t
1f10: 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65  hey.** originate
1f20: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
1f30: 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  SING clause..**.
1f40: 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69 67  ** The Expr.iRig
1f50: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c  htJoinTable tell
1f60: 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  s the WHERE clau
1f70: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  se processing th
1f80: 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  at the.** expres
1f90: 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20  sion depends on 
1fa0: 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e  table iRightJoin
1fb0: 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68  Table even if th
1fc0: 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a  at table is not.
1fd0: 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65  ** explicitly me
1fe0: 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65  ntioned in the e
1ff0: 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74  xpression.  That
2000: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2010: 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61  needed.** for ca
2020: 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ses like this:.*
2030: 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
2040: 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
2050: 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
2060: 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a  .b AND t1.x=5.**
2070: 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c  .** The where cl
2080: 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65  ause needs to de
2090: 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67  fer the handling
20a0: 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a   of the t1.x=5.*
20b0: 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74  * term until aft
20c0: 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f  er the t2 loop o
20d0: 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20  f the join.  In 
20e0: 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e  that way, a.** N
20f0: 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20  ULL t2 row will 
2100: 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e  be inserted when
2110: 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49  ever t1.x!=5.  I
2120: 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64  f we do not.** d
2130: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
2140: 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20  g of t1.x=5, it 
2150: 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65  will be processe
2160: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  d immediately.**
2170: 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f   after the t1 lo
2180: 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68  op and rows with
2190: 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65   t1.x!=5 will ne
21a0: 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a  ver appear in.**
21b0: 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69   the output, whi
21c0: 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e  ch is incorrect.
21d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21e0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72  setJoinExpr(Expr
21f0: 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29   *p, int iTable)
2200: 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  {.  while( p ){.
2210: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
2220: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
2230: 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  in);.    assert(
2240: 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
2250: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
2260: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2270: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 49   );.    ExprSetI
2280: 72 72 65 64 75 63 69 62 6c 65 28 70 29 3b 0a 20  rreducible(p);. 
2290: 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e     p->iRightJoin
22a0: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
22b0: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
22c0: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
22d0: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
22e0: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
22f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2300: 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a   processes the j
2310: 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oin information 
2320: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
2330: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e  tement..** ON an
2340: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2350: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
2360: 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  to extra terms o
2370: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2380: 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a  se..** NATURAL j
2390: 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65  oins also create
23a0: 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61   extra WHERE cla
23b0: 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  use terms..**.**
23c0: 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20   The terms of a 
23d0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20  FROM clause are 
23e0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
23f0: 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72   Select.pSrc str
2400: 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c  ucture..** The l
2410: 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft most table i
2420: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
2430: 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63  y in Select.pSrc
2440: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
2450: 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68  t.** table is th
2460: 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54  e last entry.  T
2470: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
2480: 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20   is held in the 
2490: 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20  entry to.** the 
24a0: 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72  left.  Thus entr
24b0: 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  y 0 contains the
24c0: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66   join operator f
24d0: 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77  or the join betw
24e0: 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30  een.** entries 0
24f0: 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20   and 1.  Any ON 
2500: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
2510: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2520: 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a   the join are.**
2530: 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74   also attached t
2540: 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79  o the left entry
2550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2560: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
2570: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
2580: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
2590: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
25a0: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50  iteProcessJoin(P
25b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
25c0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
25d0: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
25f0: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
2600: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2610: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2640: 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  rs */.  struct S
2650: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
2660: 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20  ft;     /* Left 
2670: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
2680: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ed */.  struct S
2690: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69  rcList_item *pRi
26a0: 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74  ght;    /* Right
26b0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
26c0: 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d  ned */..  pSrc =
26d0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66   p->pSrc;.  pLef
26e0: 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b  t = &pSrc->a[0];
26f0: 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65  .  pRight = &pLe
2700: 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ft[1];.  for(i=0
2710: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
2720: 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c  ; i++, pRight++,
2730: 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54   pLeft++){.    T
2740: 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d  able *pLeftTab =
2750: 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20   pLeft->pTab;.  
2760: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
2770: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
2780: 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74  b;.    int isOut
2790: 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56  er;..    if( NEV
27a0: 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c  ER(pLeftTab==0 |
27b0: 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29 20  | pRightTab==0) 
27c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
27d0: 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67 68  isOuter = (pRigh
27e0: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
27f0: 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20  _OUTER)!=0;..   
2800: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54   /* When the NAT
2810: 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20  URAL keyword is 
2820: 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45  present, add WHE
2830: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
2840: 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
2850: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
2860: 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65   two tables have
2870: 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20   in common..    
2880: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
2890: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
28a0: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
28b0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
28c0: 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73  n || pRight->pUs
28d0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
28e0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
28f0: 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41  Parse, "a NATURA
2900: 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68  L join may not h
2910: 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  ave ".          
2920: 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47   "an ON or USING
2930: 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20   clause", 0);.  
2940: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2950: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
2960: 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74 54 61  r(j=0; j<pLeftTa
2970: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
2980: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
2990: 6d 65 20 3d 20 70 4c 65 66 74 54 61 62 2d 3e 61  me = pLeftTab->a
29a0: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col[j].zName;.  
29b0: 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e        if( column
29c0: 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c  Index(pRightTab,
29d0: 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
29e0: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
29f0: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61  Term(pParse, zNa
2a00: 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c  me, pLeftTab, pL
2a10: 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20  eft->zAlias, .  
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
2a40: 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a  htTab, pRight->z
2a50: 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20  Alias,.         
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a70: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69 43 75       pRight->iCu
2a80: 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  rsor, &p->pWhere
2a90: 2c 20 69 73 4f 75 74 65 72 29 3b 0a 20 20 20 20  , isOuter);.    
2aa0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d        .        }
2ab0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2ac0: 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20      /* Disallow 
2ad0: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
2ae0: 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65  G clauses in the
2af0: 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a   same join.    *
2b00: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
2b10: 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d  ->pOn && pRight-
2b20: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
2b30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2b40: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
2b50: 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e   have both ON an
2b60: 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20  d USING ".      
2b70: 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68    "clauses in th
2b80: 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20  e same join");. 
2b90: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2ba0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
2bb0: 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74   the ON clause t
2bc0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
2bd0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63   WHERE clause, c
2be0: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20  onnected by.    
2bf0: 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ** an AND operat
2c00: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
2c10: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29  f( pRight->pOn )
2c20: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75  {.      if( isOu
2c30: 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70  ter ) setJoinExp
2c40: 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70  r(pRight->pOn, p
2c50: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b  Right->iCursor);
2c60: 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65  .      p->pWhere
2c70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
2c80: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  d(pParse->db, p-
2c90: 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d  >pWhere, pRight-
2ca0: 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69  >pOn);.      pRi
2cb0: 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20  ght->pOn = 0;.  
2cc0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
2cd0: 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  te extra terms o
2ce0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2cf0: 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  se for each colu
2d00: 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20  mn named.    ** 
2d10: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
2d20: 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49  use.  Example: I
2d30: 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  f the two tables
2d40: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72   to be joined ar
2d50: 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20  e .    ** A and 
2d60: 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20  B and the USING 
2d70: 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20  clause names X, 
2d80: 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61  Y, and Z, then a
2d90: 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74  dd this.    ** t
2da0: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
2db0: 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41  se:    A.X=B.X A
2dc0: 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41  ND A.Y=B.Y AND A
2dd0: 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65  .Z=B.Z.    ** Re
2de0: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66  port an error if
2df0: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74   any column ment
2e00: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49  ioned in the USI
2e10: 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20  NG clause is.   
2e20: 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   ** not containe
2e30: 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  d in both tables
2e40: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20   to be joined.. 
2e50: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
2e60: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
2e70: 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c        IdList *pL
2e80: 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55  ist = pRight->pU
2e90: 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  sing;.      for(
2ea0: 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49  j=0; j<pList->nI
2eb0: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
2ec0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
2ed0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
2ee0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
2ef0: 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 54  lumnIndex(pLeftT
2f00: 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20  ab, zName)<0 || 
2f10: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
2f20: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20  htTab, zName)<0 
2f30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2f40: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2f50: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69  rse, "cannot joi
2f60: 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25  n using column %
2f70: 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20  s - column ".   
2f80: 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72           "not pr
2f90: 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61  esent in both ta
2fa0: 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  bles", zName);. 
2fb0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2fc0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2fd0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
2fe0: 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c  m(pParse, zName,
2ff0: 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74   pLeftTab, pLeft
3000: 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20  ->zAlias, .     
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3020: 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61 62         pRightTab
3030: 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73  , pRight->zAlias
3040: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
3060: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26  ight->iCursor, &
3070: 70 2d 3e 70 57 68 65 72 65 2c 20 69 73 4f 75 74  p->pWhere, isOut
3080: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
3090: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
30a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  0;.}../*.** Inse
30b0: 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22  rt code into "v"
30c0: 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20   that will push 
30d0: 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68  the record on th
30e0: 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20  e top of the.** 
30f0: 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73  stack into the s
3100: 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  orter..*/.static
3110: 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f   void pushOntoSo
3120: 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rter(.  Parse *p
3130: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
3140: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
3150: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3160: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20  pOrderBy,    /* 
3170: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
3180: 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  use */.  Select 
3190: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
31a0: 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c  /* The whole SEL
31b0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
31c0: 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 20 20  .  int regData  
31d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
31e0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
31f0: 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ta to be sorted 
3200: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
3210: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
3220: 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70  .  int nExpr = p
3230: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
3240: 20 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d 20    int regBase = 
3250: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
3260: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70  nge(pParse, nExp
3270: 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67 52  r+2);.  int regR
3280: 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
3290: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
32a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
32b0: 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
32c0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
32d0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
32e0: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
32f0: 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 73  regBase, 0);.  s
3300: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3310: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
3320: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
3330: 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  sor, regBase+nEx
3340: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
3350: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
3360: 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67 42  e, regData, regB
3370: 61 73 65 2b 6e 45 78 70 72 2b 31 2c 20 31 29 3b  ase+nExpr+1, 1);
3380: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3390: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
33a0: 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20  ecord, regBase, 
33b0: 6e 45 78 70 72 20 2b 20 32 2c 20 72 65 67 52 65  nExpr + 2, regRe
33c0: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
33d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
33e0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4f 72 64  _IdxInsert, pOrd
33f0: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
3400: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
3410: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
3420: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
3430: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
3440: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
3450: 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
3460: 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69  e, nExpr+2);.  i
3470: 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  f( pSelect->iLim
3480: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  it ){.    int ad
3490: 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20  dr1, addr2;.    
34a0: 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20  int iLimit;.    
34b0: 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  if( pSelect->iOf
34c0: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c  fset ){.      iL
34d0: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
34e0: 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d  iOffset+1;.    }
34f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d  else{.      iLim
3500: 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c  it = pSelect->iL
3510: 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  imit;.    }.    
3520: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
3530: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
3540: 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b  IfZero, iLimit);
3550: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3560: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
3570: 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29  Imm, iLimit, -1)
3580: 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
3590: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
35a0: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
35b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
35c0: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
35d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
35e0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp1(v, OP_Last
35f0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
3600: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
3610: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
3620: 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72 64 65  OP_Delete, pOrde
3630: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  rBy->iECursor);.
3640: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3650: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32  umpHere(v, addr2
3660: 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e  );.    pSelect->
3670: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  iLimit = 0;.  }.
3680: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
3690: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
36a0: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
36b0: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
36c0: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
36d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
36e0: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
36f0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65  his VM */.  Sele
3700: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ct *p,        /*
3710: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
3720: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
3730: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
3740: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
3750: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
3760: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
3770: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
3780: 69 4f 66 66 73 65 74 20 26 26 20 69 43 6f 6e 74  iOffset && iCont
3790: 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69  inue!=0 ){.    i
37a0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c  nt addr;.    sql
37b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
37c0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e  , OP_AddImm, p->
37d0: 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20  iOffset, -1);.  
37e0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
37f0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
3800: 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73  _IfNeg, p->iOffs
3810: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
3820: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3830: 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69  _Goto, 0, iConti
3840: 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  nue);.    VdbeCo
3850: 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20  mment((v, "skip 
3860: 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29  OFFSET records")
3870: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3880: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3890: 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  dr);.  }.}../*.*
38a0: 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20  * Add code that 
38b0: 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61  will check to ma
38c0: 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65  ke sure the N re
38d0: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
38e0: 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d   at iMem.** form
38f0: 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72   a distinct entr
3900: 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f  y.  iTab is a so
3910: 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
3920: 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c   holds previousl
3930: 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e  y.** seen combin
3940: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20  ations of the N 
3950: 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65  values.  A new e
3960: 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20  ntry is made in 
3970: 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63  iTab.** if the c
3980: 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20  urrent N values 
3990: 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41  are new..**.** A
39a0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70   jump to addrRep
39b0: 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20  eat is made and 
39c0: 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61  the N+1 values a
39d0: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
39e0: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
39f0: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
3a00: 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e  s are not distin
3a10: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
3a20: 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28  id codeDistinct(
3a30: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3a40: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
3a50: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
3a60: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
3a70: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
3a80: 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e       /* A sortin
3a90: 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  g index used to 
3aa0: 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63  test for distinc
3ab0: 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61  tness */.  int a
3ac0: 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a  ddrRepeat,    /*
3ad0: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
3ae0: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f   not distinct */
3af0: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
3b00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3b10: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  of elements */. 
3b20: 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20   int iMem       
3b30: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65      /* First ele
3b40: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ment */.){.  Vdb
3b50: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a  e *v;.  int r1;.
3b60: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
3b70: 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c  Vdbe;.  r1 = sql
3b80: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
3b90: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
3ba0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
3bb0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d  P_MakeRecord, iM
3bc0: 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71  em, N, r1);.  sq
3bd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
3be0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
3bf0: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 72  b, addrRepeat, r
3c00: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
3c10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
3c20: 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72  xInsert, iTab, r
3c30: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
3c40: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
3c50: 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  se, r1);.}../*.*
3c60: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72  * Generate an er
3c70: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e  ror message when
3c80: 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65   a SELECT is use
3c90: 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78  d within a subex
3ca0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61  pression.** (exa
3cb0: 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45  mple:  "a IN (SE
3cc0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c  LECT * FROM tabl
3cd0: 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20  e)") but it has 
3ce0: 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75  more than 1 resu
3cf0: 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57  lt.** column.  W
3d00: 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73  e do this in a s
3d10: 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73  ubroutine becaus
3d20: 65 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  e the error occu
3d30: 72 73 20 69 6e 20 6d 75 6c 74 69 70 6c 65 0a 2a  rs in multiple.*
3d40: 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f 0a 73 74 61  * places..*/.sta
3d50: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72  tic int checkFor
3d60: 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
3d70: 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20  tError(.  Parse 
3d80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
3d90: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e  * Parse context.
3da0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
3db0: 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65   *pDest,   /* De
3dc0: 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c  stination of SEL
3dd0: 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ECT results */. 
3de0: 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20   int nExpr      
3df0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3e00: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
3e10: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  s returned by SE
3e20: 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  LECT */.){.  int
3e30: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
3e40: 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78  eDest;.  if( nEx
3e50: 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d  pr>1 && (eDest==
3e60: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
3e70: 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20  ==SRT_Set) ){.  
3e80: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3e90: 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20  g(pParse, "only 
3ea0: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
3eb0: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20  allowed for ".  
3ec0: 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74       "a SELECT t
3ed0: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
3ee0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
3ef0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3f00: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
3f10: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
3f30: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
3f40: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
3f50: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
3f60: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
3f70: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
3f80: 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61  ab and nColumn a
3f90: 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68  re both zero, th
3fa0: 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78  en the pEList ex
3fb0: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
3fc0: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
3fd0: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
3fe0: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
3ff0: 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a  .  If nColumn>0.
4000: 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  ** then data is 
4010: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
4020: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
4030: 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65   used only to ge
4040: 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70  t the.** datatyp
4050: 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  es for each colu
4060: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
4070: 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  id selectInnerLo
4080: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
4090: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
40a0: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
40b0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
40c0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
40d0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
40e0: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
40f0: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
4100: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
4110: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69  ist,       /* Li
4120: 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69  st of values bei
4130: 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ng extracted */.
4140: 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20    int srcTab,   
4150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c            /* Pul
4160: 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  l data from this
4170: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
4180: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  nColumn,        
4190: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
41a0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
41b0: 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a  source table */.
41c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
41d0: 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20  erBy,     /* If 
41e0: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72  not NULL, sort r
41f0: 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69  esults using thi
4200: 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64  s key */.  int d
4210: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20  istinct,        
4220: 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61     /* If >=0, ma
4230: 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74 73 20  ke sure results 
4240: 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  are distinct */.
4250: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
4260: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77  est,      /* How
4270: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
4280: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
4290: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
42a0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
42b0: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
42c0: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
42d0: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
42f0: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
4300: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
4310: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
4320: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
4330: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
4340: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
4350: 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
4360: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
4370: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
4380: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
4390: 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20  regResult;      
43a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
43b0: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
43c0: 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  ng result set */
43d0: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
43e0: 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f  Dest->eDest;   /
43f0: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
4400: 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20   of results */. 
4410: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
4420: 73 74 2d 3e 69 50 61 72 6d 3b 20 20 20 2f 2a 20  st->iParm;   /* 
4430: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
4440: 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  o disposal metho
4450: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75  d */.  int nResu
4460: 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  ltCol;          
4470: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4480: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
4490: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  /..  assert( v )
44a0: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
44b0: 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
44c0: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
44d0: 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e  0 );.  hasDistin
44e0: 63 74 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30  ct = distinct>=0
44f0: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
4500: 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69  ==0 && !hasDisti
4510: 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f  nct ){.    codeO
4520: 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e  ffset(v, p, iCon
4530: 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tinue);.  }..  /
4540: 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65  * Pull the reque
4550: 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  sted columns..  
4560: 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  */.  if( nColumn
4570: 3e 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 75 6c  >0 ){.    nResul
4580: 74 43 6f 6c 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  tCol = nColumn;.
4590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65    }else{.    nRe
45a0: 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74  sultCol = pEList
45b0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69  ->nExpr;.  }.  i
45c0: 66 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d  f( pDest->iMem==
45d0: 30 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e  0 ){.    pDest->
45e0: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
45f0: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 44 65 73 74  Mem+1;.    pDest
4600: 2d 3e 6e 4d 65 6d 20 3d 20 6e 52 65 73 75 6c 74  ->nMem = nResult
4610: 43 6f 6c 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Col;.    pParse-
4620: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
4630: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  Col;.  }else{ . 
4640: 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74     assert( pDest
4650: 2d 3e 6e 4d 65 6d 3d 3d 6e 52 65 73 75 6c 74 43  ->nMem==nResultC
4660: 6f 6c 20 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52  ol );.  }.  regR
4670: 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69  esult = pDest->i
4680: 4d 65 6d 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 75  Mem;.  if( nColu
4690: 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  mn>0 ){.    for(
46a0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
46b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
46c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
46d0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
46e0: 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74  ab, i, regResult
46f0: 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  +i);.    }.  }el
4700: 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52  se if( eDest!=SR
4710: 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  T_Exists ){.    
4720: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
4730: 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53  ation is an EXIS
4740: 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  TS(...) expressi
4750: 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20  on, the actual. 
4760: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74     ** values ret
4770: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
4780: 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75  ECT are not requ
4790: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
47a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
47b0: 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
47c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
47d0: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
47e0: 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52  se, pEList, regR
47f0: 65 73 75 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52  esult, eDest==SR
4800: 54 5f 4f 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20  T_Output);.  }. 
4810: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75   nColumn = nResu
4820: 6c 74 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20  ltCol;..  /* If 
4830: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
4840: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
4850: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
4860: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
4870: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
4880: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
4890: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
48a0: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
48b0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
48c0: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
48d0: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
48e0: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
48f0: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
4900: 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t( pEList->nExpr
4910: 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ==nColumn );.   
4920: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50   codeDistinct(pP
4930: 61 72 73 65 2c 20 64 69 73 74 69 6e 63 74 2c 20  arse, distinct, 
4940: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75  iContinue, nColu
4950: 6d 6e 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a  mn, regResult);.
4960: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4970: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ==0 ){.      cod
4980: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43  eOffset(v, p, iC
4990: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
49a0: 20 20 7d 0a 0a 20 20 69 66 28 20 63 68 65 63 6b    }..  if( check
49b0: 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65  ForMultiColumnSe
49c0: 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
49d0: 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d  , pDest, pEList-
49e0: 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 72  >nExpr) ){.    r
49f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 77  eturn;.  }..  sw
4a00: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
4a10: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
4a20: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
4a30: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
4a40: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
4a50: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
4a60: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
4a70: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
4a80: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
4a90: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
4aa0: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
4ab0: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
4ac0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
4ad0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
4ae0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4af0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4b00: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
4b10: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  sult, nColumn, r
4b20: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
4b30: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4b40: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
4b50: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  rm, r1);.      s
4b60: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
4b70: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
4b80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4b90: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e     }..    /* Con
4ba0: 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20  struct a record 
4bb0: 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72  from the query r
4bc0: 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65  esult, but inste
4bd0: 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76  ad of.    ** sav
4be0: 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c  ing that record,
4bf0: 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79   use it as a key
4c00: 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65   to delete eleme
4c10: 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  nts from.    ** 
4c20: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
4c30: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
4c40: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
4c50: 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73  xcept: {.      s
4c60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4c70: 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65  (v, OP_IdxDelete
4c80: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75  , iParm, regResu
4c90: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  lt, nColumn);.  
4ca0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4cb0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
4cc0: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
4cd0: 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
4ce0: 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
4cf0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4d00: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
4d10: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
4d20: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
4d30: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
4d40: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
4d50: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
4d60: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
4d70: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
4d80: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
4d90: 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
4da0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4db0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4dc0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
4dd0: 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69  mn, r1);.      i
4de0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
4df0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4e00: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
4e10: 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a  rderBy, p, r1);.
4e20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4e30: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
4e40: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
4e50: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
4e60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4e70: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
4e80: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
4e90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4ea0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
4eb0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
4ec0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
4ed0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4ee0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
4ef0: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
4f00: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
4f10: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
4f20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
4f30: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
4f40: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
4f50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4f60: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
4f70: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
4f80: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
4f90: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
4fa0: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
4fb0: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
4fc0: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
4fd0: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
4fe0: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
4ff0: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
5000: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
5010: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
5020: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
5030: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
5040: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5050: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
5060: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
5070: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==1 );.      p->
5080: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
5090: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
50a0: 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  y(pEList->a[0].p
50b0: 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66  Expr, pDest->aff
50c0: 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 69 66  inity);.      if
50d0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
50e0: 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73        /* At firs
50f0: 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75  t glance you wou
5100: 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c  ld think we coul
5110: 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74  d optimize out t
5120: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  he.        ** OR
5130: 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63  DER BY in this c
5140: 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ase since the or
5150: 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  der of entries i
5160: 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  n the set.      
5170: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61    ** does not ma
5180: 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65  tter.  But there
5190: 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49   might be a LIMI
51a0: 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69  T clause, in whi
51b0: 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ch.        ** ca
51c0: 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65  se the order doe
51d0: 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20  s matter */.    
51e0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
51f0: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
5200: 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  rBy, p, regResul
5210: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
5220: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
5230: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
5240: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
5250: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5260: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
5270: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
5280: 6c 74 2c 20 31 2c 20 72 31 2c 20 26 70 2d 3e 61  lt, 1, r1, &p->a
5290: 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
52a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
52b0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
52c0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
52d0: 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20  esult, 1);.     
52e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
52f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
5300: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29  sert, iParm, r1)
5310: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5320: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
5330: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
5340: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
5350: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5360: 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
5370: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
5380: 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
5390: 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
53a0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
53b0: 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
53c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
53d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
53e0: 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a  ger, 1, iParm);.
53f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
5400: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
5410: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
5420: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
5430: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5440: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
5450: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
5460: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
5470: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
5480: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
5490: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
54a0: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
54b0: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
54c0: 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
54d0: 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
54e0: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
54f0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
5500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
5510: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
5520: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
5530: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
5540: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
5550: 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65   pOrderBy, p, re
5560: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
5570: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5580: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
5590: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ve(pParse, regRe
55a0: 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b  sult, iParm, 1);
55b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
55c0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
55d0: 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
55e0: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
55f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5600: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
5610: 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
5620: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
5630: 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  RY */..    /* Se
5640: 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  nd the data to t
5650: 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  he callback func
5660: 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62  tion or to a sub
5670: 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65  routine.  In the
5680: 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20  .    ** case of 
5690: 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68  a subroutine, th
56a0: 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73  e subroutine its
56b0: 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62  elf is responsib
56c0: 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f  le for.    ** po
56d0: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66  pping the data f
56e0: 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20  rom the stack.. 
56f0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5700: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 0a 20 20  RT_Coroutine:.  
5710: 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75    case SRT_Outpu
5720: 74 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  t: {.      testc
5730: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
5740: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
5750: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
5760: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
5770: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
5780: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
5790: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
57a0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
57b0: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
57c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
57d0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
57e0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
57f0: 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  mn, r1);.       
5800: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
5810: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
5820: 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  , p, r1);.      
5830: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
5840: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5850: 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r1);.      }else
5860: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
5870: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
5880: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5890: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
58a0: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ld, pDest->iParm
58b0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
58c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
58d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
58e0: 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65  ResultRow, regRe
58f0: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  sult, nColumn);.
5900: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5910: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
5920: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
5930: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5940: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
5950: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5960: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
5970: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
5980: 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64  ).    /* Discard
5990: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
59a0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
59b0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
59c0: 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20  s inside.    ** 
59d0: 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52  the body of a TR
59e0: 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70  IGGER.  The purp
59f0: 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65  ose of such sele
5a00: 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20  cts is to call. 
5a10: 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e     ** user-defin
5a20: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ed functions tha
5a30: 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65  t have side effe
5a40: 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  cts.  We do not 
5a50: 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75  care.    ** abou
5a60: 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73  t the actual res
5a70: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
5a80: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ct..    */.    d
5a90: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5aa0: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
5ab0: 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20  RT_Discard );.  
5ac0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5ad0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
5ae0: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
5af0: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
5b00: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
5b10: 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
5b20: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
5b30: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65     assert( pOrde
5b40: 72 42 79 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 66  rBy==0 );  /* If
5b50: 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
5b60: 45 52 20 42 59 2c 20 74 68 65 20 63 61 6c 6c 20  ER BY, the call 
5b70: 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  to.             
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
5b90: 2a 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  * pushOntoSorter
5ba0: 28 29 20 77 6f 75 6c 64 20 68 61 76 65 20 63 6c  () would have cl
5bb0: 65 61 72 65 64 20 70 2d 3e 69 4c 69 6d 69 74 20  eared p->iLimit 
5bc0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
5bd0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
5be0: 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74  ddImm, p->iLimit
5bf0: 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
5c00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5c10: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
5c20: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  imit, iBreak);. 
5c30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
5c40: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
5c50: 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61  list, generate a
5c60: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
5c70: 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a  re that records.
5c80: 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** the collating
5c90: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61   sequence for ea
5ca0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
5cb0: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
5cc0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
5cd0: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
5ce0: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  an ORDER BY or G
5cf0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74  ROUP BY clause t
5d00: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e  hen the resultin
5d10: 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72  g.** KeyInfo str
5d20: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
5d30: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
5d40: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
5d50: 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70   index to.** imp
5d60: 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75  lement that clau
5d70: 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72  se.  If the Expr
5d80: 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75  List is the resu
5d90: 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt set of a SELE
5da0: 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b  CT.** then the K
5db0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5dc0: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
5dd0: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
5de0: 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e   a virtual.** in
5df0: 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  dex to implement
5e00: 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74   a DISTINCT test
5e10: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
5e20: 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
5e30: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
5e40: 62 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f  btain from mallo
5e50: 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  c.  The calling.
5e60: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
5e70: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73  esponsible for s
5e80: 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  eeing that this 
5e90: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
5ea0: 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
5eb0: 2e 20 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e  .  Add the KeyIn
5ec0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
5ed0: 74 68 65 20 50 34 20 66 69 65 6c 64 20 6f 66 20  the P4 field of 
5ee0: 61 6e 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a  an opcode using.
5ef0: 2a 2a 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  ** P4_KEYINFO_HA
5f00: 4e 44 4f 46 46 20 69 73 20 74 68 65 20 75 73 75  NDOFF is the usu
5f10: 61 6c 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e  al way of dealin
5f20: 67 20 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a  g with this..*/.
5f30: 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
5f40: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
5f50: 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ist(Parse *pPars
5f60: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  e, ExprList *pLi
5f70: 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  st){.  sqlite3 *
5f80: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
5f90: 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20  .  int nExpr;.  
5fa0: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
5fb0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
5fc0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
5fd0: 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72   int i;..  nExpr
5fe0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
5ff0: 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74  .  pInfo = sqlit
6000: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
6010: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f  b, sizeof(*pInfo
6020: 29 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f  ) + nExpr*(sizeo
6030: 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29  f(CollSeq*)+1) )
6040: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b  ;.  if( pInfo ){
6050: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72  .    pInfo->aSor
6060: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
6070: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70  Info->aColl[nExp
6080: 72 5d 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  r];.    pInfo->n
6090: 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 45 78  Field = (u16)nEx
60a0: 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65  pr;.    pInfo->e
60b0: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
60c0: 20 20 70 49 6e 66 6f 2d 3e 64 62 20 3d 20 64 62    pInfo->db = db
60d0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
60e0: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
60f0: 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  <nExpr; i++, pIt
6100: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c  em++){.      Col
6110: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
6120: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
6130: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
6140: 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
6150: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  pr);.      if( !
6160: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
6170: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
6180: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
6190: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
61a0: 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[i] = pColl;. 
61b0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72       pInfo->aSor
61c0: 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 74 65  tOrder[i] = pIte
61d0: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
61e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
61f0: 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pInfo;.}.../*.*
6200: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
6210: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
6220: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
6230: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
6240: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
6250: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
6260: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
6270: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
6280: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
6290: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
62a0: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
62b0: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
62c0: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
62d0: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
62e0: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
62f0: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
6300: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
6310: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
6320: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
6330: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
6340: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
6350: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
6360: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
6370: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
6380: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
6390: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
63a0: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
63b0: 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  DBE */.  int nCo
63c0: 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75  lumn,      /* Nu
63d0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
63e0: 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  of data */.  Sel
63f0: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f  ectDest *pDest /
6400: 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74  * Write the sort
6410: 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ed results here 
6420: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  */.){.  int addr
6430: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
6440: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
6450: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
6460: 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a  e to exit loop *
6470: 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
6480: 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
6490: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
64a0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f   /* Jump here fo
64b0: 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  r next cycle */.
64c0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e    int addr;.  in
64d0: 74 20 69 54 61 62 3b 0a 20 20 69 6e 74 20 70 73  t iTab;.  int ps
64e0: 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45  eudoTab = 0;.  E
64f0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
6500: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
6510: 0a 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  ..  int eDest = 
6520: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
6530: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73  int iParm = pDes
6540: 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74  t->iParm;..  int
6550: 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72   regRow;.  int r
6560: 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62  egRowid;..  iTab
6570: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43   = pOrderBy->iEC
6580: 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65  ursor;.  if( eDe
6590: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
65a0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
65b0: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73  outine ){.    ps
65c0: 65 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65  eudoTab = pParse
65d0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71  ->nTab++;.    sq
65e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
65f0: 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
6600: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 65 44 65  , pseudoTab, eDe
6610: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 2c 20  st==SRT_Output, 
6620: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20  nColumn);.  }.  
6630: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
6640: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6650: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  OP_Sort, iTab, a
6660: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 63 6f 64  ddrBreak);.  cod
6670: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 61 64  eOffset(v, p, ad
6680: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 72  drContinue);.  r
6690: 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47  egRow = sqlite3G
66a0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
66b0: 29 3b 0a 20 20 72 65 67 52 6f 77 69 64 20 3d 20  );.  regRowid = 
66c0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
66d0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
66e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
66f0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61  , OP_Column, iTa
6700: 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  b, pOrderBy->nEx
6710: 70 72 20 2b 20 31 2c 20 72 65 67 52 6f 77 29 3b  pr + 1, regRow);
6720: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
6730: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
6740: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
6750: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
6760: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
6770: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c   eDest==SRT_Tabl
6780: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
6790: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
67a0: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
67b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
67c0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
67d0: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
67e0: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
67f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6800: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
6810: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
6820: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
6830: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
6840: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
6850: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6860: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
6870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
6880: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
6890: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
68a0: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
68b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
68c0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
68d0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
68e0: 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64  Row, 1, regRowid
68f0: 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20  , &p->affinity, 
6900: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
6910: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
6920: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
6930: 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20   regRow, 1);.   
6940: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6950: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
6960: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
6970: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72  Rowid);.      br
6980: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6990: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
69a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
69b0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
69c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
69d0: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
69e0: 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  Row, iParm, 1);.
69f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
6a00: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
6a10: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
6a20: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
6a30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
6a40: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
6a50: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t: {.      int i
6a60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6a70: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
6a80: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
6a90: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20  Coroutine ); .  
6aa0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
6ab0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
6ac0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
6ad0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
6ae0: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
6af0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b00: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
6b10: 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  , 1, regRowid);.
6b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6b30: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
6b40: 73 65 72 74 2c 20 70 73 65 75 64 6f 54 61 62 2c  sert, pseudoTab,
6b50: 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69   regRow, regRowi
6b60: 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  d);.      for(i=
6b70: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
6b80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
6b90: 72 74 28 20 72 65 67 52 6f 77 21 3d 70 44 65 73  rt( regRow!=pDes
6ba0: 74 2d 3e 69 4d 65 6d 2b 69 20 29 3b 0a 20 20 20  t->iMem+i );.   
6bb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6bc0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
6bd0: 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  umn, pseudoTab, 
6be0: 69 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69  i, pDest->iMem+i
6bf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6c00: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
6c10: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
6c20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6c30: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
6c40: 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d  Row, pDest->iMem
6c50: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
6c60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
6c70: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
6c80: 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  ge(pParse, pDest
6c90: 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29  ->iMem, nColumn)
6ca0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6cb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6cc0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
6cd0: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61  ield, pDest->iPa
6ce0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
6cf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6d00: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
6d10: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6d20: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73  se, regRow);.  s
6d30: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6d40: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
6d50: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 4c 49  Rowid);..  /* LI
6d60: 4d 49 54 20 68 61 73 20 62 65 65 6e 20 69 6d 70  MIT has been imp
6d70: 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20  lemented by the 
6d80: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29  pushOntoSorter()
6d90: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20   routine..  */. 
6da0: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 4c 69 6d   assert( p->iLim
6db0: 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54  it==0 );..  /* T
6dc0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
6dd0: 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
6de0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
6df0: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74  abel(v, addrCont
6e00: 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
6e10: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6e20: 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
6e30: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
6e40: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
6e50: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69   addrBreak);.  i
6e60: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
6e70: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
6e80: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
6e90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6ea0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
6eb0: 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  e, pseudoTab, 0)
6ec0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
6ed0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
6ee0: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
6ef0: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
6f00: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
6f10: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
6f20: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
6f30: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
6f40: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
6f50: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
6f60: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
6f70: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
6f80: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
6f90: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
6fa0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
6fb0: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
6fc0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
6fd0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6fe0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
6ff0: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
7000: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
7010: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
7020: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
7030: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
7040: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
7050: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
7060: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
7070: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
7080: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
7090: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
70a0: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
70b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
70c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
70d0: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
70e0: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
70f0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
7100: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
7110: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
7120: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
7130: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
7140: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
7150: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
7160: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
7170: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
7180: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
7190: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
71a0: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
71b0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
71c0: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
71d0: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  mn is NULL..*/.s
71e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
71f0: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20   *columnType(.  
7200: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
7210: 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  , .  Expr *pExpr
7220: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7230: 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63  *pzOriginDb,.  c
7240: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
7250: 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74  iginTab,.  const
7260: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
7270: 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  Col.){.  char co
7280: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
7290: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
72a0: 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63  riginDb = 0;.  c
72b0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
72c0: 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61  inTab = 0;.  cha
72d0: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e  r const *zOrigin
72e0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  Col = 0;.  int j
72f0: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45  ;.  if( NEVER(pE
7300: 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e  xpr==0) || pNC->
7310: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65  pSrcList==0 ) re
7320: 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63  turn 0;..  switc
7330: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
7340: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
7350: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
7360: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
7370: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
7380: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
7390: 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  n. Locate the ta
73a0: 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ble the column i
73b0: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
73c0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
73d0: 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70  in NameContext.p
73e0: 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61  SrcList. This ta
73f0: 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a  ble may be real.
7400: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
7410: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62  e table or a sub
7420: 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  query..      */.
7430: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
7440: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
7450: 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63    /* Table struc
7460: 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65  ture column is e
7470: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
7480: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
7490: 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  S = 0;          
74a0: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65     /* Select the
74b0: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
74c0: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
74d0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
74e0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f  xpr->iColumn;  /
74f0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
7500: 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  n in pTab */.   
7510: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
7520: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
7530: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
7540: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
7550: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
7560: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e  .      while( pN
7570: 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  C && !pTab ){.  
7580: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
7590: 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  TabList = pNC->p
75a0: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  SrcList;.       
75b0: 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c   for(j=0;j<pTabL
75c0: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
75d0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
75e0: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
75f0: 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  le;j++);.       
7600: 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d   if( j<pTabList-
7610: 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20  >nSrc ){.       
7620: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
7630: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
7640: 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54           pS = pT
7650: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65  abList->a[j].pSe
7660: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  lect;.        }e
7670: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
7680: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
7690: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
76a0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
76b0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
76c0: 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20 20 20   /* FIX ME:.    
76d0: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 6e 20      ** This can 
76e0: 6f 63 63 75 72 73 20 69 66 20 79 6f 75 20 68 61  occurs if you ha
76f0: 76 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ve something lik
7700: 65 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 3b  e "SELECT new.x;
7710: 22 20 69 6e 73 69 64 65 0a 20 20 20 20 20 20 20  " inside.       
7720: 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2e 20 20   ** a trigger.  
7730: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
7740: 69 66 20 79 6f 75 20 72 65 66 65 72 65 6e 63 65  if you reference
7750: 20 74 68 65 20 73 70 65 63 69 61 6c 20 22 6e 65   the special "ne
7760: 77 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  w".        ** ta
7770: 62 6c 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ble in the resul
7780: 74 20 73 65 74 20 6f 66 20 61 20 73 65 6c 65 63  t set of a selec
7790: 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 68 61  t.  We do not ha
77a0: 76 65 20 61 20 67 6f 6f 64 20 77 61 79 0a 20 20  ve a good way.  
77b0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64        ** to find
77c0: 20 74 68 65 20 61 63 74 75 61 6c 20 74 61 62 6c   the actual tabl
77d0: 65 20 74 79 70 65 2c 20 73 6f 20 63 61 6c 6c 20  e type, so call 
77e0: 69 74 20 22 54 45 58 54 22 2e 20 20 54 68 69 73  it "TEXT".  This
77f0: 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 20 20 20   is really.     
7800: 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20     ** something 
7810: 6f 66 20 61 20 62 75 67 2c 20 62 75 74 20 49 20  of a bug, but I 
7820: 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20  do not know how 
7830: 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20 20 20  to fix it..     
7840: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
7850: 20 54 68 69 73 20 63 6f 64 65 20 64 6f 65 73 20   This code does 
7860: 6e 6f 74 20 70 72 6f 64 75 63 65 20 74 68 65 20  not produce the 
7870: 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2d  correct answer -
7880: 20 69 74 20 6a 75 73 74 20 70 72 65 76 65 6e 74   it just prevent
7890: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73  s.        ** a s
78a0: 65 67 66 61 75 6c 74 2e 20 20 53 65 65 20 74 69  egfault.  See ti
78b0: 63 6b 65 74 20 23 31 32 32 39 2e 0a 20 20 20 20  cket #1229..    
78c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a      */.        z
78d0: 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a 20  Type = "TEXT";. 
78e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
78f0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
7900: 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20 20  ert( pTab );.   
7910: 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20     if( pS ){.   
7920: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62       /* The "tab
7930: 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20  le" is actually 
7940: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
7950: 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52  a view in the FR
7960: 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  OM clause.      
7970: 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45    ** of the SELE
7980: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65  CT statement. Re
7990: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
79a0: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72  tion type and or
79b0: 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  igin.        ** 
79c0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73  data for the res
79d0: 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f  ult-set column o
79e0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
79f0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
7a00: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
7a10: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
7a20: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  pS->pEList->nExp
7a30: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
7a40: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
7a50: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
7a60: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
7a70: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
7a80: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
7a90: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
7aa0: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
7ab0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
7ac0: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
7ad0: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
7ae0: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
7af0: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
7b00: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
7b10: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
7b20: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
7b30: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
7b40: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
7b50: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
7b60: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
7b70: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
7b80: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
7b90: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a   sNC.pNext = 0;.
7ba0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
7bb0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
7bc0: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
7bd0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
7be0: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
7bf0: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
7c00: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
7c10: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
7c20: 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
7c30: 59 53 28 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  YS(pTab->pSchema
7c40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
7c50: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  A real table */.
7c60: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7c70: 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !pS );.        i
7c80: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
7c90: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
7ca0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7cb0: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
7cc0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
7cd0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
7ce0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
7cf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
7d00: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
7d10: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e           zOrigin
7d20: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
7d30: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7d40: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
7d50: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
7d60: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
7d70: 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70    zOriginCol = p
7d80: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
7d90: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
7da0: 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e  .        zOrigin
7db0: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
7dc0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
7dd0: 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20  NC->pParse ){.  
7de0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
7df0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
7e00: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
7e10: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
7e20: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
7e30: 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e    zOriginDb = pN
7e40: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
7e50: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
7e60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7e70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7e80: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
7e90: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
7ea0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
7eb0: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
7ec0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
7ed0: 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  s a sub-select. 
7ee0: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
7ef0: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a  ration type and.
7f00: 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20        ** origin 
7f10: 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e  info for the sin
7f20: 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  gle column in th
7f30: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
7f40: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20  the SELECT.     
7f50: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20   ** statement.. 
7f60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61       */.      Na
7f70: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
7f80: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
7f90: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
7fa0: 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ct;.      Expr *
7fb0: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
7fc0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
7fd0: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
7fe0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
7ff0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
8000: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63  ;.      sNC.pSrc
8010: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
8020: 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  .      sNC.pNext
8030: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e   = pNC;.      sN
8040: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
8050: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54  pParse;.      zT
8060: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
8070: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
8080: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
8090: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
80a0: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
80b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
80c0: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69    .  if( pzOrigi
80d0: 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nDb ){.    asser
80e0: 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26  t( pzOriginTab &
80f0: 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b  & pzOriginCol );
8100: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62  .    *pzOriginDb
8110: 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20   = zOriginDb;.  
8120: 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d    *pzOriginTab =
8130: 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20   zOriginTab;.   
8140: 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20   *pzOriginCol = 
8150: 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a  zOriginCol;.  }.
8160: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
8170: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
8180: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
8190: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
81a0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
81b0: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
81c0: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
81d0: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
81e0: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
81f0: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
8200: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
8210: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
8220: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
8230: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
8240: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
8250: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
8260: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
8270: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
8280: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
8290: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
82a0: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
82b0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
82c0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
82d0: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
82e0: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
82f0: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
8300: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
8310: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
8320: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
8330: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
8340: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
8350: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
8360: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
8370: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
8380: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
8390: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
83a0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
83b0: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
83c0: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
83d0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
83e0: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
83f0: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
8400: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
8410: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
8420: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
8430: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
8440: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
8450: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
8460: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
8470: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
8480: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
8490: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
84a0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
84b0: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
84c0: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
84d0: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
84e0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
84f0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8500: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8510: 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72  ME_DATABASE, zOr
8520: 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  igDb, SQLITE_TRA
8530: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
8540: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8550: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8560: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
8570: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
8580: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
8590: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
85a0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c  , i, COLNAME_COL
85b0: 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53  UMN, zOrigCol, S
85c0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
85d0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70  ;.#else.    zTyp
85e0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
85f0: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29  sNC, p, 0, 0, 0)
8600: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
8610: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8620: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8630: 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65  _DECLTYPE, zType
8640: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
8650: 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  NT);.  }.#endif 
8660: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
8670: 45 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a  ECLTYPE */.}../*
8680: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
8690: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
86a0: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61   the VDBE the na
86b0: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  mes of columns.*
86c0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
86d0: 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  set.  This infor
86e0: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
86f0: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a  o provide the.**
8700: 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20   azCol[] values 
8710: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
8720: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8730: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
8740: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
8750: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
8760: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
8770: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
8780: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
8790: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
87a0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
87b0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
87c0: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
87d0: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
87e0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
87f0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
8800: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
8810: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8820: 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73  .  int fullNames
8830: 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23  , shortNames;..#
8840: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8850: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20  IT_EXPLAIN.  /* 
8860: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
8870: 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
8880: 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
8890: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
88a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
88b0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
88c0: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
88d0: 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d  Set || NEVER(v==
88e0: 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
88f0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
8900: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
8910: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
8920: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
8930: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
8940: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
8950: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
8960: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
8970: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
8980: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
8990: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
89a0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
89b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
89c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
89d0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
89e0: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
89f0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
8a00: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
8a10: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
8a20: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
8a30: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
8a40: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
8a50: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
8a60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8a70: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8a80: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
8a90: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
8aa0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
8ab0: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
8ac0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
8ad0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
8ae0: 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74  UMN) && pTabList
8af0: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
8b00: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
8b10: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
8b20: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
8b30: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
8b40: 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54  j=0; ALWAYS(j<pT
8b50: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a  abList->nSrc); j
8b60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
8b70: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
8b80: 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62  iCursor==p->iTab
8b90: 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  le ) break;.    
8ba0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
8bb0: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
8bc0: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
8bd0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
8be0: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
8bf0: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
8c00: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
8c10: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
8c20: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
8c30: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
8c40: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
8c50: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
8c60: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
8c70: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
8c80: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
8c90: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
8ca0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
8cb0: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
8cc0: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
8cd0: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
8ce0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8cf0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8d00: 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20  AME_NAME, .     
8d10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
8d20: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
8d30: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
8d40: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
8d50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
8d60: 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20   fullNames ){.  
8d70: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
8d80: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
8d90: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
8da0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
8db0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
8dc0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
8dd0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8de0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8df0: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
8e00: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
8e10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8e30: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8e40: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8e50: 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
8e60: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
8e70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8e80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8e90: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8ea0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
8eb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
8ec0: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
8ed0: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
8ee0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
8ef0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
8f00: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
8f10: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
8f20: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23  t, pEList);.}..#
8f30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8f40: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
8f50: 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  CT./*.** Name of
8f60: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
8f70: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
8f80: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
8f90: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
8fa0: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
8fb0: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
8fc0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
8fd0: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
8fe0: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
8ff0: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
9000: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
9010: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
9020: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
9030: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
9040: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
9050: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
9060: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9070: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
9080: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
9090: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
90a0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
90b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
90c0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
90d0: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
90e0: 47 69 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65  Given a an expre
90f0: 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63  ssion list (whic
9100: 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  h is really the 
9110: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
9120: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d  ons.** that form
9130: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
9140: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
9150: 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61  ement) compute a
9160: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f  ppropriate.** co
9170: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61  lumn names for a
9180: 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c   table that woul
9190: 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  d hold the expre
91a0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
91b0: 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * All column nam
91c0: 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75  es will be uniqu
91d0: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  e..**.** Only th
91e0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
91f0: 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f  re computed.  Co
9200: 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75  lumn.zType, Colu
9210: 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64  mn.zColl,.** and
9220: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
9230: 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f   Column are zero
9240: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
9250: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
9260: 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d  ccess.  If a mem
9270: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
9280: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
9290: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70  store NULL in *p
92a0: 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70  aCol and 0 in *p
92b0: 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  nCol and return 
92c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
92d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
92e0: 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
92f0: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
9300: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
9310: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
9320: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
9330: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
9340: 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
9350: 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
9360: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
9370: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c  */.  int *pnCol,
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9390: 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
93a0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
93b0: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
93c0: 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
93d0: 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
93e0: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
93f0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
9400: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9410: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
9420: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
9430: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
9440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9450: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
9460: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
9470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9480: 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
9490: 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
94a0: 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
94b0: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
94c0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
94d0: 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
94e0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
94f0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
9500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9510: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
9520: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
9530: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20   */.  Expr *p;  
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9550: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
9560: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73  for a single res
9570: 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
9580: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
9590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
95a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
95b0: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
95d0: 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a  ize of name in z
95e0: 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 2a 70 6e  Name[] */..  *pn
95f0: 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20 70 45 4c  Col = nCol = pEL
9600: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 43  ist->nExpr;.  aC
9610: 6f 6c 20 3d 20 2a 70 61 43 6f 6c 20 3d 20 73 71  ol = *paCol = sq
9620: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
9630: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
9640: 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 69  l[0])*nCol);.  i
9650: 66 28 20 61 43 6f 6c 3d 3d 30 20 29 20 72 65 74  f( aCol==0 ) ret
9660: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9670: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ;.  for(i=0, pCo
9680: 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  l=aCol; i<nCol; 
9690: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
96a0: 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72    /* Get an appr
96b0: 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72  opriate name for
96c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   the column.    
96d0: 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  */.    p = pELis
96e0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
96f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
9700: 69 67 68 74 3d 3d 30 20 7c 7c 20 45 78 70 72 48  ight==0 || ExprH
9710: 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 52  asProperty(p->pR
9720: 69 67 68 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ight, EP_IntValu
9730: 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e).             
9740: 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e    || p->pRight->
9750: 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 20 7c 7c 20 70  u.zToken==0 || p
9760: 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  ->pRight->u.zTok
9770: 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  en[0]!=0 );.    
9780: 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c  if( (zName = pEL
9790: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
97a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
97b0: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f  If the column co
97c0: 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e  ntains an "AS <n
97d0: 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73  ame>" phrase, us
97e0: 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20  e <name> as the 
97f0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
9800: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
9810: 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29  trDup(db, zName)
9820: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9830: 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70     Expr *pColExp
9840: 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65 20 65  r = p;  /* The e
9850: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
9860: 73 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c  s the result col
9870: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  umn name */.    
9880: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
9890: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
98a0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
98b0: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
98c0: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
98d0: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
98e0: 5f 44 4f 54 20 29 20 70 43 6f 6c 45 78 70 72 20  _DOT ) pColExpr 
98f0: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
9900: 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ht;.      if( pC
9910: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  olExpr->op==TK_C
9920: 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28  OLUMN && ALWAYS(
9930: 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d  pColExpr->pTab!=
9940: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  0) ){.        /*
9950: 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65   For columns use
9960: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
9970: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
9980: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c   int iCol = pCol
9990: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
99a0: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 43         pTab = pC
99b0: 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20  olExpr->pTab;.  
99c0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
99d0: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
99e0: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a  iPKey;.        z
99f0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
9a00: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 0a  rintf(db, "%s",.
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a20: 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d   iCol>=0 ? pTab-
9a30: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
9a40: 65 20 3a 20 22 72 6f 77 69 64 22 29 3b 0a 20 20  e : "rowid");.  
9a50: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43      }else if( pC
9a60: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  olExpr->op==TK_I
9a70: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  D ){.        ass
9a80: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
9a90: 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20  perty(pColExpr, 
9aa0: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
9ab0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9ac0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
9ad0: 62 2c 20 22 25 73 22 2c 20 70 43 6f 6c 45 78 70  b, "%s", pColExp
9ae0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
9af0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9b00: 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72     /* Use the or
9b10: 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74  iginal text of t
9b20: 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  he column expres
9b30: 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65  sion as its name
9b40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   */.        zNam
9b50: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
9b60: 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 45 4c  tf(db, "%s", pEL
9b70: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
9b80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9b90: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
9ba0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
9bb0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9bc0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
9bd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
9be0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
9bf0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
9c00: 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20   is unique.  If 
9c10: 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  the name is not 
9c20: 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61  unique,.    ** a
9c30: 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20  ppend a integer 
9c40: 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74  to the name so t
9c50: 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75  hat it becomes u
9c60: 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  nique..    */.  
9c70: 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
9c80: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
9c90: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d  ;.    for(j=cnt=
9ca0: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
9cb0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
9cc0: 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a  trICmp(aCol[j].z
9cd0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
9ce0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
9cf0: 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20  *zNewName;.     
9d00: 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20     zName[nName] 
9d10: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65  = 0;.        zNe
9d20: 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  wName = sqlite3M
9d30: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 3a 25  Printf(db, "%s:%
9d40: 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74  d", zName, ++cnt
9d50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9d60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
9d70: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  me);.        zNa
9d80: 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20  me = zNewName;. 
9d90: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
9da0: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
9db0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
9dc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
9dd0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
9de0: 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  me;.  }.  if( db
9df0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9e00: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
9e10: 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <i; j++){.      
9e20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9e30: 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  , aCol[j].zName)
9e40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
9e50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
9e60: 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20  ol);.    *paCol 
9e70: 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20  = 0;.    *pnCol 
9e80: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
9e90: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9ea0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
9eb0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
9ec0: 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  dd type and coll
9ed0: 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
9ee0: 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69  n to a column li
9ef0: 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  st based on.** a
9f00: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
9f10: 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f  t..** .** The co
9f20: 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d  lumn list presum
9f30: 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73  ably came from s
9f40: 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  electColumnNames
9f50: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a  FromExprList()..
9f60: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
9f70: 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65  st has only name
9f80: 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20  s, not types or 
9f90: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69  collations.  Thi
9fa0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65  s.** routine goe
9fb0: 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64  s through and ad
9fc0: 64 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64  ds the types and
9fd0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a   collations..**.
9fe0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9ff0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c  requires that al
a000: 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e  l identifiers in
a010: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73   the SELECT.** s
a020: 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f  tatement be reso
a030: 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lved..*/.static 
a040: 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 43 6f  void selectAddCo
a050: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
a060: 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  tion(.  Parse *p
a070: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
a080: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
a090: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c  s */.  int nCol,
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a0b0: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
a0c0: 73 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  s */.  Column *a
a0d0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Col,         /* 
a0e0: 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
a0f0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
a100: 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45  lect       /* SE
a110: 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74  LECT used to det
a120: 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64  ermine types and
a130: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29   collations */.)
a140: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
a150: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
a160: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
a170: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
a180: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
a190: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  l;.  int i;.  Ex
a1a0: 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20  pr *p;.  struct 
a1b0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
a1c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
a1d0: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  lect!=0 );.  ass
a1e0: 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73  ert( (pSelect->s
a1f0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
a200: 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61  olved)!=0 );.  a
a210: 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 70 53 65  ssert( nCol==pSe
a220: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
a230: 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
a240: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
a250: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a260: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  d ) return;.  me
a270: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
a280: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
a290: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  C.pSrcList = pSe
a2a0: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20  lect->pSrc;.  a 
a2b0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
a2c0: 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  t->a;.  for(i=0,
a2d0: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43   pCol=aCol; i<nC
a2e0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
a2f0: 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70  {.    p = a[i].p
a300: 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Expr;.    pCol->
a310: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44  zType = sqlite3D
a320: 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75  bStrDup(db, colu
a330: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
a340: 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70  0, 0, 0));.    p
a350: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
a360: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
a370: 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ity(p);.    if( 
a380: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
a390: 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  0 ) pCol->affini
a3a0: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
a3b0: 4e 4f 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  NONE;.    pColl 
a3c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
a3d0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
a3e0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
a3f0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43  {.      pCol->zC
a400: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  oll = sqlite3DbS
a410: 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d  trDup(db, pColl-
a420: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
a430: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
a440: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
a450: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
a460: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
a470: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
a480: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
a490: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
a4a0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
a4b0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
a4c0: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
a4d0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
a4e0: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
a4f0: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
a500: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a510: 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67  .  int savedFlag
a520: 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73  s;..  savedFlags
a530: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
a540: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
a550: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
a560: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  s;.  db->flags |
a570: 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
a580: 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65  lNames;.  sqlite
a590: 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
a5a0: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b  se, pSelect, 0);
a5b0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
a5c0: 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
a5d0: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
a5e0: 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
a5f0: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
a600: 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  rior;.  db->flag
a610: 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  s = savedFlags;.
a620: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
a630: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
a640: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
a650: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
a660: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
a670: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71  .  }.  /* The sq
a680: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
a690: 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79  Select() is only
a6a0: 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73   used n contexts
a6b0: 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65   where lookaside
a6c0: 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  .  ** is disable
a6d0: 64 2c 20 73 6f 20 77 65 20 6d 69 67 68 74 20 61  d, so we might a
a6e0: 73 20 77 65 6c 6c 20 68 61 72 64 2d 63 6f 64 65  s well hard-code
a6f0: 20 70 54 61 62 2d 3e 64 62 4d 65 6d 20 74 6f 20   pTab->dbMem to 
a700: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72  NULL. */.  asser
a710: 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
a720: 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a  .bEnabled==0 );.
a730: 20 20 70 54 61 62 2d 3e 64 62 4d 65 6d 20 3d 20    pTab->dbMem = 
a740: 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  0;.  pTab->nRef 
a750: 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  = 1;.  pTab->zNa
a760: 6d 65 20 3d 20 30 3b 0a 20 20 73 65 6c 65 63 74  me = 0;.  select
a770: 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
a780: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
a790: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  ect->pEList, &pT
a7a0: 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
a7b0: 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74  >aCol);.  select
a7c0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
a7d0: 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
a7e0: 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54  , pTab->nCol, pT
a7f0: 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 65 63  ab->aCol, pSelec
a800: 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65  t);.  pTab->iPKe
a810: 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62  y = -1;.  if( db
a820: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a830: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  {.    sqlite3Del
a840: 65 74 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a  eteTable(pTab);.
a850: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a860: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
a870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
a880: 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
a890: 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
a8a0: 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
a8b0: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
a8c0: 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
a8d0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
a8e0: 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
a8f0: 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
a900: 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
a910: 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
a920: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
a930: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a940: 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d  >pVdbe;.  if( v=
a950: 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50  =0 ){.    v = pP
a960: 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71  arse->pVdbe = sq
a970: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
a980: 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66  pParse->db);.#if
a990: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a9a0: 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 76  _TRACE.    if( v
a9b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a9c0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
a9d0: 50 5f 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a  P_Trace);.    }.
a9e0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74  #endif.  }.  ret
a9f0: 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn v;.}.../*.**
aa00: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69   Compute the iLi
aa10: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
aa20: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45  fields of the SE
aa30: 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68  LECT based on th
aa40: 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20  e.** pLimit and 
aa50: 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69  pOffset expressi
aa60: 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64  ons.  pLimit and
aa70: 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68   pOffset hold th
aa80: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  e expressions.**
aa90: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
aaa0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
aab0: 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
aac0: 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
aad0: 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
aae0: 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74  s.  Or NULL if t
aaf0: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72  hose keywords ar
ab00: 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69  e omitted. iLimi
ab10: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a  t and iOffset .*
ab20: 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  * are the intege
ab30: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
ab40: 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f  r numbers for co
ab50: 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
ab60: 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c  ompute .** the l
ab70: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e  imit and offset.
ab80: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
ab90: 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66   limit and/or of
aba0: 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69  fset, then .** i
abb0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
abc0: 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
abd0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
abe0: 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76  ne changes the v
abf0: 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20  alues of iLimit 
ac00: 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79  and iOffset only
ac10: 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f   if.** a limit o
ac20: 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69  r offset is defi
ac30: 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e  ned by pLimit an
ac40: 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d  d pOffset.  iLim
ac50: 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65  it and.** iOffse
ac60: 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  t should have be
ac70: 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70  en preset to app
ac80: 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74  ropriate default
ac90: 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61   values.** (usua
aca0: 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61  lly but not alwa
acb0: 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20  ys -1) prior to 
acc0: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
acd0: 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66  tine..** Only if
ace0: 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f   pLimit!=0 or pO
acf0: 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20  ffset!=0 do the 
ad00: 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
ad10: 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64  get.** redefined
ad20: 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  .  The UNION ALL
ad30: 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74   operator uses t
ad40: 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20  his property to 
ad50: 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75  force.** the reu
ad60: 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c  se of the same l
ad70: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20  imit and offset 
ad80: 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73  registers across
ad90: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c   multiple.** SEL
ada0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
adb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
adc0: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
add0: 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  ters(Parse *pPar
ade0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
adf0: 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64  nt iBreak){.  Vd
ae00: 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74  be *v = 0;.  int
ae10: 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69   iLimit = 0;.  i
ae20: 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e  nt iOffset;.  in
ae30: 74 20 61 64 64 72 31 3b 0a 20 20 69 66 28 20 70  t addr1;.  if( p
ae40: 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->iLimit ) retur
ae50: 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22  n;..  /* .  ** "
ae60: 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73  LIMIT -1" always
ae70: 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e   shows all rows.
ae80: 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a    There is some.
ae90: 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79    ** contraversy
aea0: 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20   about what the 
aeb0: 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
aec0: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a   should be..  **
aed0: 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
aee0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65  lementation inte
aef0: 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22  rprets "LIMIT 0"
af00: 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f   to mean.  ** no
af10: 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71   rows..  */.  sq
af20: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
af30: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61  ear(pParse);.  a
af40: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
af50: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69  t==0 || p->pLimi
af60: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  t!=0 );.  if( p-
af70: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
af80: 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  ->iLimit = iLimi
af90: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
afa0: 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  em;.    v = sqli
afb0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
afc0: 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  e);.    if( NEVE
afd0: 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
afe0: 3b 20 20 2f 2a 20 56 44 42 45 20 73 68 6f 75 6c  ;  /* VDBE shoul
aff0: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
b000: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
b010: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
b020: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
b030: 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b  pLimit, iLimit);
b040: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b050: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
b060: 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b  tBeInt, iLimit);
b070: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
b080: 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
b090: 74 65 72 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  ter"));.    sqli
b0a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b0b0: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d   OP_IfZero, iLim
b0c0: 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  it, iBreak);.   
b0d0: 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20   if( p->pOffset 
b0e0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  ){.      p->iOff
b0f0: 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20  set = iOffset = 
b100: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
b110: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
b120: 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63  em++;   /* Alloc
b130: 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67  ate an extra reg
b140: 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b  ister for limit+
b150: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  offset */.      
b160: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
b170: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73  pParse, p->pOffs
b180: 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  et, iOffset);.  
b190: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b1a0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
b1b0: 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b  BeInt, iOffset);
b1c0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
b1d0: 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63  nt((v, "OFFSET c
b1e0: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
b1f0: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
b200: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
b210: 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 29  _IfPos, iOffset)
b220: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b230: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b240: 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66 66  Integer, 0, iOff
b250: 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
b260: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
b270: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20  v, addr1);.     
b280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b290: 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c  p3(v, OP_Add, iL
b2a0: 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69  imit, iOffset, i
b2b0: 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20  Offset+1);.     
b2c0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
b2d0: 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29   "LIMIT+OFFSET")
b2e0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
b2f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b300: 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
b310: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73  iLimit);.      s
b320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b330: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
b340: 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a  -1, iOffset+1);.
b350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b360: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
b370: 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  r1);.    }.  }.}
b380: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b390: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
b3a0: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ELECT./*.** Retu
b3b0: 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
b3c0: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
b3d0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43  uence for the iC
b3e0: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a  ol-th column of.
b3f0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
b400: 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  t for the compou
b410: 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd-select statem
b420: 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e  ent "p".  Return
b430: 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20   NULL if.** the 
b440: 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65  column has no de
b450: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
b460: 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
b470: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
b480: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63  quence for the c
b490: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69  ompound select i
b4a0: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
b4b0: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  .** left-most te
b4c0: 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  rm of the select
b4d0: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c   that has a coll
b4e0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
b4f0: 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65  */.static CollSe
b500: 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f  q *multiSelectCo
b510: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
b520: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
b530: 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c  int iCol){.  Col
b540: 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66  lSeq *pRet;.  if
b550: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
b560: 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53     pRet = multiS
b570: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
b580: 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  rse, p->pPrior, 
b590: 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol);.  }else{.
b5a0: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
b5b0: 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  }.  assert( iCol
b5c0: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 65  >=0 );.  if( pRe
b5d0: 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e  t==0 && iCol<p->
b5e0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
b5f0: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
b600: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
b610: 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
b620: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29  ->a[iCol].pExpr)
b630: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
b640: 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Ret;.}.#endif /*
b650: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
b660: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
b670: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
b680: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
b690: 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
b6a0: 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
b6b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
b6c0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
b6d0: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
b6e0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
b6f0: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
b700: 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
b710: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
b720: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
b730: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
b740: 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
b750: 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64  ts */.);...#ifnd
b760: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
b770: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
b780: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b790: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
b7a0: 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e  rocess a compoun
b7b0: 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f  d query form fro
b7c0: 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65  m.** two or more
b7d0: 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65   separate querie
b7e0: 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55  s using UNION, U
b7f0: 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54  NION ALL, EXCEPT
b800: 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43  , or.** INTERSEC
b810: 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e  T.**.** "p" poin
b820: 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ts to the right-
b830: 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20  most of the two 
b840: 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75  queries.  the qu
b850: 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65  ery on the.** le
b860: 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e  ft is p->pPrior.
b870: 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79    The left query
b880: 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61   could also be a
b890: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a   compound query.
b8a0: 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  ** in which case
b8b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
b8c0: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63  ll be called rec
b8d0: 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a  ursively. .**.**
b8e0: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
b8f0: 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
b900: 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  are to be writte
b910: 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61  n into a destina
b920: 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20  tion.** of type 
b930: 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d  eDest with param
b940: 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  eter iParm..**.*
b950: 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f  * Example 1:  Co
b960: 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77  nsider a three-w
b970: 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20  ay compound SQL 
b980: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
b990: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
b9a0: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
b9b0: 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT b FROM t2 UNI
b9c0: 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  ON SELECT c FROM
b9d0: 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73   t3.**.** This s
b9e0: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
b9f0: 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73  ed up as follows
ba00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
ba10: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20  CT c FROM t3.** 
ba20: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60       |.**      `
ba30: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62  ----->  SELECT b
ba40: 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20   FROM t2.**     
ba50: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60                 `
ba70: 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  ------>  SELECT 
ba80: 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20  a FROM t1.**.** 
ba90: 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68  The arrows in th
baa0: 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20  e diagram above 
bab0: 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65  represent the Se
bac0: 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e  lect.pPrior poin
bad0: 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68  ter..** So if th
bae0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
baf0: 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61  lled with p equa
bb00: 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72  l to the t3 quer
bb10: 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f  y, then.** pPrio
bb20: 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32  r will be the t2
bb30: 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77   query.  p->op w
bb40: 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20  ill be TK_UNION 
bb50: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
bb60: 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20  .** Notice that 
bb70: 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
bb80: 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73  ay SQLite parses
bb90: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
bba0: 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  s, the.** indivi
bbb0: 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77  dual selects alw
bbc0: 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c  ays group from l
bbd0: 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f  eft to right..*/
bbe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
bbf0: 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  iSelect(.  Parse
bc00: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
bc10: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
bc20: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
bc30: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
bc40: 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
bc50: 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
bc60: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
bc70: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
bc80: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
bc90: 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
bca0: 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
bcb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
bcc0: 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64    /* Success cod
bcd0: 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74  e from a subrout
bce0: 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ine */.  Select 
bcf0: 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
bd00: 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
bd10: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
bd20: 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
bd30: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
bd40: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
bd50: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
bd60: 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
bd70: 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20  t dest;      /* 
bd80: 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61  Alternative data
bd90: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
bda0: 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74    Select *pDelet
bdb0: 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e  e = 0;  /* Chain
bdc0: 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63   of simple selec
bdd0: 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ts to delete */.
bde0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
bdf0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
be00: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
be10: 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  /..  /* Make sur
be20: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
be30: 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
be40: 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
be50: 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
be60: 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
be70: 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
be80: 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
be90: 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
bea0: 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
beb0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26  */.  assert( p &
bec0: 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20  & p->pPrior );  
bed0: 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74  /* Calling funct
bee0: 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74  ion guarantees t
bef0: 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64 62  his much */.  db
bf00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
bf10: 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
bf20: 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
bf30: 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
bf40: 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61  t!=pPrior );.  a
bf50: 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
bf60: 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52  Rightmost==p->pR
bf70: 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65  ightmost );.  de
bf80: 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69  st = *pDest;.  i
bf90: 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  f( pPrior->pOrde
bfa0: 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
bfb0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
bfc0: 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  e,"ORDER BY clau
bfd0: 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
bfe0: 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
bff0: 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
c000: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
c010: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
c020: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
c030: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  ct_end;.  }.  if
c040: 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
c050: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
c060: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
c070: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f  LIMIT clause sho
c080: 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
c090: 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
c0a0: 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
c0b0: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
c0c0: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
c0d0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c0e0: 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c  ;.  }..  v = sql
c0f0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
c100: 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
c110: 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56  !=0 );  /* The V
c120: 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61  DBE already crea
c130: 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66  ted by calling f
c140: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  unction */..  /*
c150: 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74   Create the dest
c160: 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72  ination temporar
c170: 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73  y table if neces
c180: 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sary.  */.  if( 
c190: 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
c1a0: 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
c1b0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
c1c0: 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
c1d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c1e0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
c1f0: 64 65 73 74 2e 69 50 61 72 6d 2c 20 70 2d 3e 70  dest.iParm, p->p
c200: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
c210: 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
c220: 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
c230: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
c240: 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68  ll SELECTs in th
c250: 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65  e statement have
c260: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
c270: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a   of elements.  *
c280: 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c  * in their resul
c290: 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61  t sets..  */.  a
c2a0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
c2b0: 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
c2c0: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
c2d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
c2e0: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
c2f0: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
c300: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
c310: 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
c320: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
c330: 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22  t of %s".      "
c340: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
c350: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
c360: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
c370: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
c380: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
c390: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
c3a0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c3b0: 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64  }..  /* Compound
c3c0: 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61   SELECTs that ha
c3d0: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ve an ORDER BY c
c3e0: 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65  lause are handle
c3f0: 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20  d separately..  
c400: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  */.  if( p->pOrd
c410: 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  erBy ){.    retu
c420: 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  rn multiSelectOr
c430: 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
c440: 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pDest);.  }..  
c450: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
c460: 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e   for the left an
c470: 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73  d right SELECT s
c480: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
c490: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
c4a0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
c4b0: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
c4c0: 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
c4d0: 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
c4e0: 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20  >pLimit );.     
c4f0: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
c500: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
c510: 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73     pPrior->pOffs
c520: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
c530: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c540: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
c550: 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
c560: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
c570: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
c580: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
c590: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
c5a0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
c5b0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
c5c0: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
c5d0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
c5e0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
c5f0: 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
c600: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
c610: 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
c620: 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
c630: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  it ){.        ad
c640: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
c650: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a  AddOp1(v, OP_IfZ
c660: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b  ero, p->iLimit);
c670: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
c680: 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61  ment((v, "Jump a
c690: 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
c6a0: 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
c6b0: 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
c6c0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
c6d0: 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
c6e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
c6f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
c700: 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
c710: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
c720: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
c730: 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64  or;.      if( ad
c740: 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dr ){.        sq
c750: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c760: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
c770: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
c780: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c790: 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63  TK_EXCEPT:.    c
c7a0: 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a  ase TK_UNION: {.
c7b0: 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54        int unionT
c7c0: 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ab;    /* Cursor
c7d0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
c7e0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68  emporary table h
c7f0: 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
c800: 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30  .      u8 op = 0
c810: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  ;       /* One o
c820: 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61  f the SRT_ opera
c830: 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74  tions to apply t
c840: 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20  o self */.      
c850: 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
c860: 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
c870: 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
c880: 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
c890: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
c8a0: 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74  pLimit, *pOffset
c8b0: 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65  ; /* Saved value
c8c0: 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61  s of p->nLimit a
c8d0: 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f  nd p->nOffset */
c8e0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
c8f0: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
c900: 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20  t uniondest;..  
c910: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
c920: 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
c930: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
c940: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
c950: 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72  N );.      prior
c960: 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  Op = SRT_Union;.
c970: 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
c980: 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26  Dest==priorOp &&
c990: 20 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c 69 6d   ALWAYS(!p->pLim
c9a0: 69 74 20 26 26 21 70 2d 3e 70 4f 66 66 73 65 74  it &&!p->pOffset
c9b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
c9c0: 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74  We can reuse a t
c9d0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67  emporary table g
c9e0: 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45  enerated by a SE
c9f0: 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20  LECT to our.    
ca00: 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
ca10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
ca20: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
ca30: 68 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20 2f 2a  htmost!=p );  /*
ca40: 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   Can only happen
ca50: 20 66 6f 72 20 6c 65 66 74 77 61 72 64 20 65 6c   for leftward el
ca60: 65 6d 65 6e 74 73 0a 20 20 20 20 20 20 20 20 20  ements.         
ca70: 20 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 2a 2a 20 6f              ** o
ca90: 66 20 61 20 33 2d 77 61 79 20 6f 72 20 6d 6f 72  f a 3-way or mor
caa0: 65 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20  e compound */.  
cab0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
cac0: 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20  >pLimit==0 );   
cad0: 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65     /* Not allowe
cae0: 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c  d on leftward el
caf0: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ements */.      
cb00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
cb10: 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f  fset==0 );     /
cb20: 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
cb30: 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
cb40: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e  ts */.        un
cb50: 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 50  ionTab = dest.iP
cb60: 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  arm;.      }else
cb70: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
cb80: 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65  will need to cre
cb90: 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70  ate our own temp
cba0: 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68  orary table to h
cbb0: 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  old the.        
cbc0: 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
cbd0: 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20  results..       
cbe0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
cbf0: 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
cc00: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Tab++;.        a
cc10: 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
cc20: 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
cc30: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
cc40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cc50: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
cc60: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
cc70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
cc80: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
cc90: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
cca0: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
ccb0: 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
ccc0: 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
ccd0: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  t->selFlags |= S
cce0: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
ccf0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
cd00: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
cd10: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
cd20: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
cd30: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
cd40: 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
cd50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
cd60: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
cd70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
cd80: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
cd90: 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72  uniondest, prior
cda0: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20  Op, unionTab);. 
cdb0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cdc0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
cdd0: 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65  pPrior, &unionde
cde0: 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
cdf0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
ce00: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
ce10: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
ce20: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
ce30: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
ce40: 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f  atement.      */
ce50: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  .      if( p->op
ce60: 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20  ==TK_EXCEPT ){. 
ce70: 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f         op = SRT_
ce80: 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65  Except;.      }e
ce90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
cea0: 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ert( p->op==TK_U
ceb0: 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  NION );.        
cec0: 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  op = SRT_Union;.
ced0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
cee0: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
cef0: 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
cf00: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
cf10: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
cf20: 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
cf30: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
cf40: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
cf50: 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44      uniondest.eD
cf60: 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20  est = op;.      
cf70: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
cf80: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75  ct(pParse, p, &u
cf90: 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
cfa0: 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
cfb0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
cfc0: 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74    /* Query flatt
cfd0: 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33  ening in sqlite3
cfe0: 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72  Select() might r
cff0: 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42  efill p->pOrderB
d000: 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73  y..      ** Be s
d010: 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d  ure to delete p-
d020: 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65  >pOrderBy, there
d030: 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61  fore, to avoid a
d040: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f   memory leak. */
d050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
d060: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
d070: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
d080: 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
d090: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
d0a0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
d0b0: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  or;.      p->pOr
d0c0: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
d0d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
d0e0: 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
d0f0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
d100: 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
d110: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
d120: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
d130: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
d140: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
d150: 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   0;..      /* Co
d160: 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
d170: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
d180: 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
d190: 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  ver form.      *
d1a0: 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20  * it is that we 
d1b0: 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a  currently need..
d1c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
d1d0: 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d  ssert( unionTab=
d1e0: 3d 64 65 73 74 2e 69 50 61 72 6d 20 7c 7c 20 64  =dest.iParm || d
d1f0: 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
d200: 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Op );.      if( 
d210: 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
d220: 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rOp ){.        i
d230: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
d240: 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
d250: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
d260: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
d270: 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
d280: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
d290: 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
d2a0: 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
d2b0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
d2c0: 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
d2d0: 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
d2e0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rior;.          
d2f0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
d300: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
d310: 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
d320: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d330: 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
d340: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d350: 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
d360: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
d370: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
d380: 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
d390: 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
d3a0: 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
d3b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d3c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
d3d0: 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
d3e0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
d3f0: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
d400: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
d410: 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65  r(v);.        se
d420: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
d430: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
d440: 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d  st, unionTab, p-
d450: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
d460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d470: 20 20 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26          0, -1, &
d480: 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
d490: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
d4a0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d4b0: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
d4c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d4d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d4e0: 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  _Next, unionTab,
d4f0: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
d500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
d510: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
d520: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
d530: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d540: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
d550: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
d560: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
d570: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
d580: 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  t: assert( p->op
d590: 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
d5a0: 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  ; {.      int ta
d5b0: 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
d5c0: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
d5d0: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
d5e0: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
d5f0: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
d600: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
d610: 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73  electDest inters
d620: 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69  ectdest;.      i
d630: 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a  nt r1;..      /*
d640: 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
d650: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
d660: 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
d670: 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
d680: 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
d690: 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
d6a0: 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
d6b0: 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
d6c0: 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
d6d0: 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
d6e0: 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
d6f0: 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
d700: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
d710: 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
d720: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
d730: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
d740: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a  pOrderBy==0 );..
d750: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
d760: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d770: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
d780: 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
d790: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
d7a0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
d7b0: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
d7c0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
d7d0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
d7e0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65  ->pRightmost->se
d7f0: 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
d800: 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
d810: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
d820: 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
d830: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
d840: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
d850: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
d860: 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
d870: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
d880: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
d890: 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
d8a0: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
d8b0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d8c0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
d8d0: 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65  e, pPrior, &inte
d8e0: 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
d8f0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
d900: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
d910: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
d920: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
d930: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
d940: 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72  LECT into tempor
d950: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22  ary table "tab2"
d960: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
d970: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
d980: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
d990: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
d9a0: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b2, 0);.      as
d9b0: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
d9c0: 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29  nEphm[1] == -1 )
d9d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
d9e0: 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64  penEphm[1] = add
d9f0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
da00: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
da10: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
da20: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
da30: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
da40: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
da50: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
da60: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
da70: 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 50 61  ntersectdest.iPa
da80: 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20  rm = tab2;.     
da90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
daa0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
dab0: 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
dac0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
dad0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
dae0: 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
daf0: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
db00: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
db10: 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rior;.      sqli
db20: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
db30: 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
db40: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
db50: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
db60: 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
db70: 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  et;..      /* Ge
db80: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
db90: 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
dba0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
dbb0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
dbc0: 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
dbd0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
dbe0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
dbf0: 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
dc00: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
dc10: 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  ){.        Selec
dc20: 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  t *pFirst = p;. 
dc30: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
dc40: 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
dc50: 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
dc60: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
dc70: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
dc80: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
dc90: 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
dca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42        }.      iB
dcb0: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
dcc0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
dcd0: 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
dce0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
dcf0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d  el(v);.      com
dd00: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
dd10: 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
dd20: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
dd30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
dd40: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62  , OP_Rewind, tab
dd50: 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  1, iBreak);.    
dd60: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
dd70: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
dd80: 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  ;.      iStart =
dd90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dda0: 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c  p2(v, OP_RowKey,
ddb0: 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20   tab1, r1);.    
ddc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ddd0: 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Op3(v, OP_NotFou
dde0: 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c  nd, tab2, iCont,
ddf0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
de00: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
de10: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
de20: 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
de30: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
de40: 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c  p->pEList, tab1,
de50: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
de60: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
de70: 20 20 20 20 20 20 20 20 20 30 2c 20 2d 31 2c 20           0, -1, 
de80: 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
de90: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
dea0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
deb0: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
dec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ded0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
dee0: 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
def0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
df00: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
df10: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
df20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
df30: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
df40: 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
df50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
df60: 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
df70: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
df80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
df90: 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
dfa0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
dfb0: 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a  ces used by .  *
dfc0: 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
dfd0: 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
dfe0: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
dff0: 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
e000: 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
e010: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
e020: 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
e030: 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
e040: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
e050: 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
e060: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
e070: 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
e080: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
e090: 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
e0a0: 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
e0b0: 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
e0c0: 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
e0d0: 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
e0e0: 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
e0f0: 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
e100: 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
e110: 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
e120: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
e130: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
e140: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
e150: 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20  sEphemeral ){.  
e160: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
e190: 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
e1a0: 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20  pKeyInfo;       
e1b0: 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
e1c0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
e1d0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
e1e0: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f  .    Select *pLo
e1f0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
e200: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
e210: 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54  g through SELECT
e220: 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
e230: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43     CollSeq **apC
e240: 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
e250: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
e260: 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f  through pKeyInfo
e270: 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20  ->aColl[] */.   
e280: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e2a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
e2b0: 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
e2c0: 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  t */..    assert
e2d0: 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
e2e0: 3d 70 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d  =p );.    nCol =
e2f0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
e300: 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  r;.    pKeyInfo 
e310: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
e320: 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20  cZero(db,.      
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e340: 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66   sizeof(*pKeyInf
e350: 6f 29 2b 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28  o)+nCol*(sizeof(
e360: 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b  CollSeq*) + 1));
e370: 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
e380: 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
e390: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e3a0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
e3b0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
e3c0: 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  }..    pKeyInfo-
e3d0: 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  >enc = ENC(db);.
e3e0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46      pKeyInfo->nF
e3f0: 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c  ield = (u16)nCol
e400: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  ;..    for(i=0, 
e410: 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
e420: 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
e430: 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
e440: 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
e450: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
e460: 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
e470: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
e480: 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
e490: 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e    *apColl = db->
e4a0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
e4b0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
e4c0: 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
e4d0: 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
e4e0: 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
e4f0: 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
e500: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
e510: 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
e520: 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20  OpenEphm[i];.   
e530: 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
e540: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
e550: 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
e560: 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
e570: 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
e580: 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
e590: 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
e5a0: 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
e5b0: 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
e5c0: 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
e5d0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
e5e0: 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
e5f0: 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b  OpenEphm[1]<0 );
e600: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
e610: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e630: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
e640: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
e650: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
e660: 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP4(v, addr, (ch
e670: 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
e680: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
e690: 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70     pLoop->addrOp
e6a0: 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a  enEphm[i] = -1;.
e6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e6c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e6d0: 64 62 2c 20 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  db, pKeyInfo);. 
e6e0: 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
e6f0: 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69  _end:.  pDest->i
e700: 4d 65 6d 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b  Mem = dest.iMem;
e710: 0a 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d  .  pDest->nMem =
e720: 20 64 65 73 74 2e 6e 4d 65 6d 3b 0a 20 20 73 71   dest.nMem;.  sq
e730: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
e740: 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a  e(db, pDelete);.
e750: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
e760: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
e770: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
e780: 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  LECT */../*.** C
e790: 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75  ode an output su
e7a0: 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63  broutine for a c
e7b0: 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65  oroutine impleme
e7c0: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20  ntation of a.** 
e7d0: 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e  SELECT statment.
e7e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20  .**.** The data 
e7f0: 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20  to be output is 
e800: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e  contained in pIn
e810: 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 72 65 20 61  ->iMem.  There a
e820: 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 4d 65 6d 20  re.** pIn->nMem 
e830: 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75  columns to be ou
e840: 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73 20  tput.  pDest is 
e850: 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75 74  where the output
e860: 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
e870: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74  nt..**.** regRet
e880: 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  urn is the numbe
e890: 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74 65  r of the registe
e8a0: 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75  r holding the su
e8b0: 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75  broutine.** retu
e8c0: 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a  rn address..**.*
e8d0: 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74  * If regPrev>0 t
e8e0: 68 65 6e 20 69 74 20 69 73 20 61 20 74 68 65 20  hen it is a the 
e8f0: 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69  first register i
e900: 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a  n a vector that.
e910: 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70  ** records the p
e920: 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20  revious output. 
e930: 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73   mem[regPrev] is
e940: 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20   a flag that is 
e950: 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72  false.** if ther
e960: 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72  e has been no pr
e970: 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
e980: 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
e990: 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e  n code is.** gen
e9a0: 65 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65  erated to suppre
e9b0: 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20  ss duplicates.  
e9c0: 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64  pKeyInfo is used
e9d0: 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a   for comparing.*
e9e0: 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  * keys..**.** If
e9f0: 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64   the LIMIT found
ea00: 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73   in p->iLimit is
ea10: 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69   reached, jump i
ea20: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a  mmediately to.**
ea30: 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74   iBreak..*/.stat
ea40: 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f  ic int generateO
ea50: 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
ea60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ea70: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
ea80: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
ea90: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
eaa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
eab0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
eac0: 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  nt */.  SelectDe
ead0: 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20  st *pIn,        
eae0: 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70  /* Coroutine sup
eaf0: 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  plying data */. 
eb00: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
eb10: 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72  st,      /* Wher
eb20: 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61  e to send the da
eb30: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ta */.  int regR
eb40: 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20  eturn,          
eb50: 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64  /* The return ad
eb60: 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a  dress register *
eb70: 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c  /.  int regPrev,
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
eb90: 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72  revious result r
eba0: 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69  egister.  No uni
ebb0: 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a  queness if 0 */.
ebc0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
ebd0: 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72  nfo,      /* For
ebe0: 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20   comparing with 
ebf0: 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a  previous entry *
ec00: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 2c 20  /.  int p4type, 
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ec20: 68 65 20 70 34 20 74 79 70 65 20 66 6f 72 20 70  he p4 type for p
ec30: 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74  KeyInfo */.  int
ec40: 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
ec50: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
ec60: 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20  e if we hit the 
ec70: 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64  LIMIT */.){.  Vd
ec80: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
ec90: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f  pVdbe;.  int iCo
eca0: 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64  ntinue;.  int ad
ecb0: 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71  dr;..  addr = sq
ecc0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
ecd0: 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74  Addr(v);.  iCont
ece0: 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
ecf0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
ed00: 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64  .  /* Suppress d
ed10: 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e  uplicates for UN
ed20: 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
ed30: 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f   INTERSECT .  */
ed40: 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29  .  if( regPrev )
ed50: 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32  {.    int j1, j2
ed60: 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74  ;.    j1 = sqlit
ed70: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
ed80: 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65  OP_IfNot, regPre
ed90: 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c  v);.    j2 = sql
eda0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
edb0: 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49  , OP_Compare, pI
edc0: 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76  n->iMem, regPrev
edd0: 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20  +1, pIn->nMem,. 
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
ee00: 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70 34  ar*)pKeyInfo, p4
ee10: 74 79 70 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  type);.    sqlit
ee20: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ee30: 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69  OP_Jump, j2+2, i
ee40: 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b  Continue, j2+2);
ee50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ee60: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
ee70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
ee80: 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c  CodeCopy(pParse,
ee90: 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50   pIn->iMem, regP
eea0: 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  rev+1, pIn->nMem
eeb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
eec0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
eed0: 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72  nteger, 1, regPr
eee0: 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ev);.  }.  if( p
eef0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
ef00: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
ef10: 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65   0;..  /* Suppre
ef20: 73 73 20 74 68 65 20 74 68 65 20 66 69 72 73 74  ss the the first
ef30: 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20   OFFSET entries 
ef40: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
ef50: 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a  FFSET clause.  *
ef60: 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  /.  codeOffset(v
ef70: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , p, iContinue);
ef80: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ..  switch( pDes
ef90: 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
efa0: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
efb0: 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
efc0: 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
efd0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
efe0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
eff0: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
f000: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
f010: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
f020: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
f030: 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
f040: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
f050: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65  Parse);.      te
f060: 73 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65  stcase( pDest->e
f070: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
f080: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f090: 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  e( pDest->eDest=
f0a0: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
f0b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f0c0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
f0d0: 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
f0e0: 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c  iMem, pIn->nMem,
f0f0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
f100: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f110: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44   OP_NewRowid, pD
f120: 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 32 29 3b  est->iParm, r2);
f130: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f140: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
f150: 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50  nsert, pDest->iP
f160: 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
f170: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
f180: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
f190: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
f1a0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
f1b0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
f1c0: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
f1d0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
f1e0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
f1f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f200: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f210: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
f220: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
f230: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
f240: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
f250: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
f260: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
f270: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
f280: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
f290: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
f2a0: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
f2b0: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
f2c0: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
f2d0: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
f2e0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
f2f0: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
f300: 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r1;.      assert
f310: 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29  ( pIn->nMem==1 )
f320: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e  ;.      p->affin
f330: 69 74 79 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ity = .         
f340: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
f350: 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74  finity(p->pEList
f360: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
f370: 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a  est->affinity);.
f380: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
f390: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
f3a0: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
f3b0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
f3c0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
f3d0: 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72 31  pIn->iMem, 1, r1
f3e0: 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20  , &p->affinity, 
f3f0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
f400: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
f410: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
f420: 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a   pIn->iMem, 1);.
f430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f440: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
f450: 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  xInsert, pDest->
f460: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
f470: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
f480: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
f490: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
f4a0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20  ;.    }..#if 0  
f4b0: 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20  /* Never occurs 
f4c0: 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71  on an ORDER BY q
f4d0: 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  uery */.    /* I
f4e0: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
f4f0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
f500: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
f510: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
f520: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
f530: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
f540: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f550: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
f560: 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 50  er, 1, pDest->iP
f570: 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  arm);.      /* T
f580: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
f590: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
f5a0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
f5b0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
f5c0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
f5d0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
f5e0: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
f5f0: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
f600: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
f610: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
f620: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
f630: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
f640: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
f650: 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
f660: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
f670: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
f680: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
f690: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
f6a0: 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nMem==1 );.     
f6b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f6c0: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
f6d0: 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69  ->iMem, pDest->i
f6e0: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
f6f0: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
f700: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
f710: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
f720: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
f730: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
f740: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
f750: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
f760: 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65  Y */..    /* The
f770: 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
f780: 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
f790: 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  e of registers. 
f7a0: 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
f7b0: 74 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2e 20 20  t pDest->iMem.  
f7c0: 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74  Then the co-rout
f7d0: 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20  ine yields..    
f7e0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
f7f0: 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  Coroutine: {.   
f800: 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d     if( pDest->iM
f810: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  em==0 ){.       
f820: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73   pDest->iMem = s
f830: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
f840: 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
f850: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70  nMem);.        p
f860: 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e  Dest->nMem = pIn
f870: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->nMem;.      }.
f880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f890: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
f8a0: 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65  , pIn->iMem, pDe
f8b0: 73 74 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d  st->iMem, pDest-
f8c0: 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71  >nMem);.      sq
f8d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
f8e0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
f8f0: 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20  st->iParm);.    
f900: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
f910: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f      /* If none o
f920: 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65  f the above, the
f930: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73  n the result des
f940: 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  tination must be
f950: 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70  .    ** SRT_Outp
f960: 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
f970: 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
f980: 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72  d with any other
f990: 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74  .    ** destinat
f9a0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
f9b0: 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20  he ones handled 
f9c0: 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74  above or SRT_Out
f9d0: 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  put..    **.    
f9e0: 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75  ** For SRT_Outpu
f9f0: 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  t, results are s
fa00: 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
fa10: 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
fa20: 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20  .  .    ** Then 
fa30: 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  the OP_ResultRow
fa40: 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
fa50: 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33  to cause sqlite3
fa60: 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a  _step() to.    *
fa70: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78  * return the nex
fa80: 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e  t row of result.
fa90: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
faa0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
fab0: 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
fac0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
fad0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fae0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
faf0: 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69  esultRow, pIn->i
fb00: 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b  Mem, pIn->nMem);
fb10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
fb20: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
fb30: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
fb40: 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d  n->iMem, pIn->nM
fb50: 65 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  em);.      break
fb60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
fb70: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
fb80: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
fb90: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
fba0: 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
fbb0: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
fbc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fbd0: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
fbe0: 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31  m, p->iLimit, -1
fbf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
fc00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
fc10: 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
fc20: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 0a  , iBreak);.  }..
fc30: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
fc40: 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
fc50: 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
fc60: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
fc70: 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
fc80: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
fc90: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
fca0: 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a  rn, regReturn);.
fcb0: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
fcc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61  }../*.** Alterna
fcd0: 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65  tive compound se
fce0: 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61  lect code genera
fcf0: 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68  tor for cases wh
fd00: 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  en there.** is a
fd10: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
fd20: 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  e..**.** We assu
fd30: 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  me a query of th
fd40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
fd50: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65  :.**.**      <se
fd60: 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f  lectA>  <operato
fd70: 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f  r>  <selectB>  O
fd80: 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79  RDER BY <orderby
fd90: 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65  list>.**.** <ope
fda0: 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66  rator> is one of
fdb0: 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f   UNION ALL, UNIO
fdc0: 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
fdd0: 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64  TERSECT.  The id
fde0: 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65  ea.** is to code
fdf0: 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20   both <selectA> 
fe00: 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69  and <selectB> wi
fe10: 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
fe20: 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d  clause as.** co-
fe30: 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20  routines.  Then 
fe40: 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  run the co-routi
fe50: 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20  nes in parallel 
fe60: 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65  and merge the re
fe70: 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68  sults.** into th
fe80: 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64  e output.  In ad
fe90: 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77  dition to the tw
fea0: 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61  o coroutines (ca
feb0: 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64  lled selectA and
fec0: 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65  .** selectB) the
fed0: 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74  re are 7 subrout
fee0: 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  ines:.**.**    o
fef0: 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utA:    Move the
ff00: 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
ff10: 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65  electA coroutine
ff20: 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
ff30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ff40: 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
ff50: 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  query..**.**    
ff60: 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68  outB:    Move th
ff70: 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
ff80: 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e  selectB coroutin
ff90: 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
ffa0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
ffb0: 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
ffc0: 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67   query.  (Only g
ffd0: 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49  enerated for UNI
ffe0: 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ON and.**       
fff0: 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e        UNION ALL.
10000 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53    EXCEPT and INS
10010 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75  ERTSECT never ou
10020 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a  tput a row that.
10030 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61  **             a
10040 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42  ppears only in B
10050 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42  .).**.**    AltB
10060 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
10070 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
10080 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
10090 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a  nes and A<B..**.
100a0 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43  **    AeqB:    C
100b0 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
100c0 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
100d0 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
100e0 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  d A==B..**.**   
100f0 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AgtB:    Called
10100 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
10110 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
10120 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42  routines and A>B
10130 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  ..**.**    EofA:
10140 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
10150 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
10160 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a  d from selectA..
10170 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20  **.**    EofB:  
10180 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
10190 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
101a0 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a  from selectB..**
101b0 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
101c0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61  tation of the la
101d0 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75  tter five subrou
101e0 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20  tines depend on 
101f0 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61  which .** <opera
10200 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a  tor> is used:.**
10210 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
10220 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20     UNION ALL    
10230 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20       UNION      
10240 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20        EXCEPT    
10250 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a        INTERSECT.
10260 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  **          ----
10270 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
10280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
10290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
102a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
102b0 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74  **   AltB:   out
102c0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
102d0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
102e0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
102f0 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20      nextA.**.** 
10300 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20    AeqB:   outA, 
10310 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
10320 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20  xtA             
10330 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75  nextA         ou
10340 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20  tA, nextA.**.** 
10350 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20    AgtB:   outB, 
10360 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
10370 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
10380 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20  nextB           
10390 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45   nextB.**.**   E
103a0 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  ofA:   outB, nex
103b0 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
103c0 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c  xtB          hal
103d0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61  t             ha
103e0 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a  lt.**.**   EofB:
103f0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
10400 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
10410 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
10420 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a  A         halt.*
10430 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42  *.** In the AltB
10440 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42  , AeqB, and AgtB
10450 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e   subroutines, an
10460 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77   EOF on A follow
10470 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75  ing nextA.** cau
10480 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  ses an immediate
10490 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e   jump to EofA an
104a0 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f  d an EOF on B fo
104b0 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61  llowing nextB ca
104c0 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64  uses.** an immed
104d0 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
104e0 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20  B.  Within EofA 
104f0 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f  and EofB, and EO
10500 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a  F on entry or.**
10510 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58   following nextX
10520 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74   causes a jump t
10530 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
10540 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69   select processi
10550 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63  ng..**.** Duplic
10560 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74  ate removal in t
10570 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  he UNION, EXCEPT
10580 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20  , and INTERSECT 
10590 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64  cases is handled
105a0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f  .** within the o
105b0 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
105c0 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72  .  The regPrev r
105d0 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64  egister set hold
105e0 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  s the previously
105f0 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65  .** output value
10600 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20  .  A comparison 
10610 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20  is made against 
10620 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74  this value and t
10630 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20  he output.** is 
10640 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e  skipped if the n
10650 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c  ext results woul
10660 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  d be the same as
10670 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a   the previous..*
10680 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
10690 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20  ntation plan is 
106a0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
106b0 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
106c0 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62  and seven.** sub
106d0 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20  routines first, 
106e0 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e  then put the con
106f0 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68  trol logic at th
10700 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20  e bottom.  Like 
10710 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
10720 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a       goto Init.*
10730 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75  *     coA: corou
10740 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75  tine for left qu
10750 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63  ery (A).**     c
10760 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oB: coroutine fo
10770 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42  r right query (B
10780 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75  ).**    outA: ou
10790 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
107a0 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75  A.**    outB: ou
107b0 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
107c0 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49  B (UNION and UNI
107d0 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20  ON ALL only).** 
107e0 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20     EofA: ....** 
107f0 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20     EofB: ....** 
10800 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AltB: ....** 
10810 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20     AeqB: ....** 
10820 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AgtB: ....** 
10830 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c     Init: initial
10840 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65  ize coroutine re
10850 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20  gisters.**      
10860 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a      yield coA.**
10870 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
10880 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a  (A) goto EofA.**
10890 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
108a0 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coB.**          
108b0 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45  if eof(B) goto E
108c0 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20  ofB.**    Cmpr: 
108d0 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20  Compare A, B.** 
108e0 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c           Jump Al
108f0 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a  tB, AeqB, AgtB.*
10900 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a  *     End: ....*
10910 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74  *.** We call Alt
10920 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45  B, AeqB, AgtB, E
10930 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73  ofA, and EofB "s
10940 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20  ubroutines" but 
10950 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  they are not.** 
10960 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20  actually called 
10970 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20  using Gosub and 
10980 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75  they do not Retu
10990 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f  rn.  EofA and Eo
109a0 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c  fB loop.** until
109b0 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68   all data is exh
109c0 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70  austed then jump
109d0 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61   to the "end" la
109e0 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c  be.  AltB, AeqB,
109f0 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d  .** and AgtB jum
10a00 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f  p to either L2 o
10a10 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41  r to one of EofA
10a20 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66   or EofB..*/.#if
10a30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10a40 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
10a50 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
10a60 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
10a70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10a80 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
10a90 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
10aa0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
10ab0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
10ac0 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
10ad0 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
10ae0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
10af0 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
10b00 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
10b10 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
10b20 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
10b30 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
10b40 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53   counters */.  S
10b50 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
10b60 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
10b70 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
10b80 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
10b90 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
10ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
10bb0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
10bc0 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
10bd0 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20  ectDest destA;  
10be0 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
10bf0 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
10c00 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  A */.  SelectDes
10c10 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20  t destB;     /* 
10c20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
10c30 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20  coroutine B */. 
10c40 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20   int regAddrA;  
10c50 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
10c60 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
10c70 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
10c80 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f  e */.  int regEo
10c90 66 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fA;          /* 
10ca0 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65  Flag to indicate
10cb0 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 41 20 69   when select-A i
10cc0 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20  s complete */.  
10cd0 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20  int regAddrB;   
10ce0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10cf0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
10d00 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
10d10 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66   */.  int regEof
10d20 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  B;          /* F
10d30 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20  lag to indicate 
10d40 77 68 65 6e 20 73 65 6c 65 63 74 2d 42 20 69 73  when select-B is
10d50 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69   complete */.  i
10d60 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20  nt addrSelectA; 
10d70 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
10d80 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20  of the select-A 
10d90 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
10da0 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20  nt addrSelectB; 
10db0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
10dc0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20  of the select-B 
10dd0 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
10de0 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20  nt regOutA;     
10df0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
10e00 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
10e10 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
10e20 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
10e30 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20  gOutB;          
10e40 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
10e50 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
10e60 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
10e70 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
10e80 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
10e90 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
10ea0 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  put-A subroutine
10eb0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
10ec0 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41  tB = 0;     /* A
10ed0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
10ee0 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
10ef0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
10f00 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofA;         /* 
10f10 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
10f20 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65  elect-A-exhauste
10f30 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
10f40 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20    int addrEofB; 
10f50 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
10f60 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
10f70 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -B-exhausted sub
10f80 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10f90 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20   addrAltB;      
10fa0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
10fb0 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74   the A<B subrout
10fc0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
10fd0 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f  rAeqB;         /
10fe0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
10ff0 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65   A==B subroutine
11000 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67   */.  int addrAg
11010 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
11020 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e  ddress of the A>
11030 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
11040 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b    int regLimitA;
11050 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
11060 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
11070 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
11080 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20  regLimitB;      
11090 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
110a0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
110b0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
110c0 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  v;          /* A
110d0 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
110e0 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76  ers to hold prev
110f0 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20  ious output */. 
11100 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b   int savedLimit;
11110 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
11120 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d  value of p->iLim
11130 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  it */.  int save
11140 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  dOffset;      /*
11150 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20   Saved value of 
11160 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20  p->iOffset */.  
11170 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20  int labelCmpr;  
11180 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
11190 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  or the start of 
111a0 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69  the merge algori
111b0 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  thm */.  int lab
111c0 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f  elEnd;         /
111d0 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
111e0 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61  end of the overa
111f0 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a  ll SELECT stmt *
11200 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20  /.  int j1;     
11210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
11220 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74  p instructions t
11230 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65 74  hat get retarget
11240 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ted */.  int op;
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11260 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c  * One of TK_ALL,
11270 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
11280 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45  CEPT, TK_INTERSE
11290 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  CT */.  KeyInfo 
112a0 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a  *pKeyDup = 0; /*
112b0 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f   Comparison info
112c0 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c  rmation for dupl
112d0 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f  icate removal */
112e0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
112f0 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70  Merge;   /* Comp
11300 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
11310 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72  on for merging r
11320 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ows */.  sqlite3
11330 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f   *db;          /
11340 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
11350 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c  ction */.  ExprL
11360 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
11370 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
11380 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
11390 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
113a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
113b0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
113c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
113d0 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b    int *aPermute;
113e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69          /* Mappi
113f0 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59  ng from ORDER BY
11400 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74   terms to result
11410 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a   set columns */.
11420 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
11430 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61  rderBy!=0 );.  a
11440 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d  ssert( pKeyDup==
11450 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64  0 ); /* "Managed
11460 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69  " code needs thi
11470 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32  s.  Ticket #3382
11480 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  . */.  db = pPar
11490 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50  se->db;.  v = pP
114a0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
114b0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
114c0 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20       /* Already 
114d0 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72  thrown the error
114e0 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66   if VDBE alloc f
114f0 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c  ailed */.  label
11500 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
11510 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
11520 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c   labelCmpr = sql
11530 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
11540 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74  l(v);...  /* Pat
11550 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20  ch up the ORDER 
11560 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  BY clause.  */. 
11570 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20   op = p->op;  . 
11580 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
11590 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
115a0 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d  Prior->pOrderBy=
115b0 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79  =0 );.  pOrderBy
115c0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
115d0 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
115e0 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79  By );.  nOrderBy
115f0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
11600 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70  pr;..  /* For op
11610 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68  erators other th
11620 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20  an UNION ALL we 
11630 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  have to make sur
11640 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  e that.  ** the 
11650 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11660 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72  covers every ter
11670 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
11680 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74  set.  Add.  ** t
11690 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45  erms to the ORDE
116a0 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e  R BY clause as n
116b0 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
116c0 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20   if( op!=TK_ALL 
116d0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
116e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
116f0 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c  ==0 && i<=p->pEL
11700 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
11710 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
11720 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
11730 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  tem;.      for(j
11740 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
11750 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42  By->a; j<nOrderB
11760 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; j++, pItem++)
11770 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
11780 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20  ( pItem->iCol>0 
11790 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
117a0 49 74 65 6d 2d 3e 69 43 6f 6c 3d 3d 69 20 29 20  Item->iCol==i ) 
117b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
117c0 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64       if( j==nOrd
117d0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
117e0 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
117f0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
11800 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20  INTEGER, 0);.   
11810 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30       if( pNew==0
11820 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
11830 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
11840 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
11850 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
11860 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
11870 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  ue = i;.        
11880 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
11890 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
118a0 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
118b0 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  y, pNew);.      
118c0 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f    pOrderBy->a[nO
118d0 72 64 65 72 42 79 2b 2b 5d 2e 69 43 6f 6c 20 3d  rderBy++].iCol =
118e0 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d   (u16)i;.      }
118f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11900 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
11910 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74  parison permutat
11920 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20  ion and keyinfo 
11930 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74  that is used wit
11940 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75  h.  ** the permu
11950 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64  tation used to d
11960 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
11970 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  next.  ** row of
11980 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66   results comes f
11990 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73  rom selectA or s
119a0 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64  electB.  Also ad
119b0 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20  d explicit.  ** 
119c0 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68  collations to th
119d0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
119e0 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20  e terms so that 
119f0 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  when the subquer
11a00 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ies.  ** to the 
11a10 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65  right and the le
11a20 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ft are evaluated
11a30 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63  , they use the c
11a40 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c  orrect.  ** coll
11a50 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50  ation..  */.  aP
11a60 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33  ermute = sqlite3
11a70 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
11a80 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64  sizeof(int)*nOrd
11a90 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65  erBy);.  if( aPe
11aa0 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72  rmute ){.    str
11ab0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
11ac0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f  m *pItem;.    fo
11ad0 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=0, pItem=pOr
11ae0 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64  derBy->a; i<nOrd
11af0 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  erBy; i++, pItem
11b00 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
11b10 74 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30  t( pItem->iCol>0
11b20 20 20 26 26 20 70 49 74 65 6d 2d 3e 69 43 6f 6c    && pItem->iCol
11b30 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
11b40 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72  pr );.      aPer
11b50 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d  mute[i] = pItem-
11b60 3e 69 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d  >iCol - 1;.    }
11b70 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
11b80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
11b90 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
11ba0 7a 65 6f 66 28 2a 70 4b 65 79 4d 65 72 67 65 29  zeof(*pKeyMerge)
11bb0 2b 6e 4f 72 64 65 72 42 79 2a 28 73 69 7a 65 6f  +nOrderBy*(sizeo
11bc0 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b  f(CollSeq*)+1));
11bd0 0a 20 20 20 20 69 66 28 20 70 4b 65 79 4d 65 72  .    if( pKeyMer
11be0 67 65 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79  ge ){.      pKey
11bf0 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65  Merge->aSortOrde
11c00 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 4d 65  r = (u8*)&pKeyMe
11c10 72 67 65 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65  rge->aColl[nOrde
11c20 72 42 79 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79  rBy];.      pKey
11c30 4d 65 72 67 65 2d 3e 6e 46 69 65 6c 64 20 3d 20  Merge->nField = 
11c40 28 75 31 36 29 6e 4f 72 64 65 72 42 79 3b 0a 20  (u16)nOrderBy;. 
11c50 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e       pKeyMerge->
11c60 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
11c70 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11c80 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
11c90 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
11ca0 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
11cb0 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f  Expr *pTerm = pO
11cc0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
11cd0 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
11ce0 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45  pTerm->flags & E
11cf0 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a  P_ExpCollate ){.
11d00 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
11d10 3d 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a  = pTerm->pColl;.
11d20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
11d30 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
11d40 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
11d50 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 61  Seq(pParse, p, a
11d60 50 65 72 6d 75 74 65 5b 69 5d 29 3b 0a 20 20 20  Permute[i]);.   
11d70 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c         pTerm->fl
11d80 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c  ags |= EP_ExpCol
11d90 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20  late;.          
11da0 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 20 3d 20 70  pTerm->pColl = p
11db0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Coll;.        }.
11dc0 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67          pKeyMerg
11dd0 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  e->aColl[i] = pC
11de0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b 65  oll;.        pKe
11df0 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64  yMerge->aSortOrd
11e00 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
11e10 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
11e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65    }else{.    pKe
11e40 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  yMerge = 0;.  }.
11e50 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74  .  /* Reattach t
11e60 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11e70 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e  se to the query.
11e80 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  .  */.  p->pOrde
11e90 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
11ea0 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
11eb0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
11ec0 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e  ListDup(pParse->
11ed0 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29  db, pOrderBy, 0)
11ee0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
11ef0 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70   a range of temp
11f00 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
11f10 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  and the KeyInfo 
11f20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20  needed.  ** for 
11f30 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72  the logic that r
11f40 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65  emoves duplicate
11f50 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65   result rows whe
11f60 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  n the.  ** opera
11f70 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58  tor is UNION, EX
11f80 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
11f90 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f  CT (but not UNIO
11fa0 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69  N ALL)..  */.  i
11fb0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
11fc0 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30  .    regPrev = 0
11fd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
11fe0 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45  nt nExpr = p->pE
11ff0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
12000 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42   assert( nOrderB
12010 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  y>=nExpr || db->
12020 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
12030 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 73 71      regPrev = sq
12040 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
12050 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b  e(pParse, nExpr+
12060 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
12070 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12080 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50  Integer, 0, regP
12090 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75  rev);.    pKeyDu
120a0 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
120b0 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20  locZero(db,.    
120c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
120d0 7a 65 6f 66 28 2a 70 4b 65 79 44 75 70 29 20 2b  zeof(*pKeyDup) +
120e0 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43   nExpr*(sizeof(C
120f0 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20  ollSeq*)+1) );. 
12100 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29     if( pKeyDup )
12110 7b 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d  {.      pKeyDup-
12120 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
12130 38 2a 29 26 70 4b 65 79 44 75 70 2d 3e 61 43 6f  8*)&pKeyDup->aCo
12140 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20  ll[nExpr];.     
12150 20 70 4b 65 79 44 75 70 2d 3e 6e 46 69 65 6c 64   pKeyDup->nField
12160 20 3d 20 28 75 31 36 29 6e 45 78 70 72 3b 0a 20   = (u16)nExpr;. 
12170 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 65 6e       pKeyDup->en
12180 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
12190 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
121a0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
121b0 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c     pKeyDup->aCol
121c0 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65  l[i] = multiSele
121d0 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
121e0 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  , p, i);.       
121f0 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f   pKeyDup->aSortO
12200 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  rder[i] = 0;.   
12210 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
12220 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74  .  /* Separate t
12230 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20  he left and the 
12240 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d  right query from
12250 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a   one another.  *
12260 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  /.  p->pPrior = 
12270 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 52 69  0;.  pPrior->pRi
12280 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 73  ghtmost = 0;.  s
12290 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
122a0 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
122b0 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  , p, p->pOrderBy
122c0 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66  , "ORDER");.  if
122d0 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72  ( pPrior->pPrior
122e0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
122f0 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
12300 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 50  oupBy(pParse, pP
12310 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f  rior, pPrior->pO
12320 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
12330 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
12340 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65  ute the limit re
12350 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d  gisters */.  com
12360 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
12370 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61  rs(pParse, p, la
12380 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70  belEnd);.  if( p
12390 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d  ->iLimit && op==
123a0 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
123b0 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72  gLimitA = ++pPar
123c0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
123d0 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72  gLimitB = ++pPar
123e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
123f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12400 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69  v, OP_Copy, p->i
12410 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66  Offset ? p->iOff
12420 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69  set+1 : p->iLimi
12430 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12450 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b       regLimitA);
12460 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12470 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
12480 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65  y, regLimitA, re
12490 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73  gLimitB);.  }els
124a0 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41  e{.    regLimitA
124b0 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30   = regLimitB = 0
124c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
124d0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
124e0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70  >pLimit);.  p->p
124f0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c  Limit = 0;.  sql
12500 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
12510 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  b, p->pOffset);.
12520 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
12530 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20  ;..  regAddrA = 
12540 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12550 20 20 72 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50    regEofA = ++pP
12560 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
12570 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73  gAddrB = ++pPars
12580 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f  e->nMem;.  regEo
12590 66 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  fB = ++pParse->n
125a0 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d  Mem;.  regOutA =
125b0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
125c0 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70  .  regOutB = ++p
125d0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
125e0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
125f0 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54  Init(&destA, SRT
12600 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
12610 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
12620 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
12630 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75  destB, SRT_Corou
12640 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b  tine, regAddrB);
12650 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74  ..  /* Jump past
12660 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 75 62   the various sub
12670 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 63 6f 72  routines and cor
12680 6f 75 74 69 6e 65 73 20 74 6f 20 74 68 65 20 6d  outines to the m
12690 61 69 6e 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c  ain.  ** merge l
126a0 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20  oop.  */.  j1 = 
126b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
126c0 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
126d0 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73   addrSelectA = s
126e0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
126f0 74 41 64 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a  tAddr(v);...  /*
12700 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
12710 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
12720 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
12730 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  tement to the.  
12740 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63  ** left of the c
12750 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72  ompound operator
12760 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63   - the "A" selec
12770 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  t..  */.  VdbeNo
12780 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  opComment((v, "B
12790 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66  egin coroutine f
127a0 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29  or left SELECT")
127b0 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69  );.  pPrior->iLi
127c0 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b  mit = regLimitA;
127d0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
127e0 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
127f0 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69   &destA);.  sqli
12800 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12810 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
12820 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  regEofA);.  sqli
12830 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12840 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
12850 64 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  drA);.  VdbeNoop
12860 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
12870 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
12880 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a  eft SELECT"));..
12890 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
128a0 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
128b0 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
128c0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
128d0 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
128e0 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
128f0 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
12900 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
12910 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
12920 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
12930 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f  ((v, "Begin coro
12940 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
12950 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76  SELECT"));.  sav
12960 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  edLimit = p->iLi
12970 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73  mit;.  savedOffs
12980 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
12990 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  .  p->iLimit = r
129a0 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69  egLimitB;.  p->i
129b0 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20  Offset = 0;  .  
129c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
129d0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29  arse, p, &destB)
129e0 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
129f0 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d  savedLimit;.  p-
12a00 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64  >iOffset = saved
12a10 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65  Offset;.  sqlite
12a20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12a30 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65  P_Integer, 1, re
12a40 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65  gEofB);.  sqlite
12a50 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12a60 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
12a70 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f  B);.  VdbeNoopCo
12a80 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63  mment((v, "End c
12a90 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
12aa0 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20  ht SELECT"));.. 
12ab0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
12ac0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
12ad0 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
12ae0 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a  nt row of the A.
12af0 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
12b00 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
12b10 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
12b20 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
12b30 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12b40 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
12b50 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a  utine for A"));.
12b60 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e    addrOutA = gen
12b70 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
12b80 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
12b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12ba0 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c  , &destA, pDest,
12bb0 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20   regOutA,.      
12bc0 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
12bd0 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50 34 5f  ev, pKeyDup, P4_
12be0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 2c  KEYINFO_HANDOFF,
12bf0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20   labelEnd);.  . 
12c00 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
12c10 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
12c20 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
12c30 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a  nt row of the B.
12c40 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
12c50 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
12c60 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
12c70 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
12c80 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
12c90 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
12ca0 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70   ){.    VdbeNoop
12cb0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
12cc0 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
12cd0 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75  B"));.    addrOu
12ce0 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tB = generateOut
12cf0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
12d00 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
12d10 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42         p, &destB
12d20 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42  , pDest, regOutB
12d30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12d40 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
12d50 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  Dup, P4_KEYINFO_
12d60 53 54 41 54 49 43 2c 20 6c 61 62 65 6c 45 6e 64  STATIC, labelEnd
12d70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
12d80 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
12d90 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
12da0 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
12db0 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72  select A.  ** ar
12dc0 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
12dd0 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
12de0 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20  ect B remains.. 
12df0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
12e00 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41  mment((v, "eof-A
12e10 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
12e20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43    if( op==TK_EXC
12e30 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e  EPT || op==TK_IN
12e40 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
12e50 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65  ddrEofA = sqlite
12e60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12e70 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
12e80 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  End);.  }else{  
12e90 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20  .    addrEofA = 
12ea0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12eb0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
12ec0 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  ofB, labelEnd);.
12ed0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12ee0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
12ef0 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
12f00 4f 75 74 42 29 3b 0a 20 20 20 20 73 71 6c 69 74  OutB);.    sqlit
12f10 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12f20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
12f30 72 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rB);.    sqlite3
12f40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12f50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f  _Goto, 0, addrEo
12f60 66 41 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  fA);.  }..  /* G
12f70 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
12f80 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
12f90 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
12fa0 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20  m select B.  ** 
12fb0 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
12fc0 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
12fd0 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e  elect A remains.
12fe0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
12ff0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
13000 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61      addrEofB = a
13010 64 64 72 45 6f 66 41 3b 0a 20 20 7d 65 6c 73 65  ddrEofA;.  }else
13020 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
13030 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
13040 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
13050 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  ;.    addrEofB =
13060 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13070 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
13080 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  EofA, labelEnd);
13090 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
130a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
130b0 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
130c0 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  rOutA);.    sqli
130d0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
130e0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
130f0 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  drA);.    sqlite
13100 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13110 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
13120 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ofB);.  }..  /* 
13130 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
13140 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
13150 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56   of A<B.  */.  V
13160 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
13170 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f  v, "A-lt-B subro
13180 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
13190 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AltB = sqlite3Vd
131a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
131b0 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
131c0 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69  ddrOutA);.  sqli
131d0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
131e0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
131f0 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  drA);.  sqlite3V
13200 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13210 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64  If, regEofA, add
13220 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65  rEofA);.  sqlite
13230 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13240 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
13250 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Cmpr);..  /* Gen
13260 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
13270 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
13280 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28   A==B.  */.  if(
13290 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
132a0 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
132b0 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20  drAltB;.  }else 
132c0 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
132d0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
132e0 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
132f0 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b  .    addrAltB++;
13300 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
13310 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
13320 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75  , "A-eq-B subrou
13330 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
13340 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69  rAeqB =.    sqli
13350 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13360 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
13370 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  drA);.    sqlite
13380 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13390 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61  P_If, regEofA, a
133a0 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 73 71  ddrEofA);.    sq
133b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
133c0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
133d0 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a  abelCmpr);.  }..
133e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
133f0 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
13400 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a   case of A>B.  *
13410 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
13420 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20  ent((v, "A-gt-B 
13430 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
13440 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69   addrAgtB = sqli
13450 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
13460 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d  dr(v);.  if( op=
13470 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
13480 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73  K_UNION ){.    s
13490 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
134a0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
134b0 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
134c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
134d0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
134e0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29  Yield, regAddrB)
134f0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13500 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
13510 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66  regEofB, addrEof
13520 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
13530 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
13540 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
13550 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
13560 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  de runs once to 
13570 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79  initialize every
13580 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71  thing..  */.  sq
13590 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
135a0 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69  e(v, j1);.  sqli
135b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
135c0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
135d0 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  regEofA);.  sqli
135e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
135f0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
13600 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69  regEofB);.  sqli
13610 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13620 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64   OP_Gosub, regAd
13630 64 72 41 2c 20 61 64 64 72 53 65 6c 65 63 74 41  drA, addrSelectA
13640 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13650 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
13660 75 62 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ub, regAddrB, ad
13670 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 73 71  drSelectB);.  sq
13680 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13690 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
136a0 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  A, addrEofA);.  
136b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
136c0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
136d0 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  ofB, addrEofB);.
136e0 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  .  /* Implement 
136f0 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c  the main merge l
13700 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
13710 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
13720 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  el(v, labelCmpr)
13730 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13740 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d  ddOp4(v, OP_Perm
13750 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  utation, 0, 0, 0
13760 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74  , (char*)aPermut
13770 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  e, P4_INTARRAY);
13780 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13790 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
137a0 72 65 2c 20 64 65 73 74 41 2e 69 4d 65 6d 2c 20  re, destA.iMem, 
137b0 64 65 73 74 42 2e 69 4d 65 6d 2c 20 6e 4f 72 64  destB.iMem, nOrd
137c0 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
137e0 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c  char*)pKeyMerge,
137f0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
13800 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  OFF);.  sqlite3V
13810 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13820 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20  Jump, addrAltB, 
13830 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67  addrAeqB, addrAg
13840 74 42 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  tB);..  /* Relea
13850 73 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  se temporary reg
13860 69 73 74 65 72 73 0a 20 20 2a 2f 0a 20 20 69 66  isters.  */.  if
13870 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
13880 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
13890 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
138a0 20 72 65 67 50 72 65 76 2c 20 6e 4f 72 64 65 72   regPrev, nOrder
138b0 42 79 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  By+1);.  }..  /*
138c0 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69   Jump to the thi
138d0 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72  s point in order
138e0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
138f0 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
13900 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
13910 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
13920 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  End);..  /* Set 
13930 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
13940 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a  tput columns.  *
13950 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65  /.  if( pDest->e
13960 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
13970 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
13980 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b  pFirst = pPrior;
13990 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72  .    while( pFir
139a0 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
139b0 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
139c0 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61  rior;.    genera
139d0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
139e0 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
139f0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20  >pEList);.  }.. 
13a00 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74   /* Reassembly t
13a10 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
13a20 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  y so that it wil
13a30 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65  l be freed corre
13a40 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65  ctly.  ** by the
13a50 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
13a60 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50  n */.  if( p->pP
13a70 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rior ){.    sqli
13a80 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
13a90 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a  db, p->pPrior);.
13aa0 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20    }.  p->pPrior 
13ab0 3d 20 70 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a  = pPrior;..  /**
13ac0 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73  * TBD:  Insert s
13ad0 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20  ubroutine calls 
13ae0 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73  to close cursors
13af0 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20   on incomplete. 
13b00 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73   **** subqueries
13b10 20 2a 2a 2a 2a 2f 0a 20 20 72 65 74 75 72 6e 20   ****/.  return 
13b20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
13b30 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
13b40 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
13b50 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
13b60 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13b70 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64  VIEW)./* Forward
13b80 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   Declarations */
13b90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
13ba0 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74  stExprList(sqlit
13bb0 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20  e3*, ExprList*, 
13bc0 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b  int, ExprList*);
13bd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
13be0 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33  stSelect(sqlite3
13bf0 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74  *, Select *, int
13c00 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a  , ExprList *);..
13c10 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75  /*.** Scan throu
13c20 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  gh the expressio
13c30 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63  n pExpr.  Replac
13c40 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63  e every referenc
13c50 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e  e to.** a column
13c60 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72   in table number
13c70 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63   iTable with a c
13c80 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75  opy of the iColu
13c90 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69  mn-th.** entry i
13ca0 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20  n pEList.  (But 
13cb0 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73  leave references
13cc0 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f   to the ROWID co
13cd0 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  lumn .** unchang
13ce0 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed.).**.** This 
13cf0 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20  routine is part 
13d00 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  of the flattenin
13d10 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20  g procedure.  A 
13d20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73  subquery.** whos
13d30 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20  e result set is 
13d40 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73  defined by pELis
13d50 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74  t appears as ent
13d60 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f  ry in the.** FRO
13d70 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
13d80 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74  LECT such that t
13d90 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61  he VDBE cursor a
13da0 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a  ssigned to that.
13db0 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65  ** FORM clause e
13dc0 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20  ntry is iTable. 
13dd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
13de0 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ke the necessary
13df0 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
13e00 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74  pExpr so that it
13e10 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
13e20 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74   to the source t
13e30 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73  able.** of the s
13e40 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74  ubquery rather t
13e50 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
13e60 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
13e70 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73  /.static Expr *s
13e80 75 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69  ubstExpr(.  sqli
13e90 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
13ea0 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
13eb0 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20   errors to this 
13ec0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
13ed0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
13ee0 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77      /* Expr in w
13ef0 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f  hich substitutio
13f00 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e  n occurs */.  in
13f10 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
13f20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
13f30 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
13f40 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
13f50 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  st    /* Substit
13f60 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ute expressions 
13f70 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70  */.){.  if( pExp
13f80 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
13f90 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
13fa0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
13fb0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Expr->iTable==iT
13fc0 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  able ){.    if( 
13fd0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
13fe0 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
13ff0 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
14000 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14010 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
14020 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
14030 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
14040 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45  olumn<pEList->nE
14050 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
14060 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
14070 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
14080 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
14090 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
140a0 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69  ExprDup(db, pELi
140b0 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f  st->a[pExpr->iCo
140c0 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b  lumn].pExpr, 0);
140d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
140e0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
140f0 70 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  pr);.      pExpr
14100 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20   = pNew;.    }. 
14110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70   }else{.    pExp
14120 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74  r->pLeft = subst
14130 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
14140 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
14150 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70  EList);.    pExp
14160 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73  r->pRight = subs
14170 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
14180 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
14190 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66   pEList);.    if
141a0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
141b0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
141c0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
141d0 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
141e0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
141f0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
14200 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
14210 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
14220 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(db, pExpr->x.p
14230 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
14240 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
14250 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
14260 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
14270 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
14280 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
14290 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
142a0 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
142b0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
142c0 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c  *pList,     /* L
142d0 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
142e0 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
142f0 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
14300 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
14310 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
14320 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
14330 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
14340 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
14350 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
14360 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
14370 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14380 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
14390 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
143a0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c  pr; i++){.    pL
143b0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  ist->a[i].pExpr 
143c0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
143d0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
143e0 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
143f0 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
14400 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
14410 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
14420 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
14430 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
14440 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
14450 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
14460 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
14470 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
14480 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
14490 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
144a0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
144b0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70   Table to be rep
144c0 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  laced */.  ExprL
144d0 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
144e0 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
144f0 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  lues */.){.  Src
14500 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74  List *pSrc;.  st
14510 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
14520 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
14530 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  i;.  if( !p ) re
14540 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70  turn;.  substExp
14550 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c  rList(db, p->pEL
14560 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
14570 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
14580 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72  rList(db, p->pGr
14590 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  oupBy, iTable, p
145a0 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
145b0 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
145c0 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
145d0 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70   pEList);.  p->p
145e0 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
145f0 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  pr(db, p->pHavin
14600 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  g, iTable, pELis
14610 74 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20  t);.  p->pWhere 
14620 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
14630 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c  p->pWhere, iTabl
14640 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
14650 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d  bstSelect(db, p-
14660 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c  >pPrior, iTable,
14670 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63   pEList);.  pSrc
14680 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
14690 73 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f  sert( pSrc );  /
146a0 2a 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45  * Even for (SELE
146b0 43 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70  CT 1) we have: p
146c0 53 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d  Src!=0 but pSrc-
146d0 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66  >nSrc==0 */.  if
146e0 28 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29  ( ALWAYS(pSrc) )
146f0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63  {.    for(i=pSrc
14700 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53  ->nSrc, pItem=pS
14710 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  rc->a; i>0; i--,
14720 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
14730 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
14740 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
14750 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
14760 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
14770 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
14780 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
14790 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
147a0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
147b0 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
147c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
147d0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
147e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
147f0 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
14800 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
14810 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
14820 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f   subqueries in o
14830 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a  rder to speed.**
14840 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20   execution.  It 
14850 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
14860 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
14870 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
14880 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  ning.** occurs..
14890 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
148a0 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
148b0 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
148c0 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
148d0 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
148e0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
148f0 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
14900 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
14910 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
14920 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
14930 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
14940 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
14950 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
14960 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
14970 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
14980 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
14990 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
149a0 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
149b0 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
149c0 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
149d0 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
149e0 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
149f0 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
14a00 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
14a10 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
14a20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
14a30 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
14a40 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
14a50 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
14a60 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
14a70 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
14a80 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
14a90 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
14aa0 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
14ab0 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
14ac0 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
14ad0 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
14ae0 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
14af0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
14b00 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
14b10 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
14b20 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
14b30 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
14b40 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
14b50 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
14b60 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
14b70 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
14b80 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
14b90 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
14ba0 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
14bb0 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
14bc0 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
14bd0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
14be0 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
14bf0 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
14c00 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
14c10 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
14c20 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
14c30 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
14c40 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
14c50 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
14c60 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
14c70 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
14c80 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
14c90 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
14ca0 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
14cb0 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
14cc0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
14cd0 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
14ce0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
14cf0 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
14d00 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
14d10 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a  ft outer join.**
14d20 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61          (Origina
14d30 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e  lly ticket #306.
14d40 20 20 53 74 72 65 6e 67 68 74 65 6e 65 64 20 62    Strenghtened b
14d50 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a  y ticket #3300).
14d60 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
14d70 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
14d80 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
14d90 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
14da0 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
14db0 2a 20 20 20 28 35 29 20 20 54 68 65 20 73 75 62  *   (5)  The sub
14dc0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53  query is not DIS
14dd0 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74  TINCT or the out
14de0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
14df0 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
14e00 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
14e10 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62  *   (6)  The sub
14e20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
14e30 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
14e40 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14e50 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
14e60 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a    DISTINCT..**.*
14e70 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62  *   (7)  The sub
14e80 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d  query has a FROM
14e90 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
14ea0 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
14eb0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
14ec0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
14ed0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
14ee0 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
14ef0 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
14f00 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
14f10 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
14f20 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
14f30 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
14f40 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
14f50 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71    (10)  The subq
14f60 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
14f70 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
14f80 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
14f90 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
14fa0 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a     use LIMIT..**
14fb0 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
14fc0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
14fd0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
14fe0 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
14ff0 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
15000 2a 0a 2a 2a 20 20 28 31 32 29 20 20 4e 6f 74 20  *.**  (12)  Not 
15010 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75  implemented.  Su
15020 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
15030 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61  riction (3).  Wa
15040 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
15050 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74         a separat
15060 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65  e restriction de
15070 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b  riving from tick
15080 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20  et #350..**.**  
15090 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
150a0 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
150b0 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
150c0 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20  se LIMIT.**.**  
150d0 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (14)  The subque
150e0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
150f0 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31  OFFSET.**.**  (1
15100 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  5)  The outer qu
15110 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20  ery is not part 
15120 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
15130 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20  lect or the.**  
15140 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64        subquery d
15150 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 62 6f 74  oes not have bot
15160 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 61 6e  h an ORDER BY an
15170 64 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  d a LIMIT clause
15180 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
15190 20 74 69 63 6b 65 74 20 23 32 33 33 39 29 0a 2a   ticket #2339).*
151a0 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20  *.**  (16)  The 
151b0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
151c0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
151d0 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20  or the subquery 
151e0 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e  does.**        n
151f0 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  ot contain ORDER
15200 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32   BY.  (Ticket #2
15210 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20  942)  This used 
15220 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a  to not matter.**
15230 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65          until we
15240 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20   introduced the 
15250 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66  group_concat() f
15260 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  unction.  .**.**
15270 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d    (17)  The sub-
15280 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
15290 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
152a0 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e  or it is a UNION
152b0 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20   ALL .**        
152c0 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20  compound clause 
152d0 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79  made up entirely
152e0 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74   of non-aggregat
152f0 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a  e queries, and .
15300 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61  **        the pa
15310 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  rent query:.**.*
15320 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
15330 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20  not itself part 
15340 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
15350 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20  lect,.**        
15360 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67    * is not an ag
15370 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49  gregate or DISTI
15380 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a  NCT query, and.*
15390 2a 20 20 20 20 20 20 20 20 20 20 2a 20 68 61 73  *          * has
153a0 20 6e 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 73   no other tables
153b0 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 73 20   or sub-selects 
153c0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
153d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se..**.**       
153e0 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20   The parent and 
153f0 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f  sub-query may co
15400 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ntain WHERE clau
15410 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a  ses. Subject to.
15420 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20  **        rules 
15430 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28  (11), (13) and (
15440 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c  14), they may al
15450 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  so contain ORDER
15460 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c   BY,.**        L
15470 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
15480 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
15490 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62  (18)  If the sub
154a0 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
154b0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
154c0 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
154d0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44  he.**        ORD
154e0 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20  ER by clause of 
154f0 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20  the parent must 
15500 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65  be simple refere
15510 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20  nces to .**     
15520 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68     columns of th
15530 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a  e sub-query..**.
15540 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73 75  **  (19)  The su
15550 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
15560 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
15570 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
15580 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
15590 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61  have a WHERE cla
155a0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29  use..**.**  (20)
155b0 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
155c0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
155d0 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74   select, then it
155e0 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a   must not use.**
155f0 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52          an ORDER
15600 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63   BY clause.  Tic
15610 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63  ket #3773.  We c
15620 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20  ould relax this 
15630 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20  constraint.**   
15640 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79       somewhat by
15650 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65   saying that the
15660 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
15670 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75  DER BY clause mu
15680 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70  st.**        app
15690 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65  ear as unmodifie
156a0 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  d result columns
156b0 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
156c0 65 72 79 2e 20 20 42 75 74 0a 2a 2a 20 20 20 20  ery.  But.**    
156d0 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f      have other o
156e0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20  ptimizations in 
156f0 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74  mind to deal wit
15700 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a  h that case..**.
15710 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
15720 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
15730 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
15740 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
15750 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
15760 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
15770 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
15780 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
15790 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
157a0 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
157b0 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
157c0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
157d0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
157e0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
157f0 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
15800 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
15810 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
15820 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
15830 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
15840 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
15850 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
15860 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
15870 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
15880 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
15890 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
158a0 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
158b0 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
158c0 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
158d0 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
158e0 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
158f0 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
15900 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
15910 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
15920 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
15930 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
15940 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15950 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
15960 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
15970 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
15980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
15990 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
159a0 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
159b0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
159c0 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
159d0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
159e0 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
159f0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
15a00 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
15a10 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
15a20 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
15a30 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
15a40 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
15a50 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
15a60 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
15a70 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
15a80 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
15a90 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
15aa0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
15ab0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
15ac0 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
15ad0 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c  bquery" */.  Sel
15ae0 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20  ect *pSub1;     
15af0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
15b00 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c  he rightmost sel
15b10 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79  ect in sub-query
15b20 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
15b30 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
15b40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
15b50 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
15b60 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
15b70 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
15b80 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
15b90 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
15ba0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
15bb0 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
15bc0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
15bd0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
15be0 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
15bf0 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
15c00 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
15c10 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
15c20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
15c30 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
15c40 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
15c50 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
15c60 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
15c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15c80 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
15c90 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
15ca0 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
15cb0 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
15cc0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
15cd0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
15ce0 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
15cf0 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
15d00 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
15d10 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
15d20 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
15d30 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
15d40 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
15d50 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20  0 );  /* Unable 
15d60 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f  to flatten compo
15d70 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  und queries */. 
15d80 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
15d90 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
15da0 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
15db0 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
15dc0 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
15dd0 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
15de0 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
15df0 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
15e00 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65    pSub = pSubite
15e10 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m->pSelect;.  as
15e20 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
15e30 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
15e40 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
15e50 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
15e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
15e70 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f  triction (1)  */
15e80 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
15e90 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53  sAgg && pSrc->nS
15ea0 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  rc>1 ) return 0;
15eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
15ec0 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f  triction (2)  */
15ed0 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
15ee0 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
15ef0 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
15f00 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73  /* Prior to vers
15f10 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20  ion 3.1.2, when 
15f20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
15f30 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c   had to be simpl
15f40 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a  e constants,.  *
15f50 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20  * not arbitrary 
15f60 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65  expresssions, we
15f70 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f   allowed some co
15f80 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54  mbining of LIMIT
15f90 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
15fa0 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f   because they co
15fb0 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
15fc0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
15fd0 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54    But when LIMIT
15fe0 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
15ff0 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72   became arbitrar
16000 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
16010 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f  e were forced to
16020 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e   add restriction
16030 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20  s (13).  ** and 
16040 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  (14). */.  if( p
16050 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
16060 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
16070 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
16080 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
16090 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70   (13) */.  if( p
160a0 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72  Sub->pOffset ) r
160b0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160d0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
160e0 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70   (14) */.  if( p
160f0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20  ->pRightmost && 
16100 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
16110 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
16120 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
16160 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
16170 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
16180 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
16190 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
161b0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
161c0 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 28 70 53  )  */.  if( ((pS
161d0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
161e0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
161f0 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20  | pSub->pLimit) 
16200 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 53  .         && (pS
16210 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
16220 41 67 67 29 20 29 7b 20 20 20 20 20 20 20 20 20  Agg) ){         
16230 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
16240 20 28 34 29 28 35 29 28 38 29 28 39 29 20 2a 2f   (4)(5)(8)(9) */
16250 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
16260 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69 66 28        .  }.  if(
16270 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
16280 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
16290 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
162a0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
162b0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
162c0 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a  striction (6)  *
162d0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  /.  }.  if( p->p
162e0 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
162f0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
16300 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16330 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
16340 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d  tion (11) */.  }
16350 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
16360 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
16370 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
16380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
16390 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f  triction (16) */
163a0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
163b0 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65  mit && p->pWhere
163c0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
163d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
163e0 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f  triction (19) */
163f0 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20  ..  /* OBSOLETE 
16400 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20  COMMENT 1:.  ** 
16410 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20  Restriction 3:  
16420 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
16430 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20  is a join, make 
16440 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
16450 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75  y is .  ** not u
16460 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  sed as the right
16470 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f   operand of an o
16480 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d  uter join.  Exam
16490 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
164a0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c  .  ** is not all
164b0 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
164c0 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
164d0 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
164e0 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
164f0 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
16500 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
16510 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
16520 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
16530 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
16540 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
16550 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
16560 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
16570 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a   thing..  **.  *
16580 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  * OBSOLETE COMME
16590 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72  NT 2:.  ** Restr
165a0 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74  iction 12:  If t
165b0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
165c0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
165d0 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
165e0 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65  .  ** join, make
165f0 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
16600 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
16610 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20  clause..  ** An 
16620 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  examples of why 
16630 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  this is not allo
16640 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
16650 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
16660 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43  UTER JOIN (SELEC
16670 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T * FROM t2 WHER
16680 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20  E t2.x>0).  **. 
16690 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
166a0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
166b0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
166c0 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
166d0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
166e0 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30  t2) WHERE t2.x>0
166f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74  .  **.  ** But t
16700 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77  he t2.x>0 test w
16710 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
16720 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66  on a NULL row of
16730 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20   t2, which.  ** 
16740 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76  effectively conv
16750 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a  erts the OUTER J
16760 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45  OIN into an INNE
16770 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a  R JOIN..  **.  *
16780 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53  * THIS OVERRIDES
16790 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
167a0 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45  TS 1 AND 2 ABOVE
167b0 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33  :.  ** Ticket #3
167c0 33 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66  300 shows that f
167d0 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69  lattening the ri
167e0 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
167f0 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20  FT JOIN.  ** is 
16800 66 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e  fraught with dan
16810 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76  ger.  Best to av
16820 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68  oid the whole th
16830 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  ing.  If the.  *
16840 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  * subquery is th
16850 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
16860 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  a LEFT JOIN, the
16870 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e  n do not flatten
16880 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
16890 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
168a0 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
168b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
168c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
168d0 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68  iction 17: If th
168e0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
168f0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
16900 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20  , then it must. 
16910 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65   ** use only the
16920 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
16930 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  tor. And none of
16940 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65   the simple sele
16950 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  ct queries.  ** 
16960 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
16970 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
16980 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
16990 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  be aggregate or 
169a0 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75  distinct.  ** qu
169b0 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eries..  */.  if
169c0 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  ( pSub->pPrior )
169d0 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
169e0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
169f0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
16a00 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a  Restriction 20 *
16a10 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
16a20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c  isAgg || (p->sel
16a30 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
16a40 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d  nct)!=0 || pSrc-
16a50 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  >nSrc!=1 ){.    
16a60 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
16a70 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d  }.    for(pSub1=
16a80 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75  pSub; pSub1; pSu
16a90 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  b1=pSub1->pPrior
16aa0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
16ab0 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
16ac0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
16ad0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
16ae0 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
16af0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16b00 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
16b10 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
16b20 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
16b30 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
16b40 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75  ;.      if( (pSu
16b50 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
16b60 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
16b70 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20  ggregate))!=0.  
16b80 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e       || (pSub1->
16b90 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d  pPrior && pSub1-
16ba0 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20  >op!=TK_ALL) .  
16bb0 20 20 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 53       || NEVER(pS
16bc0 75 62 31 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c  ub1->pSrc==0) ||
16bd0 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53   pSub1->pSrc->nS
16be0 72 63 21 3d 31 0a 20 20 20 20 20 20 29 7b 0a 20  rc!=1.      ){. 
16bf0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
16c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
16c10 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
16c20 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66  on 18. */.    if
16c30 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
16c40 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
16c50 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
16c60 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
16c70 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
16c80 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
16c90 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 69 43 6f 6c  erBy->a[ii].iCol
16ca0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
16cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16cc0 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77  }..  /***** If w
16cd0 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
16ce0 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  nt, flattening i
16cf0 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a  s permitted. ***
16d00 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72  **/..  /* Author
16d10 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ize the subquery
16d20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   */.  pParse->zA
16d30 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75  uthContext = pSu
16d40 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  bitem->zName;.  
16d50 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
16d60 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
16d70 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
16d80 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  ;.  pParse->zAut
16d90 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
16da0 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20  dAuthContext;.. 
16db0 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71   /* If the sub-q
16dc0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
16dd0 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
16de0 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65  ent, then (by re
16df0 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20  strictions.  ** 
16e00 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29  17 and 18 above)
16e10 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e   it must be a UN
16e20 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20  ION ALL and the 
16e30 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73  parent query mus
16e40 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68  t .  ** be of th
16e50 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  e form:.  **.  *
16e60 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78  *     SELECT <ex
16e70 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c  pr-list> FROM (<
16e80 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65  sub-query>) <whe
16e90 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a  re-clause> .  **
16ea0 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62  .  ** followed b
16eb0 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  y any ORDER BY, 
16ec0 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46  LIMIT and/or OFF
16ed0 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69  SET clauses. Thi
16ee0 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65  s block.  ** cre
16ef0 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20  ates N-1 copies 
16f00 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  of the parent qu
16f10 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ery without any 
16f20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
16f30 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20  or .  ** OFFSET 
16f40 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e  clauses and join
16f50 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65  s them to the le
16f60 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20  ft-hand-side of 
16f70 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
16f80 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c  * using UNION AL
16f90 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20  L operators. In 
16fa0 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20 74  this case N is t
16fb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d  he number of sim
16fc0 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  ple.  ** select 
16fd0 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
16fe0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71  e compound sub-q
16ff0 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  uery..  **.  ** 
17000 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  Example:.  **.  
17010 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  **     SELECT a+
17020 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20  1 FROM (.  **   
17030 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52       SELECT x FR
17040 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
17050 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
17060 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
17070 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  y FROM tab.  ** 
17080 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
17090 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
170a0 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f  ECT abs(z*2) FRO
170b0 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20  M tab2.  **     
170c0 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44  ) WHERE a!=5 ORD
170d0 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
170e0 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  * Transformed in
170f0 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
17100 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f    SELECT x+1 FRO
17110 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31 21  M tab WHERE x+1!
17120 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
17130 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
17140 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74  ELECT y+1 FROM t
17150 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a  ab WHERE y+1!=5.
17160 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
17170 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
17180 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52  CT abs(z*2)+1 FR
17190 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61 62  OM tab2 WHERE ab
171a0 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a  s(z*2)+1!=5.  **
171b0 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a       ORDER BY 1.
171c0 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c    **.  ** We cal
171d0 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70  l this the "comp
171e0 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
171f0 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a  attening"..  */.
17200 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d    for(pSub=pSub-
17210 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70  >pPrior; pSub; p
17220 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
17230 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
17240 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  New;.    ExprLis
17250 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
17260 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45  >pOrderBy;.    E
17270 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d  xpr *pLimit = p-
17280 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c  >pLimit;.    Sel
17290 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d  ect *pPrior = p-
172a0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e  >pPrior;.    p->
172b0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
172c0 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20    p->pSrc = 0;. 
172d0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
172e0 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
172f0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 0;.    pNew = 
17300 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
17310 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  (db, p, 0);.    
17320 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
17330 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  it;.    p->pOrde
17340 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
17350 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53      p->pSrc = pS
17360 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20  rc;.    p->op = 
17370 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70  TK_ALL;.    p->p
17380 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20  Rightmost = 0;. 
17390 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
173a0 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70  {.      pNew = p
173b0 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65  Prior;.    }else
173c0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50  {.      pNew->pP
173d0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
173e0 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
173f0 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d  tmost = 0;.    }
17400 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
17410 20 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 64   pNew;.    if( d
17420 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
17430 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
17440 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74  .  /* Begin flat
17450 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d  tening the iFrom
17460 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  -th entry of the
17470 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20   FROM clause .  
17480 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ** in the outer 
17490 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53  query..  */.  pS
174a0 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75  ub = pSub1 = pSu
174b0 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
174c0 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
174d0 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
174e0 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63   structure assoc
174f0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
17500 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a   ** subquery.  *
17510 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
17520 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
17530 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71  zDatabase);.  sq
17540 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
17550 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pSubitem->zName)
17560 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
17570 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
17580 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69  zAlias);.  pSubi
17590 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
175a0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
175b0 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75  zName = 0;.  pSu
175c0 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  bitem->zAlias = 
175d0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  0;.  pSubitem->p
175e0 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f  Select = 0;..  /
175f0 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67  * Defer deleting
17600 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
17610 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
17620 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
17630 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67  ery until code g
17640 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a  eneration is.  *
17650 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63  * complete, sinc
17660 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c  e there may stil
17670 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61  l exist Expr.pTa
17680 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20  b entries that. 
17690 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65   ** refer to the
176a0 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61   subquery even a
176b0 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e  fter flattening.
176c0 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a    Ticket #3346..
176d0 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74    **.  ** pSubit
176e0 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61  em->pTab is alwa
176f0 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74  ys non-NULL by t
17700 65 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  est restrictions
17710 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65   and tests above
17720 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ..  */.  if( ALW
17730 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54  AYS(pSubitem->pT
17740 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61  ab!=0) ){.    Ta
17750 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d  ble *pTabToDel =
17760 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b   pSubitem->pTab;
17770 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44  .    if( pTabToD
17780 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20  el->nRef==1 ){. 
17790 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
177a0 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 50  pNextZombie = pP
177b0 61 72 73 65 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  arse->pZombieTab
177c0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
177d0 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61  pZombieTab = pTa
177e0 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73  bToDel;.    }els
177f0 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  e{.      pTabToD
17800 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  el->nRef--;.    
17810 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  }.    pSubitem->
17820 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pTab = 0;.  }.. 
17830 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
17840 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  g loop runs once
17850 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
17860 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
17870 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74  query.  ** flatt
17880 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69  ening (as descri
17890 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20  bed above).  If 
178a0 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64  we are doing a d
178b0 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20  ifferent kind.  
178c0 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** of flattening
178d0 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20   - a flattening 
178e0 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d  other than a com
178f0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
17900 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a  lattening -.  **
17910 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20   then this loop 
17920 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
17930 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
17940 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66  oop moves all of
17950 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
17960 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
17970 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
17980 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
17990 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
179a0 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
179b0 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
179c0 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
179d0 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
179e0 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
179f0 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
17a00 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
17a10 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
17a20 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
17a30 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
17a40 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
17a50 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
17a60 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
17a70 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
17a80 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
17a90 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
17aa0 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
17ab0 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
17ac0 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
17ad0 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
17ae0 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
17af0 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
17b00 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72  .  */.  for(pPar
17b10 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20  ent=p; pParent; 
17b20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d  pParent=pParent-
17b30 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53  >pPrior, pSub=pS
17b40 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
17b50 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20   int nSubSrc;.  
17b60 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20    u8 jointype = 
17b70 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d  0;.    pSubSrc =
17b80 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20   pSub->pSrc;    
17b90 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
17ba0 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  of subquery */. 
17bb0 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75     nSubSrc = pSu
17bc0 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20  bSrc->nSrc;  /* 
17bd0 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
17be0 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  in subquery FROM
17bf0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70   clause */.    p
17c00 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
17c10 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
17c20 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
17c30 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20  uter query */.. 
17c40 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20     if( pSrc ){. 
17c50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
17c60 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46  rent==p );  /* F
17c70 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67  irst time throug
17c80 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
17c90 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70      jointype = p
17ca0 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  Subitem->jointyp
17cb0 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
17cc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
17cd0 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e  ent!=p );  /* 2n
17ce0 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
17cf0 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74   times through t
17d00 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
17d10 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
17d20 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
17d30 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
17d40 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
17d50 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a   if( pSrc==0 ){.
17d60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17d70 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17d80 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
17d90 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
17da0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62  ..    /* The sub
17db0 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e  query uses a sin
17dc0 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20  gle slot of the 
17dd0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
17de0 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  he outer.    ** 
17df0 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73  query.  If the s
17e00 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65  ubquery has more
17e10 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e   than one elemen
17e20 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  t in its FROM cl
17e30 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ause,.    ** the
17e40 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  n expand the out
17e50 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65  er query to make
17e60 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f   space for it to
17e70 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e   hold all elemen
17e80 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
17e90 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
17ea0 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
17eb0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
17ec0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
17ed0 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a   tabA, (SELECT *
17ee0 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32   FROM sub1, sub2
17ef0 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a  ), tabB;.    **.
17f00 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72      ** The outer
17f10 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f   query has 3 slo
17f20 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  ts in its FROM c
17f30 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74  lause.  One slot
17f40 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   of the.    ** o
17f50 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20  uter query (the 
17f60 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20  middle slot) is 
17f70 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71  used by the subq
17f80 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a  uery.  The next.
17f90 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20      ** block of 
17fa0 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64  code will expand
17fb0 20 74 68 65 20 6f 75 74 20 71 75 65 72 79 20 74   the out query t
17fc0 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54 68 65 20  o 4 slots.  The 
17fd0 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c  middle.    ** sl
17fe0 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74  ot is expanded t
17ff0 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f  o two slots in o
18000 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61  rder to make spa
18010 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  ce for the.    *
18020 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  * two elements i
18030 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
18040 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
18050 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
18060 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
18070 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
18080 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69  rc = pSrc = sqli
18090 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
180a0 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62  e(db, pSrc, nSub
180b0 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a  Src-1,iFrom+1);.
180c0 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
180d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
180e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
180f0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
18100 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
18110 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
18120 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  s from the subqu
18130 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ery into the.   
18140 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e   ** outer query.
18150 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
18160 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
18170 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63  i++){.      pSrc
18180 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
18190 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
181a0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
181b0 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
181c0 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
181d0 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
181e0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
181f0 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
18200 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
18210 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
18220 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
18230 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
18240 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
18250 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
18260 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
18270 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
18280 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
18290 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
182a0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
182b0 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
182c0 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
182d0 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
182e0 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
182f0 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
18300 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
18310 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
18320 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
18330 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
18340 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
18350 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
18360 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
18370 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18380 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
18390 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
183a0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
183b0 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
183c0 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
183d0 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
183e0 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
183f0 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
18400 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
18410 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
18420 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
18430 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
18440 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
18450 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
18460 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
18470 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
18480 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
18490 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
184a0 73 74 20 63 68 61 72 20 2a 7a 53 70 61 6e 20 3d  st char *zSpan =
184b0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70   pList->a[i].zSp
184c0 61 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  an;.        if( 
184d0 7a 53 70 61 6e 20 29 7b 0a 20 20 20 20 20 20 20  zSpan ){.       
184e0 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a     pList->a[i].z
184f0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
18500 53 74 72 44 75 70 28 64 62 2c 20 7a 53 70 61 6e  StrDup(db, zSpan
18510 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
18520 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
18530 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
18540 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74   pParent->pEList
18550 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
18560 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66  >pEList);.    if
18570 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ( isAgg ){.     
18580 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
18590 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f  b, pParent->pGro
185a0 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  upBy, iParent, p
185b0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
185c0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
185d0 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
185e0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
185f0 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
18600 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
18610 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
18620 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
18630 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
18640 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rent->pOrderBy==
18650 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
18660 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  nt->pOrderBy = p
18670 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
18680 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65       pSub->pOrde
18690 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rBy = 0;.    }el
186a0 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  se if( pParent->
186b0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
186c0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
186d0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  db, pParent->pOr
186e0 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  derBy, iParent, 
186f0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
18700 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
18710 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  b->pWhere ){.   
18720 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
18730 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
18740 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b  Sub->pWhere, 0);
18750 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18760 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
18770 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71    }.    if( subq
18780 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
18790 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
187a0 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29  nt->pHaving==0 )
187b0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
187c0 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65  >pHaving = pPare
187d0 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20  nt->pWhere;.    
187e0 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
187f0 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20  e = pWhere;.    
18800 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
18810 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ng = substExpr(d
18820 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  b, pParent->pHav
18830 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
18840 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
18850 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
18860 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
18870 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
18880 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20  ->pHaving, .    
18890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
188b0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
188c0 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20   pSub->pHaving, 
188d0 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0));.      asser
188e0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f  t( pParent->pGro
188f0 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
18900 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
18910 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
18920 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62  ListDup(db, pSub
18930 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a  ->pGroupBy, 0);.
18940 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18950 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
18960 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
18970 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
18980 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
18990 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
189a0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
189b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
189c0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
189d0 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  here, pWhere);. 
189e0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54     }.  .    /* T
189f0 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
18a00 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
18a10 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
18a20 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  er or the.    **
18a30 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
18a40 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a  distinct. .    *
18a50 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73  /.    pParent->s
18a60 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d  elFlags |= pSub-
18a70 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
18a80 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20  istinct;.  .    
18a90 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  /*.    ** SELECT
18aa0 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43   ... FROM (SELEC
18ab0 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46  T ... LIMIT a OF
18ac0 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20  FSET b) LIMIT x 
18ad0 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a  OFFSET y;.    **
18ae0 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74  .    ** One is t
18af0 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f  empted to try to
18b00 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20   add a and b to 
18b10 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69  combine the limi
18b20 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20  ts.  But this.  
18b30 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f    ** does not wo
18b40 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d  rk if either lim
18b50 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
18b60 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
18b70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
18b80 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c       pParent->pL
18b90 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
18ba0 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  mit;.      pSub-
18bb0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
18bc0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
18bd0 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
18be0 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
18bf0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
18c00 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
18c10 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
18c20 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
18c30 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20 72 65  b, pSub1);..  re
18c40 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
18c50 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
18c60 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
18c70 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
18c80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
18c90 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79   */../*.** Analy
18ca0 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  ze the SELECT st
18cb0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
18cc0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
18cd0 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73   see if it.** is
18ce0 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28   a min() or max(
18cf0 29 20 71 75 65 72 79 2e 20 52 65 74 75 72 6e 20  ) query. Return 
18d00 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
18d10 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
18d20 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20 69 74  BY_MAX if .** it
18d30 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77   is, or 0 otherw
18d40 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e 74 2c  ise. At present,
18d50 20 61 20 71 75 65 72 79 20 69 73 20 63 6f 6e 73   a query is cons
18d60 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a 2a 20  idered to be.** 
18d70 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 71 75  a min()/max() qu
18d80 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery if:.**.**   
18d90 31 2e 20 54 68 65 72 65 20 69 73 20 61 20 73 69  1. There is a si
18da0 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e 20 74  ngle object in t
18db0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
18dc0 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65 72 65  **.**   2. There
18dd0 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65 78 70   is a single exp
18de0 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72  ression in the r
18df0 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 69  esult set, and i
18e00 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65 69 74  t is.**      eit
18e10 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20 6d 61  her min(x) or ma
18e20 78 28 78 29 2c 20 77 68 65 72 65 20 78 20 69 73  x(x), where x is
18e30 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65   a column refere
18e40 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  nce..*/.static u
18e50 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 53 65  8 minMaxQuery(Se
18e60 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78 70 72  lect *p){.  Expr
18e70 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72 4c   *pExpr;.  ExprL
18e80 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d  ist *pEList = p-
18e90 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  >pEList;..  if( 
18ea0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
18eb0 20 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f   ) return WHERE_
18ec0 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
18ed0 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74    pExpr = pEList
18ee0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
18ef0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
18f00 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
18f10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
18f20 20 4e 45 56 45 52 28 45 78 70 72 48 61 73 50 72   NEVER(ExprHasPr
18f30 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
18f40 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29 20 72  _xIsSelect)) ) r
18f50 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
18f60 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
18f70 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
18f80 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e  ==0 || pEList->n
18f90 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
18fa0 20 30 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   0;.  if( pEList
18fb0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
18fc0 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
18fd0 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f  ) return WHERE_O
18fe0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
18ff0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
19000 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
19010 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
19020 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
19030 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
19040 54 6f 6b 65 6e 2c 22 6d 69 6e 22 29 3d 3d 30 20  Token,"min")==0 
19050 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48  ){.    return WH
19060 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b  ERE_ORDERBY_MIN;
19070 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
19080 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
19090 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 78  r->u.zToken,"max
190a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ")==0 ){.    ret
190b0 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
190c0 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72 65 74  Y_MAX;.  }.  ret
190d0 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
190e0 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a  Y_NORMAL;.}../*.
190f0 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
19100 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
19110 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
19120 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
19130 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
19140 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65 6e  he second argmen
19150 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61  t is the associa
19160 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e  ted aggregate-in
19170 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  fo object. This 
19180 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73  .** function tes
19190 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ts if the SELECT
191a0 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
191b0 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
191c0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
191d0 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  bl>.**.** where 
191e0 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62  table is a datab
191f0 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ase table, not a
19200 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
19210 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72  iew. If the quer
19220 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20  y.** does match 
19230 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68  this pattern, th
19240 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
19250 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
19260 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a   representing.**
19270 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e   <tbl> is return
19280 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
19290 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
192a0 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69  .static Table *i
192b0 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c  sSimpleCount(Sel
192c0 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20  ect *p, AggInfo 
192d0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61  *pAggInfo){.  Ta
192e0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70  ble *pTab;.  Exp
192f0 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73  r *pExpr;..  ass
19300 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42  ert( !p->pGroupB
19310 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  y );..  if( p->p
19320 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69  Where || p->pELi
19330 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20  st->nExpr!=1 .  
19340 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   || p->pSrc->nSr
19350 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d  c!=1 || p->pSrc-
19360 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20  >a[0].pSelect.  
19370 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
19380 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d  .  }.  pTab = p-
19390 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
193a0 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  ;.  pExpr = p->p
193b0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
193c0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
193d0 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c  b && !pTab->pSel
193e0 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a  ect && pExpr );.
193f0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
19400 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
19410 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
19420 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
19430 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
19440 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d    if( (pAggInfo-
19450 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d  >aFunc[0].pFunc-
19460 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55  >flags&SQLITE_FU
19470 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72  NC_COUNT)==0 ) r
19480 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
19490 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44  Expr->flags&EP_D
194a0 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
194b0 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54   0;..  return pT
194c0 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ab;.}../*.** If 
194d0 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
194e0 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61  item passed as a
194f0 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61  n argument was a
19500 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e  ugmented with an
19510 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63  .** INDEXED BY c
19520 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20  lause, then try 
19530 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70  to locate the sp
19540 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49  ecified index. I
19550 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73  f there.** was s
19560 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64  uch a clause and
19570 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
19580 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
19590 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
195a0 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65  ITE_ERROR and le
195b0 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
195c0 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73  pParse. Otherwis
195d0 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20  e, populate .** 
195e0 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e  pFrom->pIndex an
195f0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
19600 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
19610 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
19620 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
19630 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
19640 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
19650 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
19660 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78  && pFrom->zIndex
19670 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
19680 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
19690 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  b;.    char *zIn
196a0 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e  dex = pFrom->zIn
196b0 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  dex;.    Index *
196c0 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
196d0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
196e0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26   .        pIdx &
196f0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
19700 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49  (pIdx->zName, zI
19710 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20  ndex); .        
19720 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
19730 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
19740 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73  !pIdx ){.      s
19750 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
19760 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
19770 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64  index: %s", zInd
19780 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  ex, 0);.      re
19790 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
197a0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72  R;.    }.    pFr
197b0 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64  om->pIndex = pId
197c0 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
197d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
197e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
197f0 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c   is a Walker cal
19800 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e  lback for "expan
19810 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73  ding" a SELECT s
19820 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78  tatement..** "Ex
19830 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74  panding" means t
19840 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  o do the followi
19850 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ng:.**.**    (1)
19860 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45    Make sure VDBE
19870 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
19880 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
19890 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20  ed to every.**  
198a0 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f         element o
198b0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
198c0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
198d0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
198e0 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
198f0 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72  fields in the Sr
19900 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  cList that .**  
19910 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46         defines F
19920 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65  ROM clause.  Whe
19930 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69  n views appear i
19940 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
19950 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69  e,.**         fi
19960 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  ll pTabList->a[]
19970 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20  .pSelect with a 
19980 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
19990 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
199a0 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70          that imp
199b0 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
199c0 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  .  A copy is mad
199d0 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20  e of the view's 
199e0 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
199f0 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74    statement so t
19a00 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c  hat we can freel
19a10 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65  y modify or dele
19a20 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
19a30 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74  t.**         wit
19a40 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62  hout worrying ab
19a50 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74  out messing up t
19a60 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65  he presistent re
19a70 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  presentation.** 
19a80 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76          of the v
19a90 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33  iew..**.**    (3
19aa0 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20  )  Add terms to 
19ab0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
19ac0 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74   to accomodate t
19ad0 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
19ae0 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
19af0 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
19b00 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
19b10 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
19b20 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
19b30 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
19b40 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
19b50 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
19b60 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
19b70 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
19b80 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
19b90 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
19ba0 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
19bb0 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
19bc0 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
19bd0 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
19be0 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
19bf0 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
19c00 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
19c10 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
19c20 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74   TABLE..**.*/.st
19c30 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45  atic int selectE
19c40 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a  xpander(Walker *
19c50 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
19c60 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
19c70 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
19c80 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c  pParse;.  int i,
19c90 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74   j, k;.  SrcList
19ca0 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
19cb0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
19cc0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
19cd0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
19ce0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
19cf0 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
19d00 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19d10 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d  ){.    return
19d20 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
19d30 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70    if( NEVER(p->p
19d40 53 72 63 3d 3d 30 29 20 7c 7c 20 28 70 2d 3e 73  Src==0) || (p->s
19d50 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70  elFlags & SF_Exp
19d60 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20  anded)!=0 ){.   
19d70 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
19d80 65 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 65 6c 46  e;.  }.  p->selF
19d90 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e  lags |= SF_Expan
19da0 64 65 64 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  ded;.  pTabList 
19db0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
19dc0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
19dd0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
19de0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
19df0 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
19e00 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65  ed to all entrie
19e10 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52  s in.  ** the FR
19e20 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
19e30 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
19e40 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
19e50 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
19e60 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54  rsors(pParse, pT
19e70 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c  abList);..  /* L
19e80 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
19e90 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  le named in the 
19ea0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
19eb0 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20  he select.  If. 
19ec0 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   ** an entry of 
19ed0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
19ee0 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e  is a subquery in
19ef0 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65  stead of a table
19f00 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74   or view,.  ** t
19f10 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61  hen create a tra
19f20 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
19f30 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69  ucture to descri
19f40 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  be the subquery.
19f50 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
19f60 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
19f70 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
19f80 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
19f90 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
19fa0 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46  pTab;.    if( pF
19fb0 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a  rom->pTab!=0 ){.
19fc0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74        /* This st
19fd0 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65  atement has alre
19fe0 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65  ady been prepare
19ff0 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  d.  There is no 
1a000 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  need.      ** to
1a010 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a   go further. */.
1a020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
1a030 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  =0 );.      retu
1a040 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
1a050 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f    }.    if( pFro
1a060 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23  m->zName==0 ){.#
1a070 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a080 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1a090 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
1a0a0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
1a0b0 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
1a0c0 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
1a0d0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
1a0e0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73  LECT */.      as
1a0f0 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b  sert( pSel!=0 );
1a100 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a110 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
1a120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
1a130 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
1a140 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 70  , pSel);.      p
1a150 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
1a160 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
1a170 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
1a180 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  of(Table));.    
1a190 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
1a1a0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1a1b0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 64 62  ;.      pTab->db
1a1c0 4d 65 6d 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73  Mem = db->lookas
1a1d0 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3f 20 64  ide.bEnabled ? d
1a1e0 62 20 3a 20 30 3b 0a 20 20 20 20 20 20 70 54 61  b : 0;.      pTa
1a1f0 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  b->nRef = 1;.   
1a200 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
1a210 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1a220 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71  db, "sqlite_subq
1a230 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64  uery_%p_", (void
1a240 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77  *)pTab);.      w
1a250 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
1a260 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65  or ){ pSel = pSe
1a270 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20  l->pPrior; }.   
1a280 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73     selectColumns
1a290 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
1a2a0 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73  rse, pSel->pELis
1a2b0 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
1a2c0 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
1a2d0 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
1a2e0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62  = -1;.      pTab
1a2f0 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
1a300 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64  _Ephemeral;.#end
1a310 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
1a320 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61      /* An ordina
1a330 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  ry table or view
1a340 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f   name in the FRO
1a350 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
1a360 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
1a370 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
1a380 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
1a390 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20  pTab = .        
1a3a0 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
1a3b0 6c 65 28 70 50 61 72 73 65 2c 30 2c 70 46 72 6f  le(pParse,0,pFro
1a3c0 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e  m->zName,pFrom->
1a3d0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
1a3e0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
1a3f0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1a400 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  ;.      pTab->nR
1a410 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e  ef++;.#if !defin
1a420 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1a430 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
1a440 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49   (SQLITE_OMIT_VI
1a450 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
1a460 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
1a470 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  ect || IsVirtual
1a480 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
1a490 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65    /* We reach he
1a4a0 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  re if the named 
1a4b0 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c  table is a reall
1a4c0 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  y a view */.    
1a4d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
1a4e0 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
1a4f0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
1a500 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
1a510 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
1a520 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
1a530 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
1a540 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
1a550 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
1a560 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65  up(db, pTab->pSe
1a570 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lect, 0);.      
1a580 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
1a590 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72  ect(pWalker, pFr
1a5a0 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
1a5b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1a5c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74   }..    /* Locat
1a5d0 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  e the index name
1a5e0 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45 44  d by the INDEXED
1a5f0 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61   BY clause, if a
1a600 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ny. */.    if( s
1a610 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
1a620 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46  ookup(pParse, pF
1a630 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65  rom) ){.      re
1a640 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
1a650 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1a660 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20  Process NATURAL 
1a670 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e  keywords, and ON
1a680 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1a690 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a  es of joins..  *
1a6a0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
1a6b0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69  ocFailed || sqli
1a6c0 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
1a6d0 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
1a6e0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1a6f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  ;.  }..  /* For 
1a700 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
1a710 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
1a720 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
1a730 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
1a740 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
1a750 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
1a760 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
1a770 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
1a780 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
1a790 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
1a7a0 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
1a7b0 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
1a7c0 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
1a7d0 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
1a7e0 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  LL operator for 
1a7f0 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
1a800 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
1a810 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20  lumn list..  ** 
1a820 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
1a830 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
1a840 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c  ocate the TK_ALL
1a850 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
1a860 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63   expand.  ** eac
1a870 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
1a880 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
1a890 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   in all tables..
1a8a0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
1a8b0 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
1a8c0 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
1a8d0 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
1a8e0 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
1a8f0 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
1a900 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
1a910 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
1a920 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
1a930 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73  Expr *pE = pELis
1a940 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
1a950 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
1a960 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
1a970 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
1a980 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
1a990 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
1a9a0 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
1a9b0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d  !=TK_DOT || (pE-
1a9c0 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d  >pLeft!=0 && pE-
1a9d0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
1a9e0 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  D) );.    if( pE
1a9f0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
1aa00 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
1aa10 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a  TK_ALL ) break;.
1aa20 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69    }.  if( k<pELi
1aa30 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
1aa40 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65   /*.    ** If we
1aa50 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61   get here it mea
1aa60 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ns the result se
1aa70 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  t contains one o
1aa80 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a  r more "*".    *
1aa90 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  * operators that
1aaa0 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
1aab0 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f  nded.  Loop thro
1aac0 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
1aad0 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ion.    ** in th
1aae0 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
1aaf0 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65   expand them one
1ab00 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a   by one..    */.
1ab10 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
1ab20 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45  ist_item *a = pE
1ab30 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70  List->a;.    Exp
1ab40 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b  rList *pNew = 0;
1ab50 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
1ab60 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
1ab70 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67  gs;.    int long
1ab80 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26  Names = (flags &
1ab90 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
1aba0 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20  ames)!=0.       
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1abc0 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  & (flags & SQLIT
1abd0 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
1abe0 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d  ==0;..    for(k=
1abf0 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
1ac00 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
1ac10 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e  Expr *pE = a[k].
1ac20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1ac30 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
1ac40 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
1ac50 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t!=0 );.      if
1ac60 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ( pE->op!=TK_ALL
1ac70 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f   && (pE->op!=TK_
1ac80 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
1ac90 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29  t->op!=TK_ALL) )
1aca0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
1acb0 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70  s particular exp
1acc0 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
1acd0 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
1ace0 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nded..        */
1acf0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
1ad00 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1ad10 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
1ad20 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b  ew, a[k].pExpr);
1ad30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
1ad40 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
1ad50 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
1ad60 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b  pr-1].zName = a[
1ad70 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  k].zName;.      
1ad80 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
1ad90 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e  ->nExpr-1].zSpan
1ada0 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20   = a[k].zSpan;. 
1adb0 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e           a[k].zN
1adc0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
1add0 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20     a[k].zSpan = 
1ade0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1adf0 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
1ae00 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1ae10 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
1ae20 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
1ae30 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c  a "*" or a "TABL
1ae40 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74  E.*" and needs t
1ae50 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  o be.        ** 
1ae60 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20  expanded. */.   
1ae70 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65       int tableSe
1ae80 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  en = 0;      /* 
1ae90 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41  Set to 1 when TA
1aea0 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20  BLE matches */. 
1aeb0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e         char *zTN
1aec0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1aed0 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
1aee0 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
1aef0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
1af00 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
1af10 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
1af20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
1af30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1af40 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1af50 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74  E->pLeft, EP_Int
1af60 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1af70 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d      zTName = pE-
1af80 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pLeft->u.zToken
1af90 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1afa0 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
1afb0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
1afc0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
1afd0 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
1afe0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
1aff0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
1b000 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
1b010 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
1b020 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
1b030 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
1b040 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
1b050 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ias;.          i
1b060 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29  f( zTabName==0 )
1b070 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
1b080 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
1b090 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
1b0a0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1b0b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1b0c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1b0d0 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
1b0e0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
1b0f0 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  (zTName, zTabNam
1b100 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
1b110 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1b120 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1b130 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d       tableSeen =
1b140 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   1;.          fo
1b150 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
1b160 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
1b170 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
1b180 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20  pr, *pRight;.   
1b190 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
1b1a0 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Name = pTab->aCo
1b1b0 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l[j].zName;.    
1b1c0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43          char *zC
1b1d0 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20  olname;  /* The 
1b1e0 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  computed column 
1b1f0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
1b200 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65      char *zToFre
1b210 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64  e;   /* Malloced
1b220 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65   string that nee
1b230 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  ds to be freed *
1b240 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f  /.            To
1b250 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f  ken sColname;  /
1b260 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  * Computed colum
1b270 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65  n name as a toke
1b280 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20  n */..          
1b290 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
1b2a0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
1b2b0 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c  idden' (currentl
1b2c0 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a  y only possible.
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66              ** f
1b2e0 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
1b2f0 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75  s), do not inclu
1b300 64 65 20 69 74 20 69 6e 20 74 68 65 20 65 78 70  de it in the exp
1b310 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20  anded.          
1b320 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20    ** result-set 
1b330 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20  list..          
1b340 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
1b350 20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c   if( IsHiddenCol
1b360 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  umn(&pTab->aCol[
1b370 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j]) ){.         
1b380 20 20 20 20 20 61 73 73 65 72 74 28 49 73 56 69       assert(IsVi
1b390 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20  rtual(pTab));.  
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1b3b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1b3c0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1b3d0 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61   if( i>0 && zTNa
1b3e0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
1b3f0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
1b400 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66  cList_item *pLef
1b410 74 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  t = &pTabList->a
1b420 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  [i-1];.         
1b430 20 20 20 20 20 69 66 28 20 28 70 4c 65 66 74 5b       if( (pLeft[
1b440 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
1b450 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a  _NATURAL)!=0 &&.
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e          columnIn
1b480 64 65 78 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c  dex(pLeft->pTab,
1b490 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b4b0 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
1b4c0 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
1b4d0 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
1b4e0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
1b4f0 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20      ** table on 
1b500 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20  the right */.   
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
1b520 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1b530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b540 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1b550 49 64 4c 69 73 74 49 6e 64 65 78 28 70 4c 65 66  IdListIndex(pLef
1b560 74 5b 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61  t[1].pUsing, zNa
1b570 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
1b580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
1b590 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
1b5a0 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
1b5b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5d0 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20  ** using clause 
1b5e0 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f  from the table o
1b5f0 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a  n the right. */.
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b610 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1b620 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b640 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
1b650 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
1b660 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ID, zName);.    
1b670 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
1b680 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
1b690 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
1b6a0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
1b6b0 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20  f( longNames || 
1b6c0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
1b6d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b6e0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20    Expr *pLeft;. 
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
1b700 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
1b710 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62  (db, TK_ID, zTab
1b720 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
1b730 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
1b740 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1b750 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
1b760 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
1b770 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
1b780 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
1b790 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
1b7a0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
1b7b0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
1b7c0 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
1b7d0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1b7e0 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
1b7f0 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
1b800 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b810 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b820 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
1b830 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
1b840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b850 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1b860 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1b870 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
1b880 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
1b890 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20     sColname.z = 
1b8a0 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
1b8b0 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e        sColname.n
1b8c0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1b8d0 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  30(zColname);.  
1b8e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b8f0 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
1b900 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26  (pParse, pNew, &
1b910 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  sColname, 0);.  
1b920 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b930 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
1b940 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
1b950 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1b960 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
1b970 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
1b980 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
1b990 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b9a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1b9b0 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
1b9c0 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
1b9d0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1b9e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1b9f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1ba00 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
1ba10 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
1ba20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ba30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1ba40 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1ba50 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1ba60 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
1ba70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
1ba80 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
1ba90 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
1baa0 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45  >pEList && p->pE
1bab0 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
1bac0 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
1bad0 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
1bae0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1baf0 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
1bb00 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
1bb10 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
1bb20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
1bb30 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1bb40 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72  }../*.** No-op r
1bb50 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70  outine for the p
1bb60 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72  arse-tree walker
1bb70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1bb80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
1bb90 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
1bba0 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65  lback then expre
1bbb0 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61  ssion trees.** a
1bbc0 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75  re walked withou
1bbd0 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65  t any actions be
1bbe0 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63  ing taken at eac
1bbf0 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61  h node.  Presuma
1bc00 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69  bly,.** when thi
1bc10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1bc20 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78  d for Walker.xEx
1bc30 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
1bc40 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  .** Walker.xSele
1bc50 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65  ctCallback is se
1bc60 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  t to do somethin
1bc70 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65  g useful for eve
1bc80 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ry .** subquery 
1bc90 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
1bca0 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
1bcb0 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57  t exprWalkNoop(W
1bcc0 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
1bcd0 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b  Expr *NotUsed2){
1bce0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1bcf0 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
1bd00 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
1bd10 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1bd20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1bd30 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
1bd40 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1bd50 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
1bd60 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
1bd70 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
1bd80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
1bd90 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
1bda0 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
1bdb0 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
1bdc0 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
1bdd0 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
1bde0 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
1bdf0 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
1be00 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
1be10 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
1be20 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
1be30 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
1be40 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
1be50 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
1be60 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
1be70 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
1be80 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
1be90 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
1bea0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
1beb0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
1bec0 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
1bed0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
1bee0 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
1bef0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1bf00 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
1bf10 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
1bf20 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
1bf30 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
1bf40 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1bf50 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
1bf60 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
1bf70 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
1bf80 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
1bf90 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
1bfa0 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65  alker w;.  w.xSe
1bfb0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
1bfc0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20  electExpander;. 
1bfd0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
1bfe0 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
1bff0 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
1c000 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
1c010 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
1c020 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  elect);.}...#ifn
1c030 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c040 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
1c050 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e  his is a Walker.
1c060 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1c070 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
1c080 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79   sqlite3SelectTy
1c090 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65  peInfo().** inte
1c0a0 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rface..**.** For
1c0b0 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73   each FROM-claus
1c0c0 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20  e subquery, add 
1c0d0 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64  Column.zType and
1c0e0 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a   Column.zColl.**
1c0f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
1c100 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
1c110 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
1c120 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
1c130 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75  et.** of that su
1c140 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
1c150 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
1c160 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
1c170 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
1c180 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64   was constructed
1c190 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70  .** by selectExp
1c1a0 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20  ander() but the 
1c1b0 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
1c1c0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  on information w
1c1d0 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74  as omitted.** at
1c1e0 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61   that point beca
1c1f0 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20  use identifiers 
1c200 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  had not yet been
1c210 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73   resolved.  This
1c220 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
1c230 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e  alled after iden
1c240 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f  tifier resolutio
1c250 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1c260 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
1c270 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65  ryTypeInfo(Walke
1c280 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
1c290 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
1c2a0 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  *pParse;.  int i
1c2b0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
1c2c0 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
1c2d0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
1c2e0 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rom;..  assert( 
1c2f0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1c300 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 61  _Resolved );.  a
1c310 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
1c320 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
1c330 49 6e 66 6f 29 3d 3d 30 20 29 3b 0a 20 20 70 2d  Info)==0 );.  p-
1c340 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
1c350 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70  HasTypeInfo;.  p
1c360 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
1c370 3e 70 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c  >pParse;.  pTabL
1c380 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
1c390 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
1c3a0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
1c3b0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1c3c0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
1c3d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1c3e0 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
1c3f0 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62   if( ALWAYS(pTab
1c400 21 3d 30 29 20 26 26 20 28 70 54 61 62 2d 3e 74  !=0) && (pTab->t
1c410 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
1c420 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20  emeral)!=0 ){.  
1c430 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
1c440 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
1c450 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1c460 54 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  T */.      Selec
1c470 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
1c480 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
1c490 61 73 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a  assert( pSel );.
1c4a0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
1c4b0 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  l->pPrior ) pSel
1c4c0 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
1c4d0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 41 64 64  .      selectAdd
1c4e0 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
1c4f0 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
1c500 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d  Tab->nCol, pTab-
1c510 3e 61 43 6f 6c 2c 20 70 53 65 6c 29 3b 0a 20 20  >aCol, pSel);.  
1c520 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1c530 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
1c540 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1c550 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
1c560 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
1c570 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1c580 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
1c590 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
1c5a0 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
1c5b0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
1c5c0 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
1c5d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1c5e0 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
1c5f0 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
1c600 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
1c610 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1c620 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
1c630 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
1c640 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
1c650 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
1c660 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1c670 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
1c680 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
1c690 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64  back = selectAdd
1c6a0 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
1c6b0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
1c6c0 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f  ack = exprWalkNo
1c6d0 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
1c6e0 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
1c6f0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
1c700 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69   pSelect);.#endi
1c710 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f.}.../*.** This
1c720 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 6f 66   routine sets of
1c730 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1c740 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ent for processi
1c750 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c  ng.  The.** foll
1c760 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c  owing is accompl
1c770 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ished:.**.**    
1c780 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20   *  VDBE Cursor 
1c790 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69  numbers are assi
1c7a0 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d  gned to all FROM
1c7b0 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a  -clause terms..*
1c7c0 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72  *     *  Ephemer
1c7d0 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73  al Table objects
1c7e0 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
1c7f0 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
1c800 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20   subqueries..** 
1c810 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53      *  ON and US
1c820 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20  ING clauses are 
1c830 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45  shifted into WHE
1c840 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  RE statements.**
1c850 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64       *  Wildcard
1c860 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45  s "*" and "TABLE
1c870 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65  .*" in result se
1c880 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e  ts are expanded.
1c890 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74  .**     *  Ident
1c8a0 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73  ifiers in expres
1c8b0 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64  sion are matched
1c8c0 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   to tables..**.*
1c8d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1c8e0 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20  cts recursively 
1c8f0 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65  on all subquerie
1c900 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c  s within the SEL
1c910 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
1c920 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a  ite3SelectPrep(.
1c930 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1c940 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c950 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
1c960 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1c970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c980 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1c990 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
1c9a0 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
1c9b0 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e   *pOuterNC  /* N
1c9c0 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
1c9d0 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a  container */.){.
1c9e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1c9f0 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
1ca00 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20   ) return;.  db 
1ca10 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1ca20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
1ca30 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
1ca40 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
1ca50 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
1ca60 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
1ca70 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1ca80 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1ca90 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
1caa0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
1cab0 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65  lectNames(pParse
1cac0 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  , p, pOuterNC);.
1cad0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1cae0 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
1caf0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
1cb00 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1cb10 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72  AddTypeInfo(pPar
1cb20 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se, p);.}../*.**
1cb30 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
1cb40 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
1cb50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
1cb60 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
1cb70 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
1cb80 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
1cb90 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
1cba0 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
1cbb0 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
1cbc0 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
1cbd0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69  is.** routine si
1cbe0 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c  mply stores NULL
1cbf0 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73  s in all of thos
1cc00 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a  e memory cells..
1cc10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1cc20 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
1cc30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
1cc40 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1cc50 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1cc60 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1cc70 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1cc80 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
1cc90 75 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49  unc;.  if( pAggI
1cca0 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49  nfo->nFunc+pAggI
1ccb0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20  nfo->nColumn==0 
1ccc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1ccd0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1cce0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
1ccf0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  n; i++){.    sql
1cd00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1cd10 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41  , OP_Null, 0, pA
1cd20 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
1cd30 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  iMem);.  }.  for
1cd40 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
1cd50 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
1cd60 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
1cd70 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
1cd80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cd90 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
1cda0 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29   0, pFunc->iMem)
1cdb0 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  ;.    if( pFunc-
1cdc0 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
1cdd0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
1cde0 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a  = pFunc->pExpr;.
1cdf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1ce00 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1ce10 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  E, EP_xIsSelect)
1ce20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
1ce30 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
1ce40 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pE->x.pList->nEx
1ce50 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr!=1 ){.       
1ce60 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1ce70 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
1ce80 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75  CT aggregates mu
1ce90 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20  st have exactly 
1cea0 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  one ".          
1ceb0 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20   "argument");.  
1cec0 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
1ced0 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
1cee0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cef0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1cf00 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
1cf10 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
1cf20 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  , pE->x.pList);.
1cf30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1cf40 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1cf50 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
1cf60 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
1cf70 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
1cf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf90 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
1cfa0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
1cfb0 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  DOFF);.      }. 
1cfc0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1cfd0 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f  * Invoke the OP_
1cfe0 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f  AggFinalize opco
1cff0 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67  de for every agg
1d000 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
1d010 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66  ** in the AggInf
1d020 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  o structure..*/.
1d030 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61  static void fina
1d040 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
1d050 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d060 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1d070 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
1d080 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1d090 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1d0a0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
1d0b0 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  F;.  for(i=0, pF
1d0c0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
1d0d0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
1d0e0 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
1d0f0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1d100 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
1d110 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
1d120 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1d130 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
1d140 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1d150 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
1d160 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1d170 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d  AggFinal, pF->iM
1d180 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  em, pList ? pLis
1d190 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c  t->nExpr : 0, 0,
1d1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d1b0 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
1d1c0 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
1d1d0 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DEF);.  }.}../*.
1d1e0 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63  ** Update the ac
1d1f0 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79  cumulator memory
1d200 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67   cells for an ag
1d210 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e  gregate based on
1d220 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
1d230 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
1d240 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d250 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
1d260 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1d270 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
1d280 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
1d290 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1d2a0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1d2b0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
1d2c0 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67  pF;.  struct Agg
1d2d0 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20  Info_col *pC;.. 
1d2e0 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
1d2f0 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 73 71 6c  tMode = 1;.  sql
1d300 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
1d310 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
1d320 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
1d330 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
1d340 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
1d350 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e  +, pF++){.    in
1d360 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  t nArg;.    int 
1d370 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20  addrNext = 0;.  
1d380 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20    int regAgg;.  
1d390 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1d3a0 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
1d3b0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
1d3c0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1d3d0 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
1d3e0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1d3f0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
1d400 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70  {.      nArg = p
1d410 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
1d420 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69     regAgg = sqli
1d430 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1d440 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20  pParse, nArg);. 
1d450 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d460 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
1d470 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41  rse, pList, regA
1d480 67 67 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  gg, 0);.    }els
1d490 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  e{.      nArg = 
1d4a0 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  0;.      regAgg 
1d4b0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
1d4c0 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
1d4d0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
1d4e0 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
1d4f0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1d500 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
1d510 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Arg==1 );.      
1d520 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
1d530 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  rse, pF->iDistin
1d540 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
1d550 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a   regAgg);.    }.
1d560 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
1d570 63 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  c->flags & SQLIT
1d580 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
1d590 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
1d5a0 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
1d5b0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1d5c0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1d5d0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
1d5e0 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
1d5f0 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
1d600 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
1d610 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f   has NEEDCOLL */
1d620 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
1d630 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
1d640 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67  !pColl && j<nArg
1d650 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
1d660 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
1d670 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1d680 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
1d690 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
1d6a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
1d6b0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
1d6c0 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
1d6d0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1d6e0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1d6f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1d700 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
1d710 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
1d720 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
1d730 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1d740 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1d750 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20   OP_AggStep, 0, 
1d760 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d  regAgg, pF->iMem
1d770 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d780 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
1d790 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
1d7a0 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74  CDEF);.    sqlit
1d7b0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1d7c0 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20  , (u8)nArg);.   
1d7d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1d7e0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1d7f0 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
1d800 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1d810 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
1d820 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
1d830 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66  g, nArg);.    if
1d840 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20  ( addrNext ){.  
1d850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1d860 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
1d870 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  ddrNext);.      
1d880 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1d890 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
1d8a0 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
1d8b0 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d  =0, pC=pAggInfo-
1d8c0 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66  >aCol; i<pAggInf
1d8d0 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b  o->nAccumulator;
1d8e0 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20   i++, pC++){.   
1d8f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d900 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78  (pParse, pC->pEx
1d910 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20  pr, pC->iMem);. 
1d920 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64   }.  pAggInfo->d
1d930 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20  irectMode = 0;. 
1d940 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1d950 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
1d960 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1d970 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  e code for the S
1d980 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1d990 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61  given in the p a
1d9a0 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  rgument.  .**.**
1d9b0 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
1d9c0 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
1d9d0 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70  various ways dep
1d9e0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a  ending on the.**
1d9f0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1da00 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
1da10 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
1da20 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65   by argument pDe
1da30 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73  st.** as follows
1da40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73  :.**.**     pDes
1da50 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73 75  t->eDest    Resu
1da60 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d  lt.**     ------
1da70 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
1da80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1da90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1daa0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54  -----.**     SRT
1dab0 5f 4f 75 74 70 75 74 20 20 20 20 20 20 47 65 6e  _Output      Gen
1dac0 65 72 61 74 65 20 61 20 72 6f 77 20 6f 66 20 6f  erate a row of o
1dad0 75 74 70 75 74 20 28 75 73 69 6e 67 20 74 68 65  utput (using the
1dae0 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a   OP_ResultRow.**
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db00 20 20 20 20 20 6f 70 63 6f 64 65 29 20 66 6f 72       opcode) for
1db10 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65   each row in the
1db20 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a   result set..**.
1db30 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20  **     SRT_Mem  
1db40 20 20 20 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69         Only vali
1db50 64 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  d if the result 
1db60 69 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  is a single colu
1db70 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  mn..**          
1db80 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65             Store
1db90 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   the first colum
1dba0 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  n of the first r
1dbb0 65 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20  esult row.**    
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbd0 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65   in register pDe
1dbe0 73 74 2d 3e 69 50 61 72 6d 20 74 68 65 6e 20 61  st->iParm then a
1dbf0 62 61 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a  bandon the rest.
1dc00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1dc10 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 71 75         of the qu
1dc20 65 72 79 2e 20 20 54 68 69 73 20 64 65 73 74 69  ery.  This desti
1dc30 6e 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22  nation implies "
1dc40 4c 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20  LIMIT 1"..**.** 
1dc50 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20      SRT_Set     
1dc60 20 20 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d      The result m
1dc70 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ust be a single 
1dc80 63 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65  column.  Store e
1dc90 61 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ach.**          
1dca0 20 20 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f             row o
1dcb0 66 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20  f result as the 
1dcc0 6b 65 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65  key in table pDe
1dcd0 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20  st->iParm. .**  
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcf0 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66     Apply the aff
1dd00 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66  inity pDest->aff
1dd10 69 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74 6f  inity before sto
1dd20 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ring.**         
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75              resu
1dd40 6c 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d  lts.  Used to im
1dd50 70 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c  plement "IN (SEL
1dd60 45 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a  ECT ...)"..**.**
1dd70 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20       SRT_Union  
1dd80 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
1dd90 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61  ts as a key in a
1dda0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1ddb0 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
1ddc0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63  *.**     SRT_Exc
1ddd0 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20  ept      Remove 
1dde0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65  results from the
1ddf0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1de00 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
1de10 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62  *.**     SRT_Tab
1de20 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  le       Store r
1de30 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72  esults in tempor
1de40 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
1de50 3e 69 50 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20  >iParm..**      
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
1de70 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f  his is like SRT_
1de80 45 70 68 65 6d 54 61 62 20 65 78 63 65 70 74 20  EphemTab except 
1de90 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 0a 2a  that the table.*
1dea0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1deb0 20 20 20 20 20 20 69 73 20 61 73 73 75 6d 65 64        is assumed
1dec0 20 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20 6f   to already be o
1ded0 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  pen..**.**     S
1dee0 52 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43  RT_EphemTab    C
1def0 72 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61  reate an tempora
1df00 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
1df10 69 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a  iParm and store.
1df20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1df30 20 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c         the resul
1df40 74 20 74 68 65 72 65 2e 20 54 68 65 20 63 75 72  t there. The cur
1df50 73 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e  sor is left open
1df60 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20   after.**       
1df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1df80 74 75 72 6e 69 6e 67 2e 20 20 54 68 69 73 20 69  turning.  This i
1df90 73 20 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c 65  s like SRT_Table
1dfa0 20 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20   except that.** 
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfc0 20 20 20 20 74 68 69 73 20 64 65 73 74 69 6e 61      this destina
1dfd0 74 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65  tion uses OP_Ope
1dfe0 6e 45 70 68 65 6d 65 72 61 6c 20 74 6f 20 63 72  nEphemeral to cr
1dff0 65 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  eate.**         
1e000 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
1e010 74 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a  table first..**.
1e020 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f 75  **     SRT_Corou
1e030 74 69 6e 65 20 20 20 47 65 6e 65 72 61 74 65 20  tine   Generate 
1e040 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61  a co-routine tha
1e050 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20  t returns a new 
1e060 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  row of.**       
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1e080 73 75 6c 74 73 20 65 61 63 68 20 74 69 6d 65 20  sults each time 
1e090 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20  it is invoked.  
1e0a0 54 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a  The entry point.
1e0b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1e0c0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
1e0d0 2d 72 6f 75 74 69 6e 65 20 69 73 20 73 74 6f 72  -routine is stor
1e0e0 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 70  ed in register p
1e0f0 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a  Dest->iParm..**.
1e100 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74  **     SRT_Exist
1e110 73 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31  s      Store a 1
1e120 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
1e130 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 69 66 20  pDest->iParm if 
1e140 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20  the result.**   
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e160 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d 70    set is not emp
1e170 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  ty..**.**     SR
1e180 54 5f 44 69 73 63 61 72 64 20 20 20 20 20 54 68  T_Discard     Th
1e190 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73 20  row the results 
1e1a0 61 77 61 79 2e 20 20 54 68 69 73 20 69 73 20 75  away.  This is u
1e1b0 73 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a 2a  sed by SELECT.**
1e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1d0 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73 20       statements 
1e1e0 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 20  within triggers 
1e1f0 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70 6f  whose only purpo
1e200 73 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  se is.**        
1e210 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
1e220 20 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f 66   side-effects of
1e230 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a   functions..**.*
1e240 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1e250 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
1e260 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
1e270 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
1e280 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
1e290 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
1e2a0 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
1e2b0 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
1e2c0 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
1e2d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1e2e0 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
1e2f0 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
1e300 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
1e310 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
1e320 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
1e330 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
1e340 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
1e350 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
1e360 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
1e370 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
1e380 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
1e390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1e3a0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
1e3b0 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
1e3c0 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  d. */.  SelectDe
1e3d0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f  st *pDest      /
1e3e0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
1e3f0 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  h the query resu
1e400 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
1e410 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
1e420 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1e430 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ers */.  WhereIn
1e440 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
1e450 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73  /* Return from s
1e460 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1e470 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  () */.  Vdbe *v;
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e490 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
1e4a0 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
1e4b0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1e4c0 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20  t isAgg;        
1e4d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1e4e0 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
1e4f0 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
1e500 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1e510 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
1e520 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
1e530 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
1e540 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
1e550 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1e560 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
1e570 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
1e580 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
1e590 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1e5a0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
1e5b0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
1e5c0 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
1e5d0 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
1e5e0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
1e5f0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
1e600 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
1e610 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
1e620 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
1e630 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
1e640 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
1e650 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
1e660 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
1e670 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  NULL */.  int is
1e680 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
1e690 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1e6a0 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
1e6b0 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
1e6c0 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20   int distinct;  
1e6d0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1e6e0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
1e6f0 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a  distinct set */.
1e700 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
1e710 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1e720 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
1e730 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
1e740 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74  /.  int addrSort
1e750 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64  Index;     /* Ad
1e760 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f  dress of an OP_O
1e770 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
1e780 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67  truction */.  Ag
1e790 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20  gInfo sAggInfo; 
1e7a0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1e7b0 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72  ion used by aggr
1e7c0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f  egate queries */
1e7d0 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20  .  int iEnd;    
1e7e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1e7f0 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20  ress of the end 
1e800 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
1e810 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
1e820 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e830 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1e840 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70  ion */..  db = p
1e850 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1e860 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   p==0 || db->mal
1e870 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
1e880 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
1e890 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
1e8a0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1e8b0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1e8c0 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
1e8d0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
1e8e0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
1e8f0 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
1e900 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 69  sAggInfo));..  i
1e910 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
1e920 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
1e930 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e    assert(pDest->
1e940 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74  eDest==SRT_Exist
1e950 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  s || pDest->eDes
1e960 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20  t==SRT_Union || 
1e970 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
1e980 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
1e990 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65  cept || pDest->e
1e9a0 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
1e9b0 64 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52  d);.    /* If OR
1e9c0 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20  DER BY makes no 
1e9d0 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
1e9e0 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65  e output then ne
1e9f0 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a  ither does.    *
1ea00 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74  * DISTINCT so it
1ea10 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20   can be removed 
1ea20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  too. */.    sqli
1ea30 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
1ea40 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
1ea50 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  y);.    p->pOrde
1ea60 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
1ea70 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
1ea80 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20  Distinct;.  }.  
1ea90 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
1eaa0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b  p(pParse, p, 0);
1eab0 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
1eac0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61  >pOrderBy;.  pTa
1ead0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1eae0 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
1eaf0 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 50 61  EList;.  if( pPa
1eb00 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1eb10 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1eb20 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
1eb30 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73 41 67  _end;.  }.  isAg
1eb40 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  g = (p->selFlags
1eb50 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
1eb60 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  !=0;.  assert( p
1eb70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f  EList!=0 );..  /
1eb80 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
1eb90 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
1eba0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1ebb0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1ebc0 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
1ebd0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
1ebe0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1ebf0 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
1ec00 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
1ec10 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ause.  */.#if !d
1ec20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1ec30 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1ec40 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1ec50 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
1ec60 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72  (i=0; !p->pPrior
1ec70 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e   && i<pTabList->
1ec80 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
1ec90 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1eca0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
1ecb0 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
1ecc0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
1ecd0 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
1ece0 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
1ecf0 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  lect;.    int is
1ed00 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69 66 28  AggSub;..    if(
1ed10 20 70 53 75 62 3d 3d 30 20 7c 7c 20 70 49 74 65   pSub==0 || pIte
1ed20 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29  m->isPopulated )
1ed30 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
1ed40 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72  /* Increment Par
1ed50 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68  se.nHeight by th
1ed60 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20  e height of the 
1ed70 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69  largest expressi
1ed80 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72  on.    ** tree r
1ed90 65 66 65 72 65 64 20 74 6f 20 62 79 20 74 68 69  efered to by thi
1eda0 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65  s, the parent se
1edb0 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20  lect. The child 
1edc0 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61  select.    ** ma
1edd0 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73  y contain expres
1ede0 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74  sion trees of at
1edf0 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51   most.    ** (SQ
1ee00 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
1ee10 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68  PTH-Parse.nHeigh
1ee20 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20  t) height. This 
1ee30 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20  is a bit.    ** 
1ee40 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76  more conservativ
1ee50 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  e than necessary
1ee60 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65  , but much easie
1ee70 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67  r than enforcing
1ee80 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74  .    ** an exact
1ee90 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   limit..    */. 
1eea0 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
1eeb0 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht += sqlite3Sel
1eec0 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
1eed0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
1eee0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 75  to see if the su
1eef0 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
1ef00 73 6f 72 62 65 64 20 69 6e 74 6f 20 74 68 65 20  sorbed into the 
1ef10 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69  parent. */.    i
1ef20 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d  sAggSub = (pSub-
1ef30 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
1ef40 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
1ef50 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62    if( flattenSub
1ef60 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  query(pParse, p,
1ef70 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67   i, isAgg, isAgg
1ef80 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Sub) ){.      if
1ef90 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20  ( isAggSub ){.  
1efa0 20 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b        isAgg = 1;
1efb0 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
1efc0 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65  lags |= SF_Aggre
1efd0 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gate;.      }.  
1efe0 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
1eff0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1f000 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
1f010 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70  it(&dest, SRT_Ep
1f020 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69  hemTab, pItem->i
1f030 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61  Cursor);.      a
1f040 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 73  ssert( pItem->is
1f050 50 6f 70 75 6c 61 74 65 64 3d 3d 30 20 29 3b 0a  Populated==0 );.
1f060 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
1f070 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
1f080 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
1f090 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74  pItem->isPopulat
1f0a0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
1f0b0 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e    if( /*pParse->
1f0c0 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61  nErr ||*/ db->ma
1f0d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1f0e0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
1f0f0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  end;.    }.    p
1f100 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
1f110 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
1f120 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20  xprHeight(p);.  
1f130 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
1f140 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49  pSrc;.    if( !I
1f150 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
1f160 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
1f170 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
1f180 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20  rderBy;.    }.  
1f190 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  }.  pEList = p->
1f1a0 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20  pEList;.#endif. 
1f1b0 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
1f1c0 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  ere;.  pGroupBy 
1f1d0 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
1f1e0 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
1f1f0 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74 69  aving;.  isDisti
1f200 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  nct = (p->selFla
1f210 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1f220 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53  )!=0;..#ifndef S
1f230 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
1f240 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
1f250 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20  If there is are 
1f260 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75  a sequence of qu
1f270 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61  eries, do the ea
1f280 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74  rlier ones first
1f290 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1f2a0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
1f2b0 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
1f2c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  =0 ){.      Sele
1f2d0 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67  ct *pLoop, *pRig
1f2e0 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  ht = 0;.      in
1f2f0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  t cnt = 0;.     
1f300 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a 20   int mxSelect;. 
1f310 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70       for(pLoop=p
1f320 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
1f330 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e  Loop->pPrior, cn
1f340 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t++){.        pL
1f350 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  oop->pRightmost 
1f360 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  = p;.        pLo
1f370 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67  op->pNext = pRig
1f380 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67  ht;.        pRig
1f390 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20  ht = pLoop;.    
1f3a0 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c 65    }.      mxSele
1f3b0 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  ct = db->aLimit[
1f3c0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
1f3d0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a 20  POUND_SELECT];. 
1f3e0 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65 63       if( mxSelec
1f3f0 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65 63  t && cnt>mxSelec
1f400 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1f410 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1f420 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74  rse, "too many t
1f430 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64  erms in compound
1f440 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20   SELECT");.     
1f450 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f460 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
1f470 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
1f480 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
1f490 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  st);.  }.#endif.
1f4a0 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
1f4b0 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
1f4c0 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
1f4d0 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
1f4e0 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
1f4f0 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66  output..  */.#if
1f500 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f510 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
1f520 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
1f530 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70  umnSelectError(p
1f540 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45  Parse, pDest, pE
1f550 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
1f560 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
1f570 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  end;.  }.#endif.
1f580 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c  .  /* If possibl
1f590 65 2c 20 72 65 77 72 69 74 65 20 74 68 65 20 71  e, rewrite the q
1f5a0 75 65 72 79 20 74 6f 20 75 73 65 20 47 52 4f 55  uery to use GROU
1f5b0 50 20 42 59 20 69 6e 73 74 65 61 64 20 6f 66 20  P BY instead of 
1f5c0 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a 20 47  DISTINCT..  ** G
1f5d0 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75 73  ROUP BY might us
1f5e0 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53 54  e an index, DIST
1f5f0 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73 2e  INCT never does.
1f600 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1f610 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 7c  p->pGroupBy==0 |
1f620 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
1f630 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
1f640 30 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73  0 );.  if( (p->s
1f650 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
1f660 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
1f670 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
1f680 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 47 72  ct ){.    p->pGr
1f690 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
1f6a0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
1f6b0 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  ->pEList, 0);.  
1f6c0 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
1f6d0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 2d  pGroupBy;.    p-
1f6e0 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
1f6f0 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 69  _Distinct;.    i
1f700 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  sDistinct = 0;. 
1f710 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
1f720 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1f730 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
1f740 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20  is sorting.  ** 
1f750 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20  index might end 
1f760 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20  up being unused 
1f770 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20  if the data can 
1f780 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74  be .  ** extract
1f790 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64  ed in pre-sorted
1f7a0 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61 74   order.  If that
1f7b0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
1f7c0 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f  en the.  ** OP_O
1f7d0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
1f7e0 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  truction will be
1f7f0 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
1f800 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a  P_Noop once.  **
1f810 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74   we figure out t
1f820 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20  hat the sorting 
1f830 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65  index is not nee
1f840 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f  ded.  The addrSo
1f850 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72  rtIndex.  ** var
1f860 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
1f870 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74   facilitate that
1f880 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20   change..  */.  
1f890 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
1f8a0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
1f8b0 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49  yInfo;.    pKeyI
1f8c0 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
1f8d0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
1f8e0 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
1f8f0 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
1f900 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
1f910 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64  ab++;.    p->add
1f920 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61  rOpenEphm[2] = a
1f930 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
1f940 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f950 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
1f960 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
1f970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f980 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
1f990 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65  >iECursor, pOrde
1f9a0 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c  rBy->nExpr+2, 0,
1f9b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1f9d0 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
1f9e0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
1f9f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1fa00 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d  ddrSortIndex = -
1fa10 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1fa20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
1fa30 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
1fa40 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
1fa50 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
1fa60 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
1fa70 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
1fa80 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  mTab ){.    sqli
1fa90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1faa0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1fab0 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c  l, pDest->iParm,
1fac0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
1fad0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
1fae0 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f  he limiter..  */
1faf0 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65  .  iEnd = sqlite
1fb00 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1fb10 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  );.  computeLimi
1fb20 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
1fb30 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  e, p, iEnd);..  
1fb40 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61  /* Open a virtua
1fb50 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
1fb60 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
1fb70 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
1fb80 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  isDistinct ){.  
1fb90 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1fba0 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nfo;.    assert(
1fbb0 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75 70   isAgg || pGroup
1fbc0 42 79 20 29 3b 0a 20 20 20 20 64 69 73 74 69 6e  By );.    distin
1fbd0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
1fbe0 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  b++;.    pKeyInf
1fbf0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
1fc00 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1fc10 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
1fc20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fc30 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
1fc40 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c  meral, distinct,
1fc50 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1fc70 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
1fc80 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
1fc90 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FF);.  }else{.  
1fca0 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b    distinct = -1;
1fcb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65  .  }..  /* Aggre
1fcc0 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67  gate and non-agg
1fcd0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 61  regate queries a
1fce0 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  re handled diffe
1fcf0 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20  rently */.  if( 
1fd00 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70  !isAgg && pGroup
1fd10 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  By==0 ){.    /* 
1fd20 54 68 69 73 20 63 61 73 65 20 69 73 20 66 6f 72  This case is for
1fd30 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71   non-aggregate q
1fd40 75 65 72 69 65 73 0a 20 20 20 20 2a 2a 20 42 65  ueries.    ** Be
1fd50 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
1fd60 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20   scan.    */.   
1fd70 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
1fd80 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
1fd90 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
1fda0 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79 2c  here, &pOrderBy,
1fdb0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49   0);.    if( pWI
1fdc0 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
1fdd0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
1fde0 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64  * If sorting ind
1fdf0 65 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61  ex that was crea
1fe00 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f  ted by a prior O
1fe10 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
1fe20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  .    ** instruct
1fe30 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74  ion ended up not
1fe40 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74   being needed, t
1fe50 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f  hen change the O
1fe60 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a  P_OpenEphemeral.
1fe70 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f      ** into an O
1fe80 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  P_Noop..    */. 
1fe90 20 20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49     if( addrSortI
1fea0 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65  ndex>=0 && pOrde
1feb0 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
1fec0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1fed0 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53  eToNoop(v, addrS
1fee0 6f 72 74 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20  ortIndex, 1);.  
1fef0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
1ff00 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[2] = -1;.   
1ff10 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74   }..    /* Use t
1ff20 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65  he standard inne
1ff30 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20  r loop.    */.  
1ff40 20 20 61 73 73 65 72 74 28 21 69 73 44 69 73 74    assert(!isDist
1ff50 69 6e 63 74 29 3b 0a 20 20 20 20 73 65 6c 65 63  inct);.    selec
1ff60 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
1ff70 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c  e, p, pEList, 0,
1ff80 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d 31   0, pOrderBy, -1
1ff90 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
1ffb0 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20  nfo->iContinue, 
1ffc0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
1ffd0 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65  ..    /* End the
1ffe0 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
1fff0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
20000 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
20010 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  pWInfo);.  }else
20020 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
20030 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
20040 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 71 75  for aggregate qu
20050 65 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d  eries */.    Nam
20060 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
20070 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
20080 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
20090 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
200a0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
200b0 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
200c0 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
200d0 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
200e0 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
200f0 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
20100 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
20110 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
20120 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
20130 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
20140 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
20150 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
20160 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
20170 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
20180 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201a0 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
201b0 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
201c0 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
201d0 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
201e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
201f0 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
20200 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
20210 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
20220 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
20230 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
20240 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
20250 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
20260 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
20270 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
20280 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
20290 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
202a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;        /* End 
202b0 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  of processing fo
202c0 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  r this SELECT */
202d0 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
202e0 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61  any and all alia
202f0 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ses between the 
20300 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74  result set and t
20310 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20  he.    ** GROUP 
20320 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  BY clause..    *
20330 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
20340 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
20350 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
20360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
20370 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
20380 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
20390 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
203a0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
203b0 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  over expression 
203c0 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20  in a list */..  
203d0 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c      for(k=p->pEL
203e0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
203f0 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20  m=p->pEList->a; 
20400 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
20410 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
20420 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->iAlias = 0;. 
20430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
20440 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (k=pGroupBy->nEx
20450 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  pr, pItem=pGroup
20460 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  By->a; k>0; k--,
20470 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
20480 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73     pItem->iAlias
20490 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
204a0 20 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20 43 72    }.. .    /* Cr
204b0 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20  eate a label to 
204c0 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20  jump to when we 
204d0 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68  want to abort th
204e0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61  e query */.    a
204f0 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ddrEnd = sqlite3
20500 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
20510 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
20520 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  t TK_COLUMN node
20530 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  s into TK_AGG_CO
20540 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e  LUMN and make en
20550 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
20560 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c  sAggInfo for all
20570 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
20580 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73   nodes in expres
20590 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20  sions of the.   
205a0 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
205b0 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
205c0 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
205d0 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
205e0 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
205f0 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
20600 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
20610 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67  ist;.    sNC.pAg
20620 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66  gInfo = &sAggInf
20630 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  o;.    sAggInfo.
20640 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d  nSortingColumn =
20650 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f   pGroupBy ? pGro
20660 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20  upBy->nExpr+1 : 
20670 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
20680 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
20690 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBy;.    sqlite3
206a0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
206b0 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
206c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
206d0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
206e0 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 3b  &sNC, pOrderBy);
206f0 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
20700 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20710 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
20720 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
20730 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ving);.    }.   
20740 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d   sAggInfo.nAccum
20750 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66  ulator = sAggInf
20760 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66  o.nColumn;.    f
20770 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
20780 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  fo.nFunc; i++){.
20790 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
207a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 73  xprHasProperty(s
207b0 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
207c0 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  .pExpr, EP_xIsSe
207d0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
207e0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
207f0 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
20800 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
20810 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29  .pExpr->x.pList)
20820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20830 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
20840 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
20850 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  nd;..    /* Proc
20860 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
20870 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50  gates with GROUP
20880 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66   BY is very diff
20890 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a  erent and.    **
208a0 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
208b0 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74  ex than aggregat
208c0 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f  es without a GRO
208d0 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  UP BY..    */.  
208e0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
208f0 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
20900 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b  *pKeyInfo;  /* K
20910 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  eying informatio
20920 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20  n for the group 
20930 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  by clause */.   
20940 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20     int j1;      
20950 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42         /* A-vs-B
20960 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d   comparision jum
20970 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
20980 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f  ddrOutputRow;  /
20990 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f  * Start of subro
209a0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
209b0 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20  ts a result row 
209c0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
209d0 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20  OutputRow;   /* 
209e0 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
209f0 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70  egister for outp
20a00 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ut subroutine */
20a10 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
20a20 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65  etAbort;   /* Se
20a30 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67  t the abort flag
20a40 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
20a50 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
20a60 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20  OfLoop;  /* Top 
20a70 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
20a80 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
20a90 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f  ddrSortingIdx; /
20aa0 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  * The OP_OpenEph
20ab0 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73  emeral for the s
20ac0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  orting index */.
20ad0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65        int addrRe
20ae0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62  set;      /* Sub
20af0 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65  routine for rese
20b00 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  tting the accumu
20b10 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69  lator */.      i
20b20 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20  nt regReset;    
20b30 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
20b40 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
20b50 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69  r reset subrouti
20b60 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ne */..      /* 
20b70 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52  If there is a GR
20b80 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65  OUP BY clause we
20b90 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f   might need a so
20ba0 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20  rting index to. 
20bb0 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e       ** implemen
20bc0 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20  t it.  Allocate 
20bd0 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64  that sorting ind
20be0 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74  ex now.  If it t
20bf0 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a  urns out.      *
20c00 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
20c10 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61   need it after a
20c20 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 45 70 68 65  ll, the OpenEphe
20c30 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
20c40 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  n.      ** will 
20c50 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
20c60 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20  o a Noop.  .    
20c70 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49    */.      sAggI
20c80 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d  nfo.sortingIdx =
20c90 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
20ca0 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
20cb0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
20cc0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
20cd0 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61  roupBy);.      a
20ce0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  ddrSortingIdx = 
20cf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20d00 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
20d10 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20  meral, .        
20d20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
20d30 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e  ngIdx, sAggInfo.
20d40 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20  nSortingColumn, 
20d50 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63  .          0, (c
20d60 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
20d70 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
20d80 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e  F);..      /* In
20d90 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
20da0 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62  locations used b
20db0 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65  y GROUP BY aggre
20dc0 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a  gate processing.
20dd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
20de0 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  UseFlag = ++pPar
20df0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
20e00 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70  iAbortFlag = ++p
20e10 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
20e20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20     regOutputRow 
20e30 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
20e40 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
20e50 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
20e60 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
20e70 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20  .      regReset 
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 61 64 64 72 52 65 73 65  ;.      addrRese
20ea0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
20eb0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
20ec0 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73     iAMem = pPars
20ed0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
20ee0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
20ef0 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
20f00 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20  pr;.      iBMem 
20f10 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
20f20 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
20f30 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
20f40 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
20f50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20f60 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
20f70 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 0, iAbortFlag)
20f80 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
20f90 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61  ent((v, "clear a
20fa0 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
20fb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20fc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
20fd0 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67  ger, 0, iUseFlag
20fe0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
20ff0 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
21000 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65  te accumulator e
21010 6d 70 74 79 22 29 29 3b 0a 0a 20 20 20 20 20 20  mpty"));..      
21020 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20  /* Begin a loop 
21030 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
21040 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77  t all source row
21050 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  s in GROUP BY or
21060 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  der..      ** Th
21070 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65  is might involve
21080 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f   two separate lo
21090 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53  ops with an OP_S
210a0 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20  ort in between, 
210b0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  or.      ** it m
210c0 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65  ight be a single
210d0 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20   loop that uses 
210e0 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72  an index to extr
210f0 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  act information.
21100 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
21110 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62  right order to b
21120 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20  egin with..     
21130 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
21140 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21150 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
21160 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
21170 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
21180 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
21190 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
211a0 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75  , pWhere, &pGrou
211b0 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  pBy, 0);.      i
211c0 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
211d0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
211e0 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70        if( pGroup
211f0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  By==0 ){.       
21200 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
21210 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
21220 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
21230 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
21240 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
21250 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
21260 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  .  The OP_OpenEp
21270 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
21280 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
21290 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72   cancelled later
212a0 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c   because we stil
212b0 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68  l need to use th
212c0 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  e pKeyInfo.     
212d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47     */.        pG
212e0 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
212f0 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72  upBy;.        gr
21300 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20  oupBySort = 0;. 
21310 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21320 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20      /* Rows are 
21330 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e  coming out in un
21340 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72  determined order
21350 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75  .  We have to pu
21360 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61  sh.        ** ea
21370 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f  ch row into a so
21380 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72  rting index, ter
21390 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74  minate the first
213a0 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a   loop,.        *
213b0 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72  * then loop over
213c0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
213d0 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
213e0 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  et the output.  
213f0 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74        ** in sort
21400 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  ed order.       
21410 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
21420 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
21430 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a   int regRecord;.
21440 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
21450 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47  ;.        int nG
21460 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20  roupBy;..       
21470 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31   groupBySort = 1
21480 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70  ;.        nGroup
21490 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By = pGroupBy->n
214a0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43  Expr;.        nC
214b0 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20  ol = nGroupBy + 
214c0 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  1;.        j = n
214d0 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20  GroupBy+1;.     
214e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
214f0 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
21500 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
21510 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  if( sAggInfo.aCo
21520 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75  l[i].iSorterColu
21530 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
21540 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20       nCol++;.   
21550 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
21560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21570 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42    }.        regB
21580 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ase = sqlite3Get
21590 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
215a0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
215b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
215c0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
215d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
215e0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
215f0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
21600 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20  , regBase, 0);. 
21610 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21620 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
21630 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66  equence, sAggInf
21640 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67  o.sortingIdx,reg
21650 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a  Base+nGroupBy);.
21660 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
21670 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20  upBy+1;.        
21680 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
21690 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
216a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
216b0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
216c0 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66  *pCol = &sAggInf
216d0 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  o.aCol[i];.     
216e0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
216f0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
21700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
21710 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42  nt r1 = j + regB
21720 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ase;.           
21730 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20   int r2;..      
21740 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
21750 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
21760 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20  umn(pParse, .   
21770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21780 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
21790 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43  ->pTab, pCol->iC
217a0 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61  olumn, pCol->iTa
217b0 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20  ble, r1, 0);.   
217c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31 21           if( r1!
217d0 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =r2 ){.         
217e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
217f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
21800 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20  py, r2, r1);.   
21810 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21820 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
21830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21840 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63  }.        regRec
21850 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
21860 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
21870 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21880 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
21890 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
218a0 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52  Base, nCol, regR
218b0 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
218c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
218d0 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
218e0 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
218f0 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72  ingIdx, regRecor
21900 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
21910 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
21920 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
21930 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
21940 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
21950 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
21960 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  gBase, nCol);.  
21970 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
21980 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
21990 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
219a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
219b0 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
219c0 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
219d0 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
219e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
219f0 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20  UP BY sort"));. 
21a00 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
21a10 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  useSortingIdx = 
21a20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
21a30 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
21a40 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
21a50 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c  }..      /* Eval
21a60 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  uate the current
21a70 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
21a80 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c  and store in b0,
21a90 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20   b1, b2....     
21aa0 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72   ** (b0 is memor
21ab0 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d  y location iBMem
21ac0 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b  +0, b1 is iBMem+
21ad0 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  1, and so forth)
21ae0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63  .      ** Then c
21af0 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65  ompare the curre
21b00 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
21b10 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52  s against the GR
21b20 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20  OUP BY terms.   
21b30 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
21b40 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72  revious row curr
21b50 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
21b60 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20  a0, a1, a2....  
21b70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
21b80 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c  rTopOfLoop = sql
21b90 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
21ba0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
21bb0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
21bc0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
21bd0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
21be0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
21bf0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
21c00 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
21c10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21c20 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
21c30 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e  P_Column, sAggIn
21c40 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a  fo.sortingIdx, j
21c50 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
21c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21c70 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
21c80 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
21c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
21ca0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
21cb0 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
21cc0 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  Expr, iBMem+j);.
21cd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21ce0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
21cf0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
21d00 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20  Compare, iAMem, 
21d10 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iBMem, pGroupBy-
21d20 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
21d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d40 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
21d50 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
21d60 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
21d70 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
21d80 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
21d90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
21da0 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20   OP_Jump, j1+1, 
21db0 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20 20  0, j1+1);..     
21dc0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
21dd0 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  e that runs when
21de0 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42  ever the GROUP B
21df0 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20  Y changes..     
21e00 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74   ** Changes in t
21e10 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20  he GROUP BY are 
21e20 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20  detected by the 
21e30 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20  previous code.  
21e40 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49      ** block.  I
21e50 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20  f there were no 
21e60 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c  changes, this bl
21e70 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a  ock is skipped..
21e80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21e90 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69  * This code copi
21ea0 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70  es current group
21eb0 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c   by terms in b0,
21ec0 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20  b1,b2,....      
21ed0 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31  ** over to a0,a1
21ee0 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61  ,a2.  It then ca
21ef0 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73  lls the output s
21f00 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
21f10 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68  ** and resets th
21f20 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
21f30 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
21f40 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  s in preparation
21f50 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
21f60 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20  e next GROUP BY 
21f70 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a  batch..      */.
21f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21f90 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
21fa0 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20  , iBMem, iAMem, 
21fb0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29  pGroupBy->nExpr)
21fc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21fd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21fe0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
21ff0 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
22000 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
22010 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
22020 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20  ut one row"));. 
22030 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22040 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
22050 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20  os, iAbortFlag, 
22060 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
22070 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
22080 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61  "check abort fla
22090 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
220a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
220b0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
220c0 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b  set, addrReset);
220d0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
220e0 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63  nt((v, "reset ac
220f0 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
22100 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
22110 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
22120 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20  umulators based 
22130 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  on the content o
22140 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  f.      ** the c
22150 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20  urrent row.     
22160 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
22170 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
22180 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61   j1);.      upda
22190 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
221a0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
221b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
221c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
221d0 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65  Integer, 1, iUse
221e0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
221f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
22200 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61  dicate data in a
22210 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
22220 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
22230 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a  the loop.      *
22240 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  /.      if( grou
22250 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
22260 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22270 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
22280 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
22290 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c  gIdx, addrTopOfL
222a0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oop);.      }els
222b0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
222c0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
222d0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
222e0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
222f0 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69  oop(v, addrSorti
22300 6e 67 49 64 78 2c 20 31 29 3b 0a 20 20 20 20 20  ngIdx, 1);.     
22310 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74   }..      /* Out
22320 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f  put the final ro
22330 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20  w of result.    
22340 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
22350 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22360 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
22370 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
22380 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
22390 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
223a0 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22  utput final row"
223b0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75  ));..      /* Ju
223c0 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75 62 72  mp over the subr
223d0 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f  outines.      */
223e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
223f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
22400 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64 29  oto, 0, addrEnd)
22410 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
22420 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
22430 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
22440 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
22450 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
22460 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75  ** set.  This su
22470 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c  broutine first l
22480 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65  ooks at the iUse
22490 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c  Flag.  If iUseFl
224a0 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c  ag.      ** is l
224b0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
224c0 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73  l to zero, the s
224d0 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  ubroutine is a n
224e0 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20  o-op.  If.      
224f0 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ** the processin
22500 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  g calls for the 
22510 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20  query to abort, 
22520 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a  this subroutine.
22530 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65        ** increme
22540 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c  nts the iAbortFl
22550 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ag memory locati
22560 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  on before return
22570 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ing in.      ** 
22580 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20  order to signal 
22590 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62  the caller to ab
225a0 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ort..      */.  
225b0 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74      addrSetAbort
225c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
225d0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
225e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
225f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
22600 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c  ger, 1, iAbortFl
22610 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
22620 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20  omment((v, "set 
22630 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
22640 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22650 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
22660 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
22670 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  w);.      sqlite
22680 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
22690 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52  l(v, addrOutputR
226a0 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  ow);.      addrO
226b0 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
226c0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
226d0 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
226e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
226f0 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46   OP_IfPos, iUseF
22700 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  lag, addrOutputR
22710 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  ow+2);.      Vdb
22720 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72  eComment((v, "Gr
22730 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
22740 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69  erator entry poi
22750 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  nt"));.      sql
22760 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
22770 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
22780 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
22790 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
227a0 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
227b0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
227c0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
227d0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
227e0 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  ing, addrOutputR
227f0 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  ow+1, SQLITE_JUM
22800 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
22810 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
22820 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
22830 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
22840 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
22850 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
22860 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22880 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
22890 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74  +1, addrSetAbort
228a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
228b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
228c0 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
228d0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
228e0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
228f0 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c  nd groupby resul
22900 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a  t generator"));.
22910 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
22920 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
22930 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20  that will reset 
22940 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63  the group-by acc
22950 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a  umulator.      *
22960 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
22970 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
22980 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  v, addrReset);. 
22990 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
229a0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
229b0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
229c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
229d0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
229e0 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20  regReset);.     
229f0 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20  .    } /* endif 
22a00 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e  pGroupBy.  Begin
22a10 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
22a20 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50  es without GROUP
22a30 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65   BY: */.    else
22a40 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
22a50 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66  t *pDel = 0;.#if
22a60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22a70 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20  _BTREECOUNT.    
22a80 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
22a90 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d       if( (pTab =
22aa0 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70   isSimpleCount(p
22ab0 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30  , &sAggInfo))!=0
22ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
22ad0 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  f isSimpleCount(
22ae0 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  ) returns a poin
22af0 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73  ter to a Table s
22b00 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20  tructure, then. 
22b10 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
22b20 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  L statement is o
22b30 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20  f the form:.    
22b40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
22b50 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
22b60 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20  (*) FROM <tbl>. 
22b70 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
22b80 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54    ** where the T
22b90 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 72  able structure r
22ba0 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e  eturned represen
22bb0 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a  ts table <tbl>..
22bc0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
22bd0 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65     ** This state
22be0 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f  ment is so commo
22bf0 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70 74  n that it is opt
22c00 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79  imized specially
22c10 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
22c20 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75   OP_Count instru
22c30 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65  ction is execute
22c40 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20  d either on the 
22c50 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61  intkey table tha
22c60 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
22c70 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20 66  tains the data f
22c80 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f  or table <tbl> o
22c90 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20  r on one of its 
22ca0 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20  indexes. It.    
22cb0 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72      ** is better
22cc0 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
22cd0 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20  op on an index, 
22ce0 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20 61  as indexes are a
22cf0 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  lmost.        **
22d00 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20 61   always spread a
22d10 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73  cross less pages
22d20 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72   than their corr
22d30 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73  esponding tables
22d40 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
22d50 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
22d60 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
22d70 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
22d80 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
22d90 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ema);.        co
22da0 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70  nst int iCsr = p
22db0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
22dc0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
22dd0 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20  scan b-tree */. 
22de0 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49         Index *pI
22df0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
22e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
22e10 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
22e20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49   */.        KeyI
22e30 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
22e40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
22e50 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20   /* Keyinfo for 
22e60 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f  scanned index */
22e70 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
22e80 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pBest = 0;      
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ea0 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e   Best index foun
22eb0 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  d so far */.    
22ec0 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20      int iRoot = 
22ed0 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20  pTab->tnum;     
22ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
22ef0 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64   page of scanned
22f00 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20   b-tree */..    
22f10 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
22f20 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
22f30 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
22f40 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
22f50 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
22f60 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
22f70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
22f80 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
22f90 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 68  for the index th
22fa0 61 74 20 68 61 73 20 74 68 65 20 6c 65 61 73 74  at has the least
22fb0 20 61 6d 6f 75 6e 74 20 6f 66 20 63 6f 6c 75 6d   amount of colum
22fc0 6e 73 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  ns. If.        *
22fd0 2a 20 74 68 65 72 65 20 69 73 20 73 75 63 68 20  * there is such 
22fe0 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 74  an index, and it
22ff0 20 68 61 73 20 6c 65 73 73 20 63 6f 6c 75 6d 6e   has less column
23000 73 20 74 68 61 6e 20 74 68 65 20 74 61 62 6c 65  s than the table
23010 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
23020 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 61 73  , then we can as
23030 73 75 6d 65 20 74 68 61 74 20 69 74 20 63 6f 6e  sume that it con
23040 73 75 6d 65 73 20 6c 65 73 73 20 73 70 61 63 65  sumes less space
23050 20 6f 6e 20 64 69 73 6b 20 61 6e 64 0a 20 20 20   on disk and.   
23060 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 74 68 65       ** will the
23070 72 65 66 6f 72 65 20 62 65 20 63 68 65 61 70 65  refore be cheape
23080 72 20 74 6f 20 73 63 61 6e 20 74 6f 20 64 65 74  r to scan to det
23090 65 72 6d 69 6e 65 20 74 68 65 20 71 75 65 72 79  ermine the query
230a0 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20   result..       
230b0 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
230c0 20 73 65 74 20 69 52 6f 6f 74 20 74 6f 20 74 68   set iRoot to th
230d0 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
230e0 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  er of the index 
230f0 62 2d 74 72 65 65 0a 20 20 20 20 20 20 20 20 2a  b-tree.        *
23100 2a 20 61 6e 64 20 70 4b 65 79 49 6e 66 6f 20 74  * and pKeyInfo t
23110 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  o the KeyInfo st
23120 72 75 63 74 75 72 65 20 72 65 71 75 69 72 65 64  ructure required
23130 20 74 6f 20 6e 61 76 69 67 61 74 65 20 74 68 65   to navigate the
23140 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
23150 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
23160 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63        ** In prac
23170 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f  tice the KeyInfo
23180 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20   structure will 
23190 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74 20  not be used. It 
231a0 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20  is only .       
231b0 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65   ** passed to ke
231c0 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68  ep OP_OpenRead h
231d0 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  appy..        */
231e0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64  .        for(pId
231f0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
23200 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
23210 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
23220 20 20 20 69 66 28 20 21 70 42 65 73 74 20 7c 7c     if( !pBest ||
23230 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70   pIdx->nColumn<p
23240 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  Best->nColumn ){
23250 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65  .            pBe
23260 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  st = pIdx;.     
23270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
23280 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65  .        if( pBe
23290 73 74 20 26 26 20 70 42 65 73 74 2d 3e 6e 43 6f  st && pBest->nCo
232a0 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  lumn<pTab->nCol 
232b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f  ){.          iRo
232c0 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d  ot = pBest->tnum
232d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79  ;.          pKey
232e0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e  Info = sqlite3In
232f0 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
23300 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  e, pBest);.     
23310 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
23320 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c   Open a read-onl
23330 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74  y cursor, execut
23340 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20  e the OP_Count, 
23350 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72  close the cursor
23360 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
23370 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
23380 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
23390 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 29  Csr, iRoot, iDb)
233a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  ;.        if( pK
233b0 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
233c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
233d0 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
233e0 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c  char *)pKeyInfo,
233f0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
23400 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OFF);.        }.
23410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23420 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23430 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67  Count, iCsr, sAg
23440 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69  gInfo.aFunc[0].i
23450 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
23460 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
23470 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73  v, OP_Close, iCs
23480 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  r);.      }else.
23490 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
234a0 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
234b0 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   */.      {.    
234c0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
234d0 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
234e0 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
234f0 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20  wing forms:.    
23500 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
23510 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  *   SELECT min(x
23520 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
23530 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
23540 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  ax(x) FROM .... 
23550 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
23560 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74    ** If it is, t
23570 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65  hen ask the code
23580 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61   in where.c to a
23590 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72  ttempt to sort r
235a0 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a  esults.        *
235b0 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61  * as if there wa
235c0 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78  s an "ORDER ON x
235d0 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78  " or "ORDER ON x
235e0 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a   DESC" clause. .
235f0 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68          ** If wh
23600 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f  ere.c is able to
23610 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73   produce results
23620 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20   sorted in this 
23630 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20  order, then.    
23640 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20      ** add vdbe 
23650 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  code to break ou
23660 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73  t of the process
23670 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74  ing loop after t
23680 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  he .        ** f
23690 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28  irst iteration (
236a0 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  since the first 
236b0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
236c0 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20   loop is .      
236d0 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
236e0 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
236f0 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d  e row with the m
23700 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75  inimum or maximu
23710 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  m .        ** va
23720 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e  lue of x, the on
23730 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29  ly row required)
23740 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
23750 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61       ** A specia
23760 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70  l flag must be p
23770 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
23780 57 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20  WhereBegin() to 
23790 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20  slightly.       
237a0 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76   ** modify behav
237b0 69 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  iour as follows:
237c0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
237d0 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68      **   + If th
237e0 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45  e query is a "SE
237f0 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68  LECT min(x)", th
23800 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65  en the loop code
23810 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  d by.        ** 
23820 20 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75      where.c shou
23830 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f  ld not iterate o
23840 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77  ver any values w
23850 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ith a NULL value
23860 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
23870 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a  for x..        *
23880 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
23890 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63   The optimizer c
238a0 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28  ode in where.c (
238b0 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64  the thing that d
238c0 65 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20  ecides which.   
238d0 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65       **     inde
238e0 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20  x or indices to 
238f0 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63  use) should plac
23900 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  e a different pr
23910 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20  iority on .     
23920 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66     **     satisf
23930 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20  ying the 'ORDER 
23940 42 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20  BY' clause than 
23950 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72  it does in other
23960 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20   cases..        
23970 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20  **     Refer to 
23980 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74  code and comment
23990 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72  s in where.c for
239a0 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20   details..      
239b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70    */.        Exp
239c0 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d  rList *pMinMax =
239d0 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66   0;.        u8 f
239e0 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
239f0 79 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y(p);.        if
23a00 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  ( flag ){.      
23a10 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
23a20 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e  rHasProperty(p->
23a30 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
23a40 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
23a50 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ) );.          p
23a60 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  MinMax = sqlite3
23a70 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
23a80 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
23a90 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 30  pExpr->x.pList,0
23aa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 65  );.          pDe
23ab0 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20  l = pMinMax;.   
23ac0 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d         if( pMinM
23ad0 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  ax && !db->mallo
23ae0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
23af0 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
23b00 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
23b10 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44   flag!=WHERE_ORD
23b20 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20  ERBY_MIN ?1:0;. 
23b30 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d             pMinM
23b40 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  ax->a[0].pExpr->
23b50 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
23b60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23b70 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
23b80 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75   /* This case ru
23b90 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67  ns if the aggreg
23ba0 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50  ate has no GROUP
23bb0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65   BY clause.  The
23bc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
23bd0 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73  essing is much s
23be0 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65  impler since the
23bf0 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e  re is only a sin
23c00 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20  gle row.        
23c10 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20  ** of output..  
23c20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
23c30 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
23c40 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
23c50 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57  nfo);.        pW
23c60 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
23c70 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
23c80 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
23c90 65 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 66 6c 61  e, &pMinMax, fla
23ca0 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  g);.        if( 
23cb0 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  pWInfo==0 ){.   
23cc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
23cd0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
23ce0 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20   pDel);.        
23cf0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
23d00 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
23d10 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
23d20 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
23d30 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
23d40 20 20 20 69 66 28 20 21 70 4d 69 6e 4d 61 78 20     if( !pMinMax 
23d50 26 26 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  && flag ){.     
23d60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23d70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
23d80 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  o, 0, pWInfo->iB
23d90 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  reak);.         
23da0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
23db0 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22   "%s() by index"
23dc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23dd0 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f    (flag==WHERE_O
23de0 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22  RDERBY_MIN?"min"
23df0 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20  :"max")));.     
23e00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
23e10 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
23e20 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69  nfo);.        fi
23e30 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
23e40 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
23e50 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Info);.      }..
23e60 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
23e70 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
23e80 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
23e90 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
23ea0 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55  drEnd, SQLITE_JU
23eb0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
23ec0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
23ed0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
23ee0 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  EList, 0, 0, 0, 
23ef0 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
23f00 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
23f10 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45  , addrEnd, addrE
23f20 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nd);.      sqlit
23f30 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
23f40 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20  (db, pDel);.    
23f50 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
23f60 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
23f70 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a   addrEnd);.    .
23f80 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67    } /* endif agg
23f90 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
23fa0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
23fb0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
23fc0 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
23fd0 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
23fe0 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
23ff0 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
24000 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
24010 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
24020 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
24030 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
24040 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20  l(pParse, p, v, 
24050 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
24060 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Dest);.  }..  /*
24070 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
24080 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  ip this query.  
24090 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
240a0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
240b0 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  iEnd);..  /* The
240c0 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63   SELECT was succ
240d0 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20  essfully coded. 
240e0 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e    Set the return
240f0 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20   code to 0.  ** 
24100 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65  to indicate no e
24110 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rrors..  */.  rc
24120 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74   = 0;..  /* Cont
24130 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72  rol jumps to her
24140 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
24150 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f   encountered abo
24160 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a  ve, or upon.  **
24170 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69   successful codi
24180 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ng of the SELECT
24190 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e  ..  */.select_en
241a0 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  d:..  /* Identif
241b0 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  y column names i
241c0 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  f results of the
241d0 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62   SELECT are to b
241e0 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20  e output..  */. 
241f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24200 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65  OK && pDest->eDe
24210 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
24220 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
24230 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
24240 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
24250 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  st);.  }..  sqli
24260 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41  te3DbFree(db, sA
24270 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20  ggInfo.aCol);.  
24280 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
24290 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
242a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
242b0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
242c0 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
242d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
242e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
242f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
24320 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
24330 20 63 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f   code is used fo
24340 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
24350 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54  bugging only.  T
24360 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20  he code.** that 
24370 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74  follows does not
24380 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61   appear in norma
24390 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20  l builds..**.** 
243a0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
243b0 72 65 20 75 73 65 64 20 74 6f 20 70 72 69 6e 74  re used to print
243c0 20 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   out the content
243d0 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72 74 20   of all or part 
243e0 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73 65 20 73  of a .** parse s
243f0 74 72 75 63 74 75 72 65 73 20 73 75 63 68 20 61  tructures such a
24400 73 20 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72  s Select or Expr
24410 2e 20 20 53 75 63 68 20 70 72 69 6e 74 6f 75 74  .  Such printout
24420 73 20 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20  s are useful.** 
24430 66 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f 20 75  for helping to u
24440 6e 64 65 72 73 74 61 6e 64 20 77 68 61 74 20 69  nderstand what i
24450 73 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 73 69  s happening insi
24460 64 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  de the code gene
24470 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20  rator.** during 
24480 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  the execution of
24490 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54 20   complex SELECT 
244a0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
244b0 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20  * These routine 
244c0 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61  are not called a
244d0 6e 79 77 68 65 72 65 20 66 72 6f 6d 20 77 69 74  nywhere from wit
244e0 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a  hin the normal.*
244f0 2a 20 63 6f 64 65 20 62 61 73 65 2e 20 20 54 68  * code base.  Th
24500 65 6e 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20  en are intended 
24510 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  to be called fro
24520 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64 65 62  m within the deb
24530 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d  ugger.** or from
24540 20 74 65 6d 70 6f 72 61 72 79 20 22 70 72 69 6e   temporary "prin
24550 74 66 22 20 73 74 61 74 65 6d 65 6e 74 73 20 69  tf" statements i
24560 6e 73 65 72 74 65 64 20 66 6f 72 20 64 65 62 75  nserted for debu
24570 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  gging..*/.void s
24580 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
24590 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
245a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
245b0 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
245c0 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
245d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
245e0 62 75 67 50 72 69 6e 74 66 28 22 28 25 73 22 2c  bugPrintf("(%s",
245f0 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20   p->u.zToken);. 
24600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
24610 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24620 28 25 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20  (%d", p->op);.  
24630 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74  }.  if( p->pLeft
24640 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
24650 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b  ebugPrintf(" ");
24660 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
24670 74 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b  tExpr(p->pLeft);
24680 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52  .  }.  if( p->pR
24690 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
246a0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
246b0 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
246c0 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 52 69  PrintExpr(p->pRi
246d0 67 68 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ght);.  }.  sqli
246e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
246f0 29 22 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  )");.}.void sqli
24700 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74  te3PrintExprList
24710 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
24720 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
24730 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
24740 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
24750 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
24760 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  r(pList->a[i].pE
24770 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 69 3c  xpr);.    if( i<
24780 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29  pList->nExpr-1 )
24790 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
247a0 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20 22 29  ebugPrintf(", ")
247b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f  ;.    }.  }.}.vo
247c0 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53  id sqlite3PrintS
247d0 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c  elect(Select *p,
247e0 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20   int indent){.  
247f0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24800 74 66 28 22 25 2a 73 53 45 4c 45 43 54 28 25 70  tf("%*sSELECT(%p
24810 29 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c  ) ", indent, "",
24820 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 72   p);.  sqlite3Pr
24830 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  intExprList(p->p
24840 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  EList);.  sqlite
24850 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
24860 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72  ");.  if( p->pSr
24870 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  c ){.    char *z
24880 50 72 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20  Prefix;.    int 
24890 69 3b 0a 20 20 20 20 7a 50 72 65 66 69 78 20 3d  i;.    zPrefix =
248a0 20 22 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72   "FROM";.    for
248b0 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d  (i=0; i<p->pSrc-
248c0 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
248d0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
248e0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
248f0 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a  &p->pSrc->a[i];.
24900 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
24910 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 22 2c  ugPrintf("%*s ",
24920 20 69 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66   indent+6, zPref
24930 69 78 29 3b 0a 20 20 20 20 20 20 7a 50 72 65 66  ix);.      zPref
24940 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69  ix = "";.      i
24950 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
24960 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
24970 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24980 22 28 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  "(\n");.        
24990 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65  sqlite3PrintSele
249a0 63 74 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  ct(pItem->pSelec
249b0 74 2c 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20  t, indent+10);. 
249c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
249d0 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 29 22  bugPrintf("%*s)"
249e0 2c 20 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b  , indent+8, "");
249f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
24a00 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b   pItem->zName ){
24a10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24a20 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73 22  DebugPrintf("%s"
24a30 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
24a40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
24a50 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29  f( pItem->pTab )
24a60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24a70 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 74  3DebugPrintf("(t
24a80 61 62 6c 65 3a 20 25 73 29 22 2c 20 70 49 74 65  able: %s)", pIte
24a90 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  m->pTab->zName);
24aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
24ab0 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
24ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
24ad0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24ae0 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e   AS %s", pItem->
24af0 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d  zAlias);.      }
24b00 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70 2d 3e  .      if( i<p->
24b10 70 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a  pSrc->nSrc-1 ){.
24b20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
24b30 65 62 75 67 50 72 69 6e 74 66 28 22 2c 22 29 3b  ebugPrintf(",");
24b40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
24b50 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24b60 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  f("\n");.    }. 
24b70 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65   }.  if( p->pWhe
24b80 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  re ){.    sqlite
24b90 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
24ba0 73 20 57 48 45 52 45 20 22 2c 20 69 6e 64 65 6e  s WHERE ", inden
24bb0 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69  t, "");.    sqli
24bc0 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e  te3PrintExpr(p->
24bd0 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c  pWhere);.    sql
24be0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24bf0 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  "\n");.  }.  if(
24c00 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a   p->pGroupBy ){.
24c10 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24c20 50 72 69 6e 74 66 28 22 25 2a 73 20 47 52 4f 55  Printf("%*s GROU
24c30 50 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20  P BY ", indent, 
24c40 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "");.    sqlite3
24c50 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d  PrintExprList(p-
24c60 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
24c70 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24c80 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  tf("\n");.  }.  
24c90 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29  if( p->pHaving )
24ca0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
24cb0 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 48 41  ugPrintf("%*s HA
24cc0 56 49 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20  VING ", indent, 
24cd0 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "");.    sqlite3
24ce0 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 48 61  PrintExpr(p->pHa
24cf0 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  ving);.    sqlit
24d00 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
24d10 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n");.  }.  if( p
24d20 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
24d30 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24d40 69 6e 74 66 28 22 25 2a 73 20 4f 52 44 45 52 20  intf("%*s ORDER 
24d50 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  BY ", indent, ""
24d60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
24d70 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  intExprList(p->p
24d80 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71  OrderBy);.    sq
24d90 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24da0 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a  ("\n");.  }.}./*
24db0 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75   End of the stru
24dc0 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69 6e  cture debug prin
24dd0 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a  ting code.******
24de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24e20 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20  *******/.#endif 
24e30 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
24e40 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
24e50 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
24e60 20 2a 2f 0a                                       */.