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

Artifact 607e5b2d3be379781e5be3ac0854f5c237152d26:


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 30 35  select.c,v 1.505
0200: 20 32 30 30 39 2f 30 33 2f 32 34 20 31 35 3a 30   2009/03/24 15:0
0210: 38 3a 31 30 20 64 72 68 20 45 78 70 20 24 0a 2a  8:10 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 2c 30 2c 30 29 2c 20 30 29 3b 0a 20  LL,0,0,0), 0);. 
0940: 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73   }.  pNew->pELis
0950: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e  t = pEList;.  pN
0960: 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b  ew->pSrc = pSrc;
0970: 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20  .  pNew->pWhere 
0980: 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77  = pWhere;.  pNew
0990: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  ->pGroupBy = pGr
09a0: 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70  oupBy;.  pNew->p
09b0: 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67  Having = pHaving
09c0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
09d0: 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
09e0: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
09f0: 3d 20 69 73 44 69 73 74 69 6e 63 74 20 3f 20 53  = isDistinct ? S
0a00: 46 5f 44 69 73 74 69 6e 63 74 20 3a 20 30 3b 0a  F_Distinct : 0;.
0a10: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f    pNew->op = TK_
0a20: 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e  SELECT;.  pNew->
0a30: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
0a40: 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
0a50: 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 70 4e   = pOffset;.  pN
0a60: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a70: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
0a80: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
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 32 5d 20  addrOpenEphm[2] 
0ab0: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e  = -1;.  if( db->
0ac0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b  mallocFailed ) {
0ad0: 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74  .    clearSelect
0ae0: 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (db, pNew);.    
0af0: 69 66 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64  if( pNew!=&stand
0b00: 69 6e 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  in ) sqlite3DbFr
0b10: 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ee(db, pNew);.  
0b20: 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 0a    pNew = 0;.  }.
0b30: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
0b40: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
0b50: 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20  he given Select 
0b60: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
0b70: 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75  l of its substru
0b80: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
0b90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
0ba0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
0bb0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
0bc0: 66 28 20 70 20 29 7b 0a 20 20 20 20 63 6c 65 61  f( p ){.    clea
0bd0: 72 53 65 6c 65 63 74 28 64 62 2c 20 70 29 3b 0a  rSelect(db, p);.
0be0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
0bf0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  e(db, p);.  }.}.
0c00: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74  ./*.** Given 1 t
0c10: 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20  o 3 identifiers 
0c20: 70 72 65 63 65 65 64 69 6e 67 20 74 68 65 20 4a  preceeding the J
0c30: 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74  OIN keyword, det
0c40: 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79  ermine the.** ty
0c50: 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74  pe of join.  Ret
0c60: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63  urn an integer c
0c70: 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70  onstant that exp
0c80: 72 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65  resses that type
0c90: 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  .** in terms of 
0ca0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69  the following bi
0cb0: 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20  t values:.**.** 
0cc0: 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20      JT_INNER.** 
0cd0: 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20      JT_CROSS.** 
0ce0: 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20      JT_OUTER.** 
0cf0: 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a      JT_NATURAL.*
0d00: 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a  *     JT_LEFT.**
0d10: 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a       JT_RIGHT.**
0d20: 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72  .** A full outer
0d30: 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d   join is the com
0d40: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c  bination of JT_L
0d50: 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54  EFT and JT_RIGHT
0d60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c  ..**.** If an il
0d70: 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f  legal or unsuppo
0d80: 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69  rted join type i
0d90: 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69  s seen, then sti
0da0: 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a  ll return.** a j
0db0: 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75  oin type, but pu
0dc0: 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68  t an error in th
0dd0: 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
0de0: 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
0df0: 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65  e3JoinType(Parse
0e00: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
0e10: 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20  *pA, Token *pB, 
0e20: 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e  Token *pC){.  in
0e30: 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  t jointype = 0;.
0e40: 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33    Token *apAll[3
0e50: 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20  ];.  Token *p;. 
0e60: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
0e70: 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ruct {.    const
0e80: 20 63 68 61 72 20 7a 4b 65 79 77 6f 72 64 5b 38   char zKeyword[8
0e90: 5d 3b 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b  ];.    u8 nChar;
0ea0: 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 0a 20 20  .    u8 code;.  
0eb0: 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b  } keywords[] = {
0ec0: 0a 20 20 20 20 7b 20 22 6e 61 74 75 72 61 6c 22  .    { "natural"
0ed0: 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20  , 7, JT_NATURAL 
0ee0: 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66 74 22 2c  },.    { "left",
0ef0: 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a      4, JT_LEFT|J
0f00: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0f10: 20 22 72 69 67 68 74 22 2c 20 20 20 35 2c 20 4a   "right",   5, J
0f20: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
0f30: 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22   },.    { "full"
0f40: 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c  ,    4, JT_LEFT|
0f50: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
0f60: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65  R },.    { "oute
0f70: 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45  r",   5, JT_OUTE
0f80: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65  R },.    { "inne
0f90: 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45  r",   5, JT_INNE
0fa0: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73  R },.    { "cros
0fb0: 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45  s",   5, JT_INNE
0fc0: 52 7c 4a 54 5f 43 52 4f 53 53 20 7d 2c 0a 20 20  R|JT_CROSS },.  
0fd0: 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  };.  int i, j;. 
0fe0: 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a   apAll[0] = pA;.
0ff0: 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b    apAll[1] = pB;
1000: 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43  .  apAll[2] = pC
1010: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33  ;.  for(i=0; i<3
1020: 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b   && apAll[i]; i+
1030: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c  +){.    p = apAl
1040: 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  l[i];.    for(j=
1050: 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 6b  0; j<ArraySize(k
1060: 65 79 77 6f 72 64 73 29 3b 20 6a 2b 2b 29 7b 0a  eywords); j++){.
1070: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d        if( p->n==
1080: 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61  keywords[j].nCha
1090: 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  r .          && 
10a0: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
10b0: 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 6b 65 79  (char*)p->z, key
10c0: 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72  words[j].zKeywor
10d0: 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20  d, p->n)==0 ){. 
10e0: 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20         jointype 
10f0: 7c 3d 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63  |= keywords[j].c
1100: 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ode;.        bre
1110: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1120: 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72  }.    if( j>=Arr
1130: 61 79 53 69 7a 65 28 6b 65 79 77 6f 72 64 73 29  aySize(keywords)
1140: 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   ){.      jointy
1150: 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a  pe |= JT_ERROR;.
1160: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1170: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20   }.  }.  if(.   
1180: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a    (jointype & (J
1190: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
11a0: 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  ))==(JT_INNER|JT
11b0: 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20  _OUTER) ||.     
11c0: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45  (jointype & JT_E
11d0: 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RROR)!=0.  ){.  
11e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
11f0: 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73  p = " ";.    ass
1200: 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20  ert( pB!=0 );.  
1210: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
1220: 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69  Sp++; }.    sqli
1230: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1240: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20  se, "unknown or 
1250: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1260: 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20   type: ".       
1270: 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c  "%T %T%s%T", pA,
1280: 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20   pB, zSp, pC);. 
1290: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
12a0: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20  _INNER;.  }else 
12b0: 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a  if( jointype & J
12c0: 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20 73  T_RIGHT ){.    s
12d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12e0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52  Parse, .      "R
12f0: 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55  IGHT and FULL OU
1300: 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f  TER JOINs are no
1310: 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70  t currently supp
1320: 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69  orted");.    joi
1330: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
1340: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
1350: 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ointype;.}../*.*
1360: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
1370: 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69  ex of a column i
1380: 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75  n a table.  Retu
1390: 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c  rn -1 if the col
13a0: 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  umn.** is not co
13b0: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74  ntained in the t
13c0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
13d0: 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  int columnIndex(
13e0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e  Table *pTab, con
13f0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a  st char *zCol){.
1400: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1410: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
1420: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1430: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1440: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
1450: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72  me, zCol)==0 ) r
1460: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
1470: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
1480: 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
1490: 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f 20 61   of a token to a
14a0: 20 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e 61 74   '\000'-terminat
14b0: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  ed string..*/.st
14c0: 61 74 69 63 20 76 6f 69 64 20 73 65 74 54 6f 6b  atic void setTok
14d0: 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e  en(Token *p, con
14e0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 70  st char *z){.  p
14f0: 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a 20 20  ->z = (u8*)z;.  
1500: 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73 71 6c 69 74  p->n = z ? sqlit
1510: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 3a 20  e3Strlen30(z) : 
1520: 30 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b  0;.  p->dyn = 0;
1530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1540: 65 20 74 6f 6b 65 6e 20 74 6f 20 74 68 65 20 64  e token to the d
1550: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 61 6e 64  ouble-quoted and
1560: 20 65 73 63 61 70 65 64 20 76 65 72 73 69 6f 6e   escaped version
1570: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 70   of the string p
1580: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
1590: 7a 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3b 0a  z. For example;.
15a0: 2a 2a 0a 2a 2a 20 20 20 20 7b 61 22 62 63 7d 20  **.**    {a"bc} 
15b0: 20 2d 3e 20 20 7b 22 61 22 22 62 63 22 7d 0a 2a   ->  {"a""bc"}.*
15c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
15d0: 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 50 61 72  tQuotedToken(Par
15e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
15f0: 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  n *p, const char
1600: 20 2a 7a 29 7b 0a 0a 20 20 2f 2a 20 43 68 65 63   *z){..  /* Chec
1610: 6b 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 20  k if the string 
1620: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 71 75  appears to be qu
1630: 6f 74 65 64 20 75 73 69 6e 67 20 22 2e 2e 2e 22  oted using "..."
1640: 20 6f 72 20 60 2e 2e 2e 60 0a 20 20 2a 2a 20 6f   or `...`.  ** o
1650: 72 20 5b 2e 2e 2e 5d 20 6f 72 20 27 2e 2e 2e 27  r [...] or '...'
1660: 20 6f 72 20 69 66 20 74 68 65 20 73 74 72 69 6e   or if the strin
1670: 67 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 22  g contains any "
1680: 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 0a 20   characters.  . 
1690: 20 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 2c 20   ** If it does, 
16a0: 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 76 65  then record a ve
16b0: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 72  rsion of the str
16c0: 69 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65  ing with the spe
16d0: 63 69 61 6c 0a 20 20 2a 2a 20 63 68 61 72 61 63  cial.  ** charac
16e0: 74 65 72 73 20 65 73 63 61 70 65 64 2e 0a 20 20  ters escaped..  
16f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1700: 2a 7a 32 20 3d 20 7a 3b 0a 20 20 69 66 28 20 2a  *z2 = z;.  if( *
1710: 7a 32 21 3d 27 5b 27 20 26 26 20 2a 7a 32 21 3d  z2!='[' && *z2!=
1720: 27 60 27 20 26 26 20 2a 7a 32 21 3d 27 5c 27 27  '`' && *z2!='\''
1730: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a   ){.    while( *
1740: 7a 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  z2 ){.      if( 
1750: 2a 7a 32 3d 3d 27 22 27 20 29 20 62 72 65 61 6b  *z2=='"' ) break
1760: 3b 0a 20 20 20 20 20 20 7a 32 2b 2b 3b 0a 20 20  ;.      z2++;.  
1770: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 2a    }.  }..  if( *
1780: 7a 32 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 72  z2 ){.    /* Str
1790: 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 22 20 63  ing contains " c
17a0: 68 61 72 61 63 74 65 72 73 20 2d 20 63 6f 70 79  haracters - copy
17b0: 20 61 6e 64 20 71 75 6f 74 65 20 74 68 65 20 73   and quote the s
17c0: 74 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 70 2d  tring. */.    p-
17d0: 3e 7a 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  >z = (u8 *)sqlit
17e0: 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
17f0: 2d 3e 64 62 2c 20 22 5c 22 25 77 5c 22 22 2c 20  ->db, "\"%w\"", 
1800: 7a 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a  z);.    if( p->z
1810: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 20 3d   ){.      p->n =
1820: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1830: 28 28 63 68 61 72 20 2a 29 70 2d 3e 7a 29 3b 0a  ((char *)p->z);.
1840: 20 20 20 20 20 20 70 2d 3e 64 79 6e 20 3d 20 31        p->dyn = 1
1850: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1860: 0a 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 63  .    /* String c
1870: 6f 6e 74 61 69 6e 73 20 6e 6f 20 22 20 63 68 61  ontains no " cha
1880: 72 61 63 74 65 72 73 20 2d 20 63 6f 70 79 20 74  racters - copy t
1890: 68 65 20 70 6f 69 6e 74 65 72 2e 20 2a 2f 0a 20  he pointer. */. 
18a0: 20 20 20 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a     p->z = (u8*)z
18b0: 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d 20 28 69 6e  ;.    p->n = (in
18c0: 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 20 20 20 20  t)(z2 - z);.    
18d0: 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 20 20 7d 0a  p->dyn = 0;.  }.
18e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
18f0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  an expression no
1900: 64 65 20 66 6f 72 20 61 6e 20 69 64 65 6e 74 69  de for an identi
1910: 66 69 65 72 20 77 69 74 68 20 74 68 65 20 6e 61  fier with the na
1920: 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a 45  me of zName.*/.E
1930: 78 70 72 20 2a 73 71 6c 69 74 65 33 43 72 65 61  xpr *sqlite3Crea
1940: 74 65 49 64 45 78 70 72 28 50 61 72 73 65 20 2a  teIdExpr(Parse *
1950: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
1960: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 6f  ar *zName){.  To
1970: 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65 74  ken dummy;.  set
1980: 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 4e  Token(&dummy, zN
1990: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  ame);.  return s
19a0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
19b0: 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  se, TK_ID, 0, 0,
19c0: 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 2f 2a 0a   &dummy);.}../*.
19d0: 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74 6f  ** Add a term to
19e0: 20 74 68 65 20 57 48 45 52 45 20 65 78 70 72 65   the WHERE expre
19f0: 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72  ssion in *ppExpr
1a00: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
1a10: 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d  he.** zCol colum
1a20: 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69 6e  n to be equal in
1a30: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
1a40: 70 54 61 62 31 20 61 6e 64 20 70 54 61 62 32 2e  pTab1 and pTab2.
1a50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a60: 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20  addWhereTerm(.  
1a70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1a90: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1aa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1ab0: 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  l,        /* Nam
1ac0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
1ad0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65  */.  const Table
1ae0: 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f 2a   *pTab1,      /*
1af0: 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a   First table */.
1b00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
1b10: 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a 20 41 6c  lias1,     /* Al
1b20: 69 61 73 20 66 6f 72 20 66 69 72 73 74 20 74 61  ias for first ta
1b30: 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  ble.  May be NUL
1b40: 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62  L */.  const Tab
1b50: 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20 20  le *pTab2,      
1b60: 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65 20  /* Second table 
1b70: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1b80: 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20 20 2f 2a  *zAlias2,     /*
1b90: 20 41 6c 69 61 73 20 66 6f 72 20 73 65 63 6f 6e   Alias for secon
1ba0: 64 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62 65  d table.  May be
1bb0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69   NULL */.  int i
1bc0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 2c 20  RightJoinTable, 
1bd0: 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
1be0: 6f 72 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  or for the right
1bf0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
1c00: 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20 20   **ppExpr,      
1c10: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
1c20: 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74 6f  equality term to
1c30: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
1c40: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65   */.  int isOute
1c50: 72 4a 6f 69 6e 20 20 20 20 20 20 20 20 20 20 2f  rJoin          /
1c60: 2a 20 54 72 75 65 20 69 66 20 64 65 61 6c 69 6e  * True if dealin
1c70: 67 20 77 69 74 68 20 61 6e 20 4f 55 54 45 52 20  g with an OUTER 
1c80: 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  join */.){.  Exp
1c90: 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20  r *pE1a, *pE1b, 
1ca0: 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70  *pE1c;.  Expr *p
1cb0: 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32  E2a, *pE2b, *pE2
1cc0: 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a  c;.  Expr *pE;..
1cd0: 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65 33    pE1a = sqlite3
1ce0: 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61  CreateIdExpr(pPa
1cf0: 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70 45  rse, zCol);.  pE
1d00: 32 61 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  2a = sqlite3Crea
1d10: 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65 2c  teIdExpr(pParse,
1d20: 20 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 41   zCol);.  if( zA
1d30: 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20 20 20  lias1==0 ){.    
1d40: 7a 41 6c 69 61 73 31 20 3d 20 70 54 61 62 31 2d  zAlias1 = pTab1-
1d50: 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45  >zName;.  }.  pE
1d60: 31 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  1b = sqlite3Crea
1d70: 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65 2c  teIdExpr(pParse,
1d80: 20 7a 41 6c 69 61 73 31 29 3b 0a 20 20 69 66 28   zAlias1);.  if(
1d90: 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29 7b 0a 20   zAlias2==0 ){. 
1da0: 20 20 20 7a 41 6c 69 61 73 32 20 3d 20 70 54 61     zAlias2 = pTa
1db0: 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  b2->zName;.  }. 
1dc0: 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65 33 43   pE2b = sqlite3C
1dd0: 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72  reateIdExpr(pPar
1de0: 73 65 2c 20 7a 41 6c 69 61 73 32 29 3b 0a 20 20  se, zAlias2);.  
1df0: 70 45 31 63 20 3d 20 73 71 6c 69 74 65 33 50 45  pE1c = sqlite3PE
1e00: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
1e10: 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61 2c 20  OT, pE1b, pE1a, 
1e20: 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73 71 6c  0);.  pE2c = sql
1e30: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1e40: 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20  , TK_DOT, pE2b, 
1e50: 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d  pE2a, 0);.  pE =
1e60: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
1e70: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
1e80: 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20 69  c, pE2c, 0);.  i
1e90: 66 28 20 70 45 20 26 26 20 69 73 4f 75 74 65 72  f( pE && isOuter
1ea0: 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72  Join ){.    Expr
1eb0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 2c 20  SetProperty(pE, 
1ec0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
1ed0: 20 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69 6e    pE->iRightJoin
1ee0: 54 61 62 6c 65 20 3d 20 69 52 69 67 68 74 4a 6f  Table = iRightJo
1ef0: 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a  inTable;.  }.  *
1f00: 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ppExpr = sqlite3
1f10: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
1f20: 64 62 2c 2a 70 70 45 78 70 72 2c 20 70 45 29 3b  db,*ppExpr, pE);
1f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1f40: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
1f50: 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65  operty on all te
1f60: 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e  rms of the given
1f70: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
1f80: 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72  And set the Expr
1f90: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
1fa0: 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65   to iTable for e
1fb0: 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
1fc0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  .** expression..
1fd0: 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f  **.** The EP_Fro
1fe0: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69  mJoin property i
1ff0: 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20  s used on terms 
2000: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
2010: 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20   to tell.** the 
2020: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
2030: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
2040: 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20   that this term 
2050: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a  is part of the.*
2060: 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69  * join restricti
2070: 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  on specified in 
2080: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2090: 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61  clause and not a
20a0: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
20b0: 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45  more general WHE
20c0: 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73  RE clause.  Thes
20d0: 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65  e terms are move
20e0: 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a  d over to the.**
20f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75   WHERE clause du
2100: 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73  ring join proces
2110: 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64  sing but we need
2120: 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
2130: 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e  t they.** origin
2140: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
2150: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  r USING clause..
2160: 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69  **.** The Expr.i
2170: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
2180: 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63  ells the WHERE c
2190: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
21a0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70   that the.** exp
21b0: 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20  ression depends 
21c0: 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a  on table iRightJ
21d0: 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66  oinTable even if
21e0: 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e   that table is n
21f0: 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79  ot.** explicitly
2200: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
2210: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  e expression.  T
2220: 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  hat information 
2230: 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72  is needed.** for
2240: 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73   cases like this
2250: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
2260: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
2270: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
2280: 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35  =t2.b AND t1.x=5
2290: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65  .**.** The where
22a0: 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f   clause needs to
22b0: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
22c0: 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d  ing of the t1.x=
22d0: 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20  5.** term until 
22e0: 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f  after the t2 loo
22f0: 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  p of the join.  
2300: 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a  In that way, a.*
2310: 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69  * NULL t2 row wi
2320: 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77  ll be inserted w
2330: 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e  henever t1.x!=5.
2340: 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a    If we do not.*
2350: 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  * defer the hand
2360: 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20  ling of t1.x=5, 
2370: 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65  it will be proce
2380: 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ssed immediately
2390: 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31  .** after the t1
23a0: 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77   loop and rows w
23b0: 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c  ith t1.x!=5 will
23c0: 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e   never appear in
23d0: 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20  .** the output, 
23e0: 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65  which is incorre
23f0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
2400: 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45  id setJoinExpr(E
2410: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  xpr *p, int iTab
2420: 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  le){.  while( p 
2430: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
2440: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
2450: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d 3e 69  mJoin);.    p->i
2460: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
2470: 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65 74   iTable;.    set
2480: 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66  JoinExpr(p->pLef
2490: 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  t, iTable);.    
24a0: 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20  p = p->pRight;. 
24b0: 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   } .}../*.** Thi
24c0: 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73  s routine proces
24d0: 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66  ses the join inf
24e0: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53  ormation for a S
24f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2500: 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  .** ON and USING
2510: 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e   clauses are con
2520: 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72  verted into extr
2530: 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  a terms of the W
2540: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  HERE clause..** 
2550: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c  NATURAL joins al
2560: 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20  so create extra 
2570: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2580: 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  ms..**.** The te
2590: 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c  rms of a FROM cl
25a0: 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e  ause are contain
25b0: 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74  ed in the Select
25c0: 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e  .pSrc structure.
25d0: 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73  .** The left mos
25e0: 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66  t table is the f
25f0: 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65  irst entry in Se
2600: 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20  lect.pSrc.  The 
2610: 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61  right-most.** ta
2620: 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20  ble is the last 
2630: 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e  entry.  The join
2640: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c   operator is hel
2650: 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  d in the entry t
2660: 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20  o.** the left.  
2670: 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e  Thus entry 0 con
2680: 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f  tains the join o
2690: 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20  perator for the 
26a0: 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20  join between.** 
26b0: 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e  entries 0 and 1.
26c0: 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e    Any ON or USIN
26d0: 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69  G clauses associ
26e0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f  ated with the jo
26f0: 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61  in are.** also a
2700: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c  ttached to the l
2710: 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a  eft entry..**.**
2720: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
2730: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
2740: 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75   of errors encou
2750: 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ntered..*/.stati
2760: 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63  c int sqliteProc
2770: 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70  essJoin(Parse *p
2780: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
2790: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
27a0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
27b0: 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c       /* All tabl
27c0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
27d0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
27e0: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
27f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2800: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
2810: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2820: 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20  item *pLeft;    
2830: 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62   /* Left table b
2840: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20  eing joined */. 
2850: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2860: 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20  item *pRight;   
2870: 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20   /* Right table 
2880: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
2890: 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
28a0: 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53  c;.  pLeft = &pS
28b0: 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67  rc->a[0];.  pRig
28c0: 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a  ht = &pLeft[1];.
28d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
28e0: 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20  c->nSrc-1; i++, 
28f0: 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b  pRight++, pLeft+
2900: 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
2910: 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d  LeftTab = pLeft-
2920: 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65  >pTab;.    Table
2930: 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52   *pRightTab = pR
2940: 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20  ight->pTab;.    
2950: 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20  int isOuter;..  
2960: 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66    if( NEVER(pLef
2970: 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68  tTab==0 || pRigh
2980: 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69  tTab==0) ) conti
2990: 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72  nue;.    isOuter
29a0: 20 3d 20 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e   = (pRight->join
29b0: 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
29c0: 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  !=0;..    /* Whe
29d0: 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  n the NATURAL ke
29e0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
29f0: 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75  , add WHERE clau
2a00: 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20  se terms for.   
2a10: 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   ** every column
2a20: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61   that the two ta
2a30: 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d  bles have in com
2a40: 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mon..    */.    
2a50: 69 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e  if( pRight->join
2a60: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
2a70: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
2a80: 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52  Right->pOn || pR
2a90: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
2aa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2ab0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2ac0: 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20  "a NATURAL join 
2ad0: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20  may not have ". 
2ae0: 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e            "an ON
2af0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2b00: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
2b10: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
2b20: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
2b30: 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f 6c  j<pLeftTab->nCol
2b40: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2b50: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c  char *zName = pL
2b60: 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  eftTab->aCol[j].
2b70: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
2b80: 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  f( columnIndex(p
2b90: 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29  RightTab, zName)
2ba0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
2bb0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
2bc0: 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65  arse, zName, pLe
2bd0: 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41  ftTab, pLeft->zA
2be0: 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20  lias, .         
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c 20       pRightTab, 
2c10: 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a  pRight->zAlias,.
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
2c40: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26  ight->iCursor, &
2c50: 70 2d 3e 70 57 68 65 72 65 2c 20 69 73 4f 75 74  p->pWhere, isOut
2c60: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0a  er);.          .
2c70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c80: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2c90: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
2ca0: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2cb0: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
2cc0: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
2cd0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26  f( pRight->pOn &
2ce0: 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  & pRight->pUsing
2cf0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d00: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2d10: 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62  , "cannot have b
2d20: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
2d30: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75   ".        "clau
2d40: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
2d50: 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  join");.      re
2d60: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
2d70: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e     /* Add the ON
2d80: 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65   clause to the e
2d90: 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
2da0: 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65  clause, connecte
2db0: 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41  d by.    ** an A
2dc0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  ND operator..   
2dd0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
2de0: 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20  ht->pOn ){.     
2df0: 20 69 66 28 20 69 73 4f 75 74 65 72 20 29 20 73   if( isOuter ) s
2e00: 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68  etJoinExpr(pRigh
2e10: 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e  t->pOn, pRight->
2e20: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
2e30: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
2e40: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
2e50: 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  e->db, p->pWhere
2e60: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
2e70: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
2e80: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
2e90: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
2ea0: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
2eb0: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
2ec0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
2ed0: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
2ee0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
2ef0: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
2f00: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
2f10: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
2f20: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
2f30: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
2f40: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
2f50: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
2f60: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
2f70: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
2f80: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
2f90: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
2fa0: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
2fb0: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
2fc0: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
2fd0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
2fe0: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
2ff0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
3000: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
3010: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
3020: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3030: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
3040: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
3050: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
3060: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3070: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
3080: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
3090: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
30a0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
30b0: 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64     if( columnInd
30c0: 65 78 28 70 4c 65 66 74 54 61 62 2c 20 7a 4e 61  ex(pLeftTab, zNa
30d0: 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49  me)<0 || columnI
30e0: 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20  ndex(pRightTab, 
30f0: 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20  zName)<0 ){.    
3100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3110: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
3120: 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67  annot join using
3130: 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c   column %s - col
3140: 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20  umn ".          
3150: 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69    "not present i
3160: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20  n both tables", 
3170: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
3180: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3190: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
31a0: 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73  dWhereTerm(pPars
31b0: 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54  e, zName, pLeftT
31c0: 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61  ab, pLeft->zAlia
31d0: 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  s, .            
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f0: 70 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68  pRightTab, pRigh
3200: 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20  t->zAlias,.     
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3220: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69         pRight->i
3230: 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65  Cursor, &p->pWhe
3240: 72 65 2c 20 69 73 4f 75 74 65 72 29 3b 0a 20 20  re, isOuter);.  
3250: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3260: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
3270: 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64 65  *.** Insert code
3280: 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74 20 77   into "v" that w
3290: 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63  ill push the rec
32a0: 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f  ord on the top o
32b0: 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69  f the.** stack i
32c0: 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a  nto the sorter..
32d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
32e0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20  ushOntoSorter(. 
32f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3300: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
3310: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
3320: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
3330: 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  y,    /* The ORD
3340: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
3350: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
3360: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
3370: 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61  whole SELECT sta
3380: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
3390: 72 65 67 44 61 74 61 20 20 20 20 20 20 20 20 20  regData         
33a0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
33b0: 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62  olding data to b
33c0: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29 7b 0a 20  e sorted */.){. 
33d0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
33e0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
33f0: 6e 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  nExpr = pOrderBy
3400: 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20 72  ->nExpr;.  int r
3410: 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33  egBase = sqlite3
3420: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
3430: 72 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20  rse, nExpr+2);. 
3440: 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d   int regRecord =
3450: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
3460: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
3470: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
3480: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
3490: 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c  rderBy, regBase,
34a0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
34b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
34c0: 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65 72 42  equence, pOrderB
34d0: 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67  y->iECursor, reg
34e0: 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 73  Base+nExpr);.  s
34f0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
3500: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61  ve(pParse, regDa
3510: 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  ta, regBase+nExp
3520: 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  r+1, 1);.  sqlit
3530: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
3540: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
3550: 65 67 42 61 73 65 2c 20 6e 45 78 70 72 20 2b 20  egBase, nExpr + 
3560: 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  2, regRecord);. 
3570: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3580: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
3590: 72 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  rt, pOrderBy->iE
35a0: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
35b0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  d);.  sqlite3Rel
35c0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
35d0: 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
35e0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
35f0: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
3600: 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72  , regBase, nExpr
3610: 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65  +2);.  if( pSele
3620: 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20  ct->iLimit ){.  
3630: 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64    int addr1, add
3640: 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d  r2;.    int iLim
3650: 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c  it;.    if( pSel
3660: 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a  ect->iOffset ){.
3670: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70        iLimit = p
3680: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b  Select->iOffset+
3690: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
36a0: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
36b0: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  lect->iLimit;.  
36c0: 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20    }.    addr1 = 
36d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36e0: 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  1(v, OP_IfZero, 
36f0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c  iLimit);.    sql
3700: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3710: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69  , OP_AddImm, iLi
3720: 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64  mit, -1);.    ad
3730: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
3740: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
3750: 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  to);.    sqlite3
3760: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
3770: 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  addr1);.    sqli
3780: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
3790: 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72   OP_Last, pOrder
37a0: 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  By->iECursor);. 
37b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37c0: 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp1(v, OP_Delet
37d0: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  e, pOrderBy->iEC
37e0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  ursor);.    sqli
37f0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3800: 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 70  v, addr2);.    p
3810: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d  Select->iLimit =
3820: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
3830: 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70   Add code to imp
3840: 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45  lement the OFFSE
3850: 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  T.*/.static void
3860: 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56   codeOffset(.  V
3870: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
3880: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
3890: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a  e into this VM *
38a0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
38b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
38c0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
38d0: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
38e0: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20  nt iContinue    
38f0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
3900: 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e   skip the curren
3910: 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20  t record */.){. 
3920: 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20   if( p->iOffset 
3930: 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  && iContinue!=0 
3940: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  ){.    int addr;
3950: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3960: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
3970: 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  Imm, p->iOffset,
3980: 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d   -1);.    addr =
3990: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
39a0: 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65 67 2c 20  p1(v, OP_IfNeg, 
39b0: 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  p->iOffset);.   
39c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
39d0: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
39e0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
39f0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
3a00: 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54 20 72  , "skip OFFSET r
3a10: 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20 20 73  ecords"));.    s
3a20: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
3a30: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d  re(v, addr);.  }
3a40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f  .}../*.** Add co
3a50: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65  de that will che
3a60: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
3a70: 74 68 65 20 4e 20 72 65 67 69 73 74 65 72 73 20  the N registers 
3a80: 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d 65 6d  starting at iMem
3a90: 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73 74 69  .** form a disti
3aa0: 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54 61 62  nct entry.  iTab
3ab0: 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e   is a sorting in
3ac0: 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70  dex that holds p
3ad0: 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65  reviously.** see
3ae0: 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  n combinations o
3af0: 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20  f the N values. 
3b00: 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   A new entry is 
3b10: 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20  made in iTab.** 
3b20: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e  if the current N
3b30: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e   values are new.
3b40: 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f  .**.** A jump to
3b50: 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d   addrRepeat is m
3b60: 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20  ade and the N+1 
3b70: 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65  values are poppe
3b80: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74  d from the.** st
3b90: 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e  ack if the top N
3ba0: 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f   elements are no
3bb0: 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73  t distinct..*/.s
3bc0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44  tatic void codeD
3bd0: 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72 73 65  istinct(.  Parse
3be0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
3bf0: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
3c00: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
3c10: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  text */.  int iT
3c20: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
3c30: 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  A sorting index 
3c40: 75 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72  used to test for
3c50: 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f   distinctness */
3c60: 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70 65 61  .  int addrRepea
3c70: 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  t,    /* Jump to
3c80: 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73   here if not dis
3c90: 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e  tinct */.  int N
3ca0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3cb0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
3cc0: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65  nts */.  int iMe
3cd0: 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m           /* F
3ce0: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  irst element */.
3cf0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
3d00: 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70  int r1;..  v = p
3d10: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
3d20: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
3d30: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
3d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3d50: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
3d60: 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72  cord, iMem, N, r
3d70: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
3d80: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f  eAddOp3(v, OP_Fo
3d90: 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72 52  und, iTab, addrR
3da0: 65 70 65 61 74 2c 20 72 31 29 3b 0a 20 20 73 71  epeat, r1);.  sq
3db0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3dc0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
3dd0: 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71   iTab, r1);.  sq
3de0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
3df0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
3e00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
3e10: 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
3e20: 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43  age when a SELEC
3e30: 54 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  T is used within
3e40: 20 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e   a subexpression
3e50: 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22  .** (example:  "
3e60: 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  a IN (SELECT * F
3e70: 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74  ROM table)") but
3e80: 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61   it has more tha
3e90: 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f  n 1 result.** co
3ea0: 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69  lumn.  We do thi
3eb0: 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e  s in a subroutin
3ec0: 65 20 62 65 63 61 75 73 65 20 74 68 65 20 65 72  e because the er
3ed0: 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 6d 75  ror occurs in mu
3ee0: 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c 61 63 65 73  ltiple.** places
3ef0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3f00: 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
3f10: 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a  umnSelectError(.
3f20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3f30: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
3f40: 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65  context. */.  Se
3f50: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
3f60: 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
3f70: 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75  n of SELECT resu
3f80: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  lts */.  int nEx
3f90: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pr            /*
3fa0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
3fb0: 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  t columns return
3fc0: 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a  ed by SELECT */.
3fd0: 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  ){.  int eDest =
3fe0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20   pDest->eDest;. 
3ff0: 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20   if( nExpr>1 && 
4000: 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20  (eDest==SRT_Mem 
4010: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65  || eDest==SRT_Se
4020: 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
4030: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4040: 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  , "only a single
4050: 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20   result allowed 
4060: 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20  for ".       "a 
4070: 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70  SELECT that is p
4080: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
4090: 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  sion");.    retu
40a0: 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 1;.  }else{. 
40b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
40c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
40d0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
40e0: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
40f0: 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20  e inside of the 
4100: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
4110: 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a   a SELECT..**.**
4120: 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e   If srcTab and n
4130: 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20  Column are both 
4140: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
4150: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
4160: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
4170: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
4180: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
4190: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43  this row.  If nC
41a0: 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20  olumn>0.** then 
41b0: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
41c0: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
41d0: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
41e0: 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a  ly to get the.**
41f0: 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65   datatypes for e
4200: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
4210: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
4220: 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61  tInnerLoop(.  Pa
4230: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4240: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
4250: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
4260: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
4270: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4280: 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20  complete select 
4290: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
42a0: 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  coded */.  ExprL
42b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
42c0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61     /* List of va
42d0: 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61  lues being extra
42e0: 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72  cted */.  int sr
42f0: 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  cTab,           
4300: 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66    /* Pull data f
4310: 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a  rom this table *
4320: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
4330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4340: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
4350: 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74   in the source t
4360: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
4370: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
4380: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
4390: 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75  , sort results u
43a0: 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f  sing this key */
43b0: 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c  .  int distinct,
43c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
43d0: 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20   >=0, make sure 
43e0: 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74  results are dist
43f0: 69 6e 63 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  inct */.  Select
4400: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
4410: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
4420: 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
4430: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ts */.  int iCon
4440: 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20  tinue,          
4450: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
4460: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
4470: 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  xt row */.  int 
4480: 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
4490: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
44a0: 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
44b0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
44c0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
44d0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
44e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
44f0: 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20  hasDistinct;    
4500: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
4510: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
4520: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
4530: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  /.  int regResul
4540: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4550: 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f  /* Start of memo
4560: 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  ry holding resul
4570: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65  t set */.  int e
4580: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
4590: 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f  est;   /* How to
45a0: 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75   dispose of resu
45b0: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  lts */.  int iPa
45c0: 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50 61 72  rm = pDest->iPar
45d0: 6d 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72  m;   /* First ar
45e0: 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73  gument to dispos
45f0: 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69  al method */.  i
4600: 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20  nt nResultCol;  
4610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4620: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
4630: 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73  olumns */..  ass
4640: 65 72 74 28 20 76 20 29 3b 0a 20 20 69 66 28 20  ert( v );.  if( 
4650: 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
4660: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
4670: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68  pEList!=0 );.  h
4680: 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73  asDistinct = dis
4690: 74 69 6e 63 74 3e 3d 30 3b 0a 20 20 69 66 28 20  tinct>=0;.  if( 
46a0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21  pOrderBy==0 && !
46b0: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
46c0: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
46d0: 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   p, iContinue);.
46e0: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74    }..  /* Pull t
46f0: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
4700: 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  umns..  */.  if(
4710: 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20   nColumn>0 ){.  
4720: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 6e    nResultCol = n
4730: 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b  Column;.  }else{
4740: 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20  .    nResultCol 
4750: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
4760: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73 74  .  }.  if( pDest
4770: 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20  ->iMem==0 ){.   
4780: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 70   pDest->iMem = p
4790: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
47a0: 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d     pDest->nMem =
47b0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20   nResultCol;.   
47c0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
47d0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
47e0: 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65 72  else{ .    asser
47f0: 74 28 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 3d 3d  t( pDest->nMem==
4800: 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20  nResultCol );.  
4810: 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20  }.  regResult = 
4820: 70 44 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20 20 69  pDest->iMem;.  i
4830: 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a  f( nColumn>0 ){.
4840: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
4850: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
4860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4870: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
4880: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72  mn, srcTab, i, r
4890: 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20  egResult+i);.   
48a0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
48b0: 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73  Dest!=SRT_Exists
48c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
48d0: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
48e0: 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20   an EXISTS(...) 
48f0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
4900: 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61  actual.    ** va
4910: 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79  lues returned by
4920: 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20   the SELECT are 
4930: 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
4940: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
4950: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
4960: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
4970: 20 72 65 67 52 65 73 75 6c 74 2c 20 65 44 65 73   regResult, eDes
4980: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 29 3b 0a  t==SRT_Output);.
4990: 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20    }.  nColumn = 
49a0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 2f  nResultCol;..  /
49b0: 2a 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43  * If the DISTINC
49c0: 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72  T keyword was pr
49d0: 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c  esent on the SEL
49e0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
49f0: 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20  ** and this row 
4a00: 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65  has been seen be
4a10: 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  fore, then do no
4a20: 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a  t make this row.
4a30: 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65    ** part of the
4a40: 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20   result..  */.  
4a50: 69 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20  if( hasDistinct 
4a60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4a70: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  EList!=0 );.    
4a80: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e  assert( pEList->
4a90: 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29  nExpr==nColumn )
4aa0: 3b 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e  ;.    codeDistin
4ab0: 63 74 28 70 50 61 72 73 65 2c 20 64 69 73 74 69  ct(pParse, disti
4ac0: 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  nct, iContinue, 
4ad0: 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 73 75  nColumn, regResu
4ae0: 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72  lt);.    if( pOr
4af0: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
4b00: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
4b10: 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  p, iContinue);. 
4b20: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
4b30: 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
4b40: 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70  umnSelectError(p
4b50: 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45  Parse, pDest, pE
4b60: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
4b70: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
4b80: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
4b90: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
4ba0: 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65  is mode, write e
4bb0: 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ach query result
4bc0: 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74   to the key of t
4bd0: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
4be0: 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   ** table iParm.
4bf0: 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
4c00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
4c10: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20  OUND_SELECT.    
4c20: 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20  case SRT_Union: 
4c30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  {.      int r1;.
4c40: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
4c50: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
4c60: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
4c70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4c80: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4c90: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
4ca0: 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  mn, r1);.      s
4cb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4cc0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
4cd0: 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20  , iParm, r1);.  
4ce0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
4cf0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
4d00: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
4d10: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
4d20: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65  * Construct a re
4d30: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75  cord from the qu
4d40: 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20  ery result, but 
4d50: 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
4d60: 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65  * saving that re
4d70: 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20  cord, use it as 
4d80: 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20  a key to delete 
4d90: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20  elements from.  
4da0: 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61    ** the tempora
4db0: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
4dc0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4dd0: 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20  SRT_Except: {.  
4de0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4df0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44  ddOp3(v, OP_IdxD
4e00: 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65  elete, iParm, re
4e10: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
4e20: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4e30: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
4e40: 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
4e50: 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
4e60: 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
4e70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
4e80: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
4e90: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
4ea0: 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
4eb0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
4ec0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
4ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4ee0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4ef0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
4f00: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31  ult, nColumn, r1
4f10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
4f20: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
4f30: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
4f40: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
4f50: 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  , p, r1);.      
4f60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
4f70: 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
4f80: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
4f90: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4fa0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4fb0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
4fc0: 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  rm, r2);.       
4fd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4fe0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
4ff0: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b   iParm, r1, r2);
5000: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5010: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
5020: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
5030: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
5040: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
5050: 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
5060: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5070: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5080: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5090: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
50a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
50b0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
50c0: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
50d0: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
50e0: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
50f0: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
5100: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
5110: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
5120: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
5130: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
5140: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
5150: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
5160: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
5170: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
5180: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
5190: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
51a0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
51b0: 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69  .      p->affini
51c0: 74 79 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ty = sqlite3Comp
51d0: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69  areAffinity(pELi
51e0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
51f0: 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29  pDest->affinity)
5200: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
5210: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
5220: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
5230: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
5240: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
5250: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
5260: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
5270: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
5280: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
5290: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
52a0: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
52b0: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
52c0: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
52d0: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
52e0: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
52f0: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
5300: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
5310: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
5320: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
5330: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
5340: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
5350: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5360: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
5370: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5380: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
5390: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
53a0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
53b0: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 2c  d, regResult, 1,
53c0: 20 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74   r1, &p->affinit
53d0: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  y, 1);.        s
53e0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
53f0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
5400: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
5410: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
5420: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5430: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
5440: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
5450: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5460: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5470: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r1);.      }. 
5480: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5490: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  }..    /* If any
54a0: 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
54b0: 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
54c0: 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
54d0: 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
54e0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
54f0: 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
5500: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5510: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
5520: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
5530: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
5540: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
5550: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
5560: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
5570: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
5580: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
5590: 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
55a0: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
55b0: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
55c0: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
55d0: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
55e0: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
55f0: 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
5600: 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
5610: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
5620: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5630: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
5640: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
5650: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
5660: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
5670: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
5680: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
5690: 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  rBy, p, regResul
56a0: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
56b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
56c0: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
56d0: 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  rse, regResult, 
56e0: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
56f0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
5700: 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
5710: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
5720: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
5730: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
5740: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
5750: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5760: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
5770: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65  .    /* Send the
5780: 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c   data to the cal
5790: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f  lback function o
57a0: 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e  r to a subroutin
57b0: 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a  e.  In the.    *
57c0: 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75 62 72  * case of a subr
57d0: 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72  outine, the subr
57e0: 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73  outine itself is
57f0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
5800: 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20  .    ** popping 
5810: 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  the data from th
5820: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  e stack..    */.
5830: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
5840: 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65  outine:.    case
5850: 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a 20   SRT_Output: {. 
5860: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5870: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  y ){.        int
5880: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5890: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
58a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
58b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
58c0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
58d0: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c  Result, nColumn,
58e0: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75   r1);.        pu
58f0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
5900: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
5910: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
5920: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5930: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5940: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
5950: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
5960: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
5970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5980: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
5990: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a   pDest->iParm);.
59a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
59b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
59c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
59d0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
59e0: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
59f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
5a00: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
5a10: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
5a20: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
5a30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5a40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
5a50: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5a60: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
5a70: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
5a80: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
5a90: 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
5aa0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
5ab0: 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
5ac0: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
5ad0: 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
5ae0: 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
5af0: 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
5b00: 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
5b10: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
5b20: 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
5b30: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
5b40: 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
5b50: 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
5b60: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
5b70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
5b80: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
5b90: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
5ba0: 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20  Discard );.     
5bb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
5bc0: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  ndif.  }..  /* J
5bd0: 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
5be0: 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
5bf0: 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
5c00: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
5c10: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
5c20: 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
5c30: 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 66 20 74 68  ==0 );  /* If th
5c40: 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
5c50: 42 59 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 0a  BY, the call to.
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
5c80: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20  ushOntoSorter() 
5c90: 77 6f 75 6c 64 20 68 61 76 65 20 63 6c 65 61 72  would have clear
5ca0: 65 64 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a  ed p->iLimit */.
5cb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5cc0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
5cd0: 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d  mm, p->iLimit, -
5ce0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
5cf0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5d00: 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  IfZero, p->iLimi
5d10: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a  t, iBreak);.  }.
5d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
5d30: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
5d40: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65  t, generate a Ke
5d50: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5d60: 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20  that records.** 
5d70: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
5d80: 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20  quence for each 
5d90: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
5da0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  at expression li
5db0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
5dc0: 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20   ExprList is an 
5dd0: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
5de0: 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e  P BY clause then
5df0: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a   the resulting.*
5e00: 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  * KeyInfo struct
5e10: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
5e20: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
5e30: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e  ing a virtual in
5e40: 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  dex to.** implem
5e50: 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e  ent that clause.
5e60: 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73    If the ExprLis
5e70: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
5e80: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a  set of a SELECT.
5e90: 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49  ** then the KeyI
5ea0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
5eb0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
5ec0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
5ed0: 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78  virtual.** index
5ee0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
5ef0: 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a  DISTINCT test..*
5f00: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
5f10: 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
5f20: 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
5f30: 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  in from malloc. 
5f40: 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
5f50: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
5f60: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69  onsible for seei
5f70: 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
5f80: 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
5f90: 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20  ally.** freed.  
5fa0: 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  Add the KeyInfo 
5fb0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65  structure to the
5fc0: 20 50 34 20 66 69 65 6c 64 20 6f 66 20 61 6e 20   P4 field of an 
5fd0: 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20  opcode using.** 
5fe0: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
5ff0: 46 46 20 69 73 20 74 68 65 20 75 73 75 61 6c 20  FF is the usual 
6000: 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77  way of dealing w
6010: 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61  ith this..*/.sta
6020: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79  tic KeyInfo *key
6030: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
6040: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6050: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
6060: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
6070: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
6080: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79  int nExpr;.  Key
6090: 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73  Info *pInfo;.  s
60a0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
60b0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
60c0: 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20  t i;..  nExpr = 
60d0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
60e0: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  pInfo = sqlite3D
60f0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
6100: 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b  sizeof(*pInfo) +
6110: 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43   nExpr*(sizeof(C
6120: 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20  ollSeq*)+1) );. 
6130: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
6140: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
6150: 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66  der = (u8*)&pInf
6160: 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b  o->aColl[nExpr];
6170: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65  .    pInfo->nFie
6180: 6c 64 20 3d 20 28 75 31 36 29 6e 45 78 70 72 3b  ld = (u16)nExpr;
6190: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20  .    pInfo->enc 
61a0: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70  = ENC(db);.    p
61b0: 49 6e 66 6f 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  Info->db = db;. 
61c0: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
61d0: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45  m=pList->a; i<nE
61e0: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
61f0: 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  +){.      CollSe
6200: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
6210: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
6220: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
6230: 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
6240: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  ;.      if( !pCo
6250: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
6260: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
6270: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
6280: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b     pInfo->aColl[
6290: 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
62a0: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
62b0: 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  der[i] = pItem->
62c0: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
62d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
62e0: 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  nfo;.}.../*.** I
62f0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
6300: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
6310: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
6320: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
6330: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
6340: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
6350: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
6360: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
6370: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
6380: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
6390: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
63a0: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
63b0: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
63c0: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
63d0: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
63e0: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
63f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
6400: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
6410: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
6420: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
6430: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
6440: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
6450: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
6460: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
6470: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
6480: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
6490: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45  e into this VDBE
64a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
64b0: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
64c0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
64d0: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
64e0: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
64f0: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
6500: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6510: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65  ){.  int addrBre
6520: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
6530: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20  MakeLabel(v);   
6540: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
6550: 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20  o exit loop */. 
6560: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75   int addrContinu
6570: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
6580: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
6590: 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e   Jump here for n
65a0: 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
65b0: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69  nt addr;.  int i
65c0: 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64  Tab;.  int pseud
65d0: 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72  oTab = 0;.  Expr
65e0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
65f0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20   p->pOrderBy;.. 
6600: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
6610: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74  st->eDest;.  int
6620: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
6630: 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65  iParm;..  int re
6640: 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52  gRow;.  int regR
6650: 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20  owid;..  iTab = 
6660: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
6670: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
6680: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
6690: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
66a0: 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65 75 64  ine ){.    pseud
66b0: 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  oTab = pParse->n
66c0: 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
66d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
66e0: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70  OP_OpenPseudo, p
66f0: 73 65 75 64 6f 54 61 62 2c 20 65 44 65 73 74 3d  seudoTab, eDest=
6700: 3d 53 52 54 5f 4f 75 74 70 75 74 2c 20 6e 43 6f  =SRT_Output, nCo
6710: 6c 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20 61 64 64  lumn);.  }.  add
6720: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
6730: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6740: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
6750: 42 72 65 61 6b 29 3b 0a 20 20 63 6f 64 65 4f 66  Break);.  codeOf
6760: 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64 72 43  fset(v, p, addrC
6770: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 72 65 67 52  ontinue);.  regR
6780: 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ow = sqlite3GetT
6790: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
67a0: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c    regRowid = sql
67b0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
67c0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
67d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
67e0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  P_Column, iTab, 
67f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
6800: 2b 20 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  + 1, regRow);.  
6810: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
6820: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
6830: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
6840: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
6850: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
6860: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
6870: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6880: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
6890: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73  emTab );.      s
68a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
68b0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
68c0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
68d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
68e0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
68f0: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
6900: 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64  regRow, regRowid
6910: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6920: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6930: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
6940: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6950: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
6960: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
6970: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
6980: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
6990: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
69a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
69b0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
69c0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  keRecord, regRow
69d0: 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 20 26  , 1, regRowid, &
69e0: 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  p->affinity, 1);
69f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
6a00: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
6a10: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
6a20: 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20  gRow, 1);.      
6a30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6a40: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
6a50: 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  t, iParm, regRow
6a60: 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  id);.      break
6a70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6a80: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
6a90: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
6aa0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
6ab0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
6ac0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
6ad0: 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  , iParm, 1);.   
6ae0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
6af0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
6b00: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
6b10: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
6b20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
6b30: 69 66 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  if.    case SRT_
6b40: 4f 75 74 70 75 74 3a 0a 20 20 20 20 63 61 73 65  Output:.    case
6b50: 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
6b60: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
6b70: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
6b80: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
6b90: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
6ba0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
6bb0: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
6bc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6bd0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
6be0: 72 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b  r, 1, regRowid);
6bf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6c00: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
6c10: 6e 73 65 72 74 2c 20 70 73 65 75 64 6f 54 61 62  nsert, pseudoTab
6c20: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
6c30: 69 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  id);.      for(i
6c40: 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  =0; i<nColumn; i
6c50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
6c60: 65 72 74 28 20 72 65 67 52 6f 77 21 3d 70 44 65  ert( regRow!=pDe
6c70: 73 74 2d 3e 69 4d 65 6d 2b 69 20 29 3b 0a 20 20  st->iMem+i );.  
6c80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6c90: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
6ca0: 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c  lumn, pseudoTab,
6cb0: 20 69 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2b   i, pDest->iMem+
6cc0: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
6cd0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
6ce0: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
6cf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6d00: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
6d10: 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 4d 65  tRow, pDest->iMe
6d20: 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  m, nColumn);.   
6d30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6d40: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
6d50: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73  nge(pParse, pDes
6d60: 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e  t->iMem, nColumn
6d70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6d80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6d90: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
6da0: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50  Yield, pDest->iP
6db0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arm);.      }.  
6dc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6dd0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
6de0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
6df0: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ing */.      bre
6e00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
6e10: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
6e20: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
6e30: 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65 33  gRow);.  sqlite3
6e40: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6e50: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29  Parse, regRowid)
6e60: 3b 0a 0a 20 20 2f 2a 20 4c 49 4d 49 54 20 68 61  ;..  /* LIMIT ha
6e70: 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74  s been implement
6e80: 65 64 20 62 79 20 74 68 65 20 70 75 73 68 4f 6e  ed by the pushOn
6e90: 74 6f 53 6f 72 74 65 72 28 29 20 72 6f 75 74 69  toSorter() routi
6ea0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ne..  */.  asser
6eb0: 74 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20  t( p->iLimit==0 
6ec0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74  );..  /* The bot
6ed0: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  tom of the loop.
6ee0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
6ef0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
6f00: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
6f10: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6f20: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
6f30: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20   iTab, addr);.  
6f40: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
6f50: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
6f60: 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 65 44 65  reak);.  if( eDe
6f70: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
6f80: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
6f90: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71  outine ){.    sq
6fa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6fb0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65  v, OP_Close, pse
6fc0: 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a  udoTab, 0);.  }.
6fd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6fe0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
6ff0: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
7000: 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f   the 'declaratio
7010: 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a  n type' of the.*
7020: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * expression pEx
7030: 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d  pr. The string m
7040: 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ay be treated as
7050: 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63   static by the c
7060: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  aller..**.** The
7070: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
7080: 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20 64  e is the exact d
7090: 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74 69  atatype definiti
70a0: 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  on extracted fro
70b0: 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61  m the.** origina
70c0: 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  l CREATE TABLE s
70d0: 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20  tatement if the 
70e0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
70f0: 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64  column. The.** d
7100: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
7110: 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c  for a ROWID fiel
7120: 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78  d is INTEGER. Ex
7130: 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78  actly when an ex
7140: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63  pression.** is c
7150: 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75  onsidered a colu
7160: 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  mn can be comple
7170: 78 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63  x in the presenc
7180: 65 20 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e  e of subqueries.
7190: 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73   The.** result-s
71a0: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  et expression in
71b0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
71c0: 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61  owing SELECT sta
71d0: 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63  tements is .** c
71e0: 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75  onsidered a colu
71f0: 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  mn by this funct
7200: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ion..**.**   SEL
7210: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
7220: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
7230: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
7240: 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  bl;.**   SELECT 
7250: 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d  (SELECT col FROM
7260: 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45   tbl);.**   SELE
7270: 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c  CT abc FROM (SEL
7280: 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46  ECT col AS abc F
7290: 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a  ROM tbl);.** .**
72a0: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
72b0: 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78   type for any ex
72c0: 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74  pression other t
72d0: 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20  han a column is 
72e0: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
72f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75  const char *colu
7300: 6d 6e 54 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f  mnType(.  NameCo
7310: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45  ntext *pNC, .  E
7320: 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f  xpr *pExpr,.  co
7330: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
7340: 67 69 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  ginDb,.  const c
7350: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61  har **pzOriginTa
7360: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
7370: 2a 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b  **pzOriginCol.){
7380: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
7390: 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72  Type = 0;.  char
73a0: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44   const *zOriginD
73b0: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
73c0: 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20  nst *zOriginTab 
73d0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
73e0: 74 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20  t *zOriginCol = 
73f0: 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66  0;.  int j;.  if
7400: 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e  ( pExpr==0 || pN
7410: 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29  C->pSrcList==0 )
7420: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77   return 0;..  sw
7430: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
7440: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
7450: 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  GG_COLUMN:.    c
7460: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
7470: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
7480: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
7490: 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65  lumn. Locate the
74a0: 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d   table the colum
74b0: 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20  n is being.     
74c0: 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72   ** extracted fr
74d0: 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78  om in NameContex
74e0: 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73  t.pSrcList. This
74f0: 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65   table may be re
7500: 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  al.      ** data
7510: 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20  base table or a 
7520: 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20  subquery..      
7530: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
7540: 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pTab = 0;       
7550: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74       /* Table st
7560: 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69  ructure column i
7570: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
7580: 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
7590: 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20   *pS = 0;       
75a0: 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20        /* Select 
75b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78  the column is ex
75c0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a  tracted from */.
75d0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
75e0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
75f0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
7600: 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a  lumn in pTab */.
7610: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43        while( pNC
7620: 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
7630: 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54       SrcList *pT
7640: 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  abList = pNC->pS
7650: 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  rcList;.        
7660: 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69  for(j=0;j<pTabLi
7670: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
7680: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
7690: 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or!=pExpr->iTabl
76a0: 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  e;j++);.        
76b0: 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  if( j<pTabList->
76c0: 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nSrc ){.        
76d0: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
76e0: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
76f0: 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61          pS = pTa
7700: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c  bList->a[j].pSel
7710: 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ect;.        }el
7720: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
7730: 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a  C = pNC->pNext;.
7740: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7750: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  }..      if( pTa
7760: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
7770: 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20 20 20 20  /* FIX ME:.     
7780: 20 20 20 2a 2a 20 54 68 69 73 20 63 61 6e 20 6f     ** This can o
7790: 63 63 75 72 73 20 69 66 20 79 6f 75 20 68 61 76  ccurs if you hav
77a0: 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  e something like
77b0: 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 3b 22   "SELECT new.x;"
77c0: 20 69 6e 73 69 64 65 0a 20 20 20 20 20 20 20 20   inside.        
77d0: 2a 2a 20 61 20 74 72 69 67 67 65 72 2e 20 20 49  ** a trigger.  I
77e0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
77f0: 66 20 79 6f 75 20 72 65 66 65 72 65 6e 63 65 20  f you reference 
7800: 74 68 65 20 73 70 65 63 69 61 6c 20 22 6e 65 77  the special "new
7810: 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  ".        ** tab
7820: 6c 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  le in the result
7830: 20 73 65 74 20 6f 66 20 61 20 73 65 6c 65 63 74   set of a select
7840: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 68 61 76  .  We do not hav
7850: 65 20 61 20 67 6f 6f 64 20 77 61 79 0a 20 20 20  e a good way.   
7860: 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20       ** to find 
7870: 74 68 65 20 61 63 74 75 61 6c 20 74 61 62 6c 65  the actual table
7880: 20 74 79 70 65 2c 20 73 6f 20 63 61 6c 6c 20 69   type, so call i
7890: 74 20 22 54 45 58 54 22 2e 20 20 54 68 69 73 20  t "TEXT".  This 
78a0: 69 73 20 72 65 61 6c 6c 79 0a 20 20 20 20 20 20  is really.      
78b0: 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f    ** something o
78c0: 66 20 61 20 62 75 67 2c 20 62 75 74 20 49 20 64  f a bug, but I d
78d0: 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 74  o not know how t
78e0: 6f 20 66 69 78 20 69 74 2e 0a 20 20 20 20 20 20  o fix it..      
78f0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
7900: 54 68 69 73 20 63 6f 64 65 20 64 6f 65 73 20 6e  This code does n
7910: 6f 74 20 70 72 6f 64 75 63 65 20 74 68 65 20 63  ot produce the c
7920: 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2d 20  orrect answer - 
7930: 69 74 20 6a 75 73 74 20 70 72 65 76 65 6e 74 73  it just prevents
7940: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73 65  .        ** a se
7950: 67 66 61 75 6c 74 2e 20 20 53 65 65 20 74 69 63  gfault.  See tic
7960: 6b 65 74 20 23 31 32 32 39 2e 0a 20 20 20 20 20  ket #1229..     
7970: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 54     */.        zT
7980: 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a 20 20  ype = "TEXT";.  
7990: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
79a0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
79b0: 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20 20 20  rt( pTab );.    
79c0: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
79d0: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
79e0: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
79f0: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
7a00: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
7a10: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
7a20: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
7a30: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
7a40: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
7a50: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
7a60: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
7a70: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
7a80: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
7a90: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
7aa0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
7ab0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 69      if( ALWAYS(i
7ac0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
7ad0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  S->pEList->nExpr
7ae0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
7af0: 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73  * If iCol is les
7b00: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
7b10: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
7b20: 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20   requests the.  
7b30: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64          ** rowid
7b40: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
7b50: 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73  ct or view. This
7b60: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c   expression is l
7b70: 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20  egal (see .     
7b80: 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73       ** test cas
7b90: 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69  e misc2.2.2) - i
7ba0: 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74  t always evaluat
7bb0: 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20  es to NULL..    
7bc0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
7bd0: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
7be0: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  NC;.          Ex
7bf0: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
7c00: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
7c10: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  r;.          sNC
7c20: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
7c30: 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  pSrc;.          
7c40: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  sNC.pNext = 0;. 
7c50: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
7c60: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
7c70: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
7c80: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
7c90: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69  &sNC, p, &zOrigi
7ca0: 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62  nDb, &zOriginTab
7cb0: 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20  , &zOriginCol); 
7cc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7cd0: 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
7ce0: 53 28 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  S(pTab->pSchema)
7cf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
7d00: 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20   real table */. 
7d10: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
7d20: 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pS );.        if
7d30: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
7d40: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
7d50: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
7d60: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
7d70: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
7d80: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
7d90: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
7da0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
7db0: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
7dc0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43          zOriginC
7dd0: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
7de0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7df0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
7e00: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
7e10: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  zType;.         
7e20: 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70 54   zOriginCol = pT
7e30: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
7e40: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
7e50: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 54          zOriginT
7e60: 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ab = pTab->zName
7e70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
7e80: 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20  C->pParse ){.   
7e90: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d         int iDb =
7ea0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
7eb0: 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73  Index(pNC->pPars
7ec0: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
7ed0: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  hema);.         
7ee0: 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e 43   zOriginDb = pNC
7ef0: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  ->pParse->db->aD
7f00: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
7f10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7f20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7f30: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
7f40: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
7f50: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
7f60: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
7f70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
7f80: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52   a sub-select. R
7f90: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
7fa0: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20  ation type and. 
7fb0: 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69       ** origin i
7fc0: 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67  nfo for the sing
7fd0: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  le column in the
7fe0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
7ff0: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
8000: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ** statement..  
8010: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d      */.      Nam
8020: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
8030: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
8040: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
8050: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
8060: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
8070: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
8080: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
8090: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
80a0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
80b0: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
80c0: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
80d0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
80e0: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
80f0: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
8100: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
8110: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
8120: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69  &sNC, p, &zOrigi
8130: 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62  nDb, &zOriginTab
8140: 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20  , &zOriginCol); 
8150: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8160: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
8170: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e   .  if( pzOrigin
8180: 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Db ){.    assert
8190: 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26  ( pzOriginTab &&
81a0: 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a   pzOriginCol );.
81b0: 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20      *pzOriginDb 
81c0: 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20  = zOriginDb;.   
81d0: 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20   *pzOriginTab = 
81e0: 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20  zOriginTab;.    
81f0: 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a  *pzOriginCol = z
8200: 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20  OriginCol;.  }. 
8210: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
8220: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
8230: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
8240: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
8250: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
8260: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
8270: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
8280: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
8290: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
82a0: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
82b0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
82c0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
82d0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
82e0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
82f0: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
8300: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
8310: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
8320: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
8330: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
8340: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
8350: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
8360: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
8370: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
8380: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
8390: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
83a0: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
83b0: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
83c0: 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d  pParse;.  for(i=
83d0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
83e0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
83f0: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
8400: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
8410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
8420: 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
8430: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
8440: 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73  ETADATA.    cons
8450: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
8460: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
8470: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
8480: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
8490: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
84a0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
84b0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
84c0: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
84d0: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29  gTab, &zOrigCol)
84e0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64  ;..    /* The vd
84f0: 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73  be must make its
8500: 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65   own copy of the
8510: 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64   column-type and
8520: 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   other .    ** c
8530: 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73  olumn specific s
8540: 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20  trings, in case 
8550: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65  the schema is re
8560: 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a  set before this.
8570: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d      ** virtual m
8580: 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65  achine is delete
8590: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
85a0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
85b0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
85c0: 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69  E_DATABASE, zOri
85d0: 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  gDb, SQLITE_TRAN
85e0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
85f0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8600: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8610: 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c  TABLE, zOrigTab,
8620: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
8630: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
8640: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8650: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55   i, COLNAME_COLU
8660: 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51  MN, zOrigCol, SQ
8670: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
8680: 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65  .#else.    zType
8690: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
86a0: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b  NC, p, 0, 0, 0);
86b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
86c0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
86d0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
86e0: 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c  DECLTYPE, zType,
86f0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
8700: 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  T);.  }.#endif /
8710: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  * SQLITE_OMIT_DE
8720: 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  CLTYPE */.}../*.
8730: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
8740: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
8750: 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d  the VDBE the nam
8760: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
8770: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
8780: 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  et.  This inform
8790: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
87a0: 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20   provide the.** 
87b0: 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69  azCol[] values i
87c0: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
87d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
87e0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
87f0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
8800: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
8810: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
8820: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
8830: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
8840: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
8850: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
8860: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
8870: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
8880: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
8890: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
88a0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
88b0: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   j;.  sqlite3 *d
88c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
88d0: 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c    int fullNames,
88e0: 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69   shortNames;..#i
88f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8900: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
8910: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
8920: 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
8930: 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
8940: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
8950: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8960: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
8970: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28  t( v!=0 );.  if(
8980: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
8990: 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d  sSet || NEVER(v=
89a0: 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  =0) || db->mallo
89b0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
89c0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  ;.  pParse->colN
89d0: 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66  amesSet = 1;.  f
89e0: 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ullNames = (db->
89f0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
8a00: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
8a10: 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20  .  shortNames = 
8a20: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
8a30: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
8a40: 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  s)!=0;.  sqlite3
8a50: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
8a60: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
8a70: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
8a80: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
8a90: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
8aa0: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
8ab0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
8ac0: 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74   if( p==0 ) cont
8ad0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45  inue;.    if( pE
8ae0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
8af0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
8b00: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
8b10: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
8b20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8b30: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8b40: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
8b50: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
8b60: 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
8b70: 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( (p->op==TK_C
8b80: 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  OLUMN || p->op==
8b90: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26  TK_AGG_COLUMN) &
8ba0: 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20  & pTabList ){.  
8bb0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
8bc0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
8bd0: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  l;.      int iCo
8be0: 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  l = p->iColumn;.
8bf0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41        for(j=0; A
8c00: 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74  LWAYS(j<pTabList
8c10: 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20  ->nSrc); j++){. 
8c20: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c         if( pTabL
8c30: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
8c40: 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62  r==p->iTable ) b
8c50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8c60: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
8c70: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
8c80: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
8c90: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
8ca0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
8cb0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
8cc0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
8cd0: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
8ce0: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
8cf0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
8d00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
8d10: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
8d20: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
8d30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8d40: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
8d50: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
8d60: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
8d70: 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73   if( !shortNames
8d80: 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29   && !fullNames )
8d90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8da0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8db0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8dc0: 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ME, .           
8dd0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
8de0: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 2d 3e  p(db, (char*)p->
8df0: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
8e00: 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d  n), SQLITE_DYNAM
8e10: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
8e20: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29   if( fullNames )
8e30: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
8e40: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
8e50: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
8e60: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
8e70: 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
8e80: 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  me, zCol);.     
8e90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8ea0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8eb0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
8ec0: 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d  me, SQLITE_DYNAM
8ed0: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
8ee0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8ef0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8f00: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8f10: 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45  ME, zCol, SQLITE
8f20: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
8f30: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
8f40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8f50: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8f60: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8f70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8f80: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
8f90: 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a  (char*)p->span.z
8fa0: 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 2c 20 53 51  , p->span.n), SQ
8fb0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
8fc0: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
8fd0: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
8fe0: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
8ff0: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69 66   pEList);.}..#if
9000: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9010: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
9020: 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74  ./*.** Name of t
9030: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
9040: 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72  erator, used for
9050: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e   error messages.
9060: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
9070: 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e   char *selectOpN
9080: 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63  ame(int id){.  c
9090: 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68  har *z;.  switch
90a0: 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65  ( id ){.    case
90b0: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a   TK_ALL:       z
90c0: 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20   = "UNION ALL"; 
90d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
90e0: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
90f0: 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b  z = "INTERSECT";
9100: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9110: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20  se TK_EXCEPT:   
9120: 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20   z = "EXCEPT";  
9130: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
9140: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
9150: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20    z = "UNION";  
9160: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
9170: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65    return z;.}.#e
9180: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
9190: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
91a0: 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  ECT */../*.** Gi
91b0: 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65 73 73  ven a an express
91c0: 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20  ion list (which 
91d0: 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69  is really the li
91e0: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
91f0: 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74  s.** that form t
9200: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
9210: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
9220: 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70  ent) compute app
9230: 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75  ropriate.** colu
9240: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74  mn names for a t
9250: 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20  able that would 
9260: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
9270: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
9280: 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  All column names
9290: 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e   will be unique.
92a0: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
92b0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65  column names are
92c0: 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75   computed.  Colu
92d0: 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e  mn.zType, Column
92e0: 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f  .zColl,.** and o
92f0: 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43  ther fields of C
9300: 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64  olumn are zeroed
9310: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
9320: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
9330: 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ess.  If a memor
9340: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
9350: 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74  or occurs,.** st
9360: 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43  ore NULL in *paC
9370: 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43  ol and 0 in *pnC
9380: 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ol and return SQ
9390: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73  LITE_NOMEM..*/.s
93a0: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
93b0: 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
93c0: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
93d0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
93e0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
93f0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
9400: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
9410: 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d  * Expr list from
9420: 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65   which to derive
9430: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
9440: 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20  .  int *pnCol,  
9450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
9460: 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
9470: 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a  f columns here *
9480: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43  /.  Column **paC
9490: 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ol          /* W
94a0: 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c  rite the new col
94b0: 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f  umn list here */
94c0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
94d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
94e0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
94f0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
9500: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
9510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
9520: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
9530: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
9540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
9550: 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61  ndex added to ma
9560: 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71  ke the name uniq
9570: 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a  ue */.  Column *
9580: 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20  aCol, *pCol;    
9590: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
95a0: 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63  ng over result c
95b0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
95c0: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
95d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
95e0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
95f0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
9600: 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20  /.  Expr *p;    
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f  /* Expression fo
9630: 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  r a single resul
9640: 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  t column */.  ch
9650: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
9660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
9670: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  umn name */.  in
9680: 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
9690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
96a0: 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61  e of name in zNa
96b0: 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 2a 70 6e 43 6f  me[] */..  *pnCo
96c0: 6c 20 3d 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73  l = nCol = pELis
96d0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 43 6f 6c  t->nExpr;.  aCol
96e0: 20 3d 20 2a 70 61 43 6f 6c 20 3d 20 73 71 6c 69   = *paCol = sqli
96f0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
9700: 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b  db, sizeof(aCol[
9710: 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 69 66 28  0])*nCol);.  if(
9720: 20 61 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72   aCol==0 ) retur
9730: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
9740: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
9750: 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  aCol; i<nCol; i+
9760: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
9770: 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70  /* Get an approp
9780: 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74  riate name for t
9790: 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f  he column.    */
97a0: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
97b0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
97c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
97d0: 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  ht==0 || p->pRig
97e0: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c  ht->token.z==0 |
97f0: 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b  | p->pRight->tok
9800: 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  en.z[0]!=0 );.  
9810: 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70    if( (zName = p
9820: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
9830: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  e)!=0 ){.      /
9840: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
9850: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20  contains an "AS 
9860: 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20  <name>" phrase, 
9870: 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68  use <name> as th
9880: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
9890: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
98a0: 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d  bStrDup(db, zNam
98b0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
98c0: 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45       Expr *pColE
98d0: 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65  xpr = p;  /* The
98e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
98f0: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 63   is the result c
9900: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
9910: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
9920: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
9930: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
9940: 68 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  h this expressio
9950: 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  n */.      while
9960: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
9970: 54 4b 5f 44 4f 54 20 29 20 70 43 6f 6c 45 78 70  TK_DOT ) pColExp
9980: 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
9990: 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
99a0: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
99b0: 5f 43 4f 4c 55 4d 4e 20 26 26 20 28 70 54 61 62  _COLUMN && (pTab
99c0: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
99d0: 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)!=0 ){.       
99e0: 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20   /* For columns 
99f0: 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  use the column n
9a00: 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ame name */.    
9a10: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
9a20: 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ColExpr->iColumn
9a30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
9a40: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
9a50: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
9a60: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
9a70: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
9a80: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
9a90: 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70       iCol>=0 ? p
9aa0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9ab0: 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 29  zName : "rowid")
9ac0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9ad0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
9ae0: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
9af0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
9b00: 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
9b10: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
9b20: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20  Token *pToken = 
9b30: 28 70 43 6f 6c 45 78 70 72 2d 3e 73 70 61 6e 2e  (pColExpr->span.
9b40: 7a 3f 26 70 43 6f 6c 45 78 70 72 2d 3e 73 70 61  z?&pColExpr->spa
9b50: 6e 3a 26 70 43 6f 6c 45 78 70 72 2d 3e 74 6f 6b  n:&pColExpr->tok
9b60: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  en);.        zNa
9b70: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
9b80: 6e 74 66 28 64 62 2c 20 22 25 54 22 2c 20 70 54  ntf(db, "%T", pT
9b90: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oken);.      }. 
9ba0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
9bb0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
9bc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
9bd0: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
9be0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9bf0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
9c00: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 0a  equote(zName);..
9c10: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
9c20: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
9c30: 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20   is unique.  If 
9c40: 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  the name is not 
9c50: 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61  unique,.    ** a
9c60: 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20  ppend a integer 
9c70: 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74  to the name so t
9c80: 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75  hat it becomes u
9c90: 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  nique..    */.  
9ca0: 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
9cb0: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
9cc0: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d  ;.    for(j=cnt=
9cd0: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
9ce0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
9cf0: 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a  trICmp(aCol[j].z
9d00: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
9d10: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
9d20: 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20  *zNewName;.     
9d30: 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20     zName[nName] 
9d40: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65  = 0;.        zNe
9d50: 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  wName = sqlite3M
9d60: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 3a 25  Printf(db, "%s:%
9d70: 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74  d", zName, ++cnt
9d80: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9d90: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
9da0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  me);.        zNa
9db0: 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20  me = zNewName;. 
9dc0: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
9dd0: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
9de0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
9df0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
9e00: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
9e10: 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  me;.  }.  if( db
9e20: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9e30: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
9e40: 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <i; j++){.      
9e50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9e60: 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  , aCol[j].zName)
9e70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
9e80: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
9e90: 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20  ol);.    *paCol 
9ea0: 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20  = 0;.    *pnCol 
9eb0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
9ec0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9ed0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
9ee0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
9ef0: 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  dd type and coll
9f00: 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
9f10: 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69  n to a column li
9f20: 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  st based on.** a
9f30: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
9f40: 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f  t..** .** The co
9f50: 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d  lumn list presum
9f60: 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73  ably came from s
9f70: 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  electColumnNames
9f80: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a  FromExprList()..
9f90: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
9fa0: 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65  st has only name
9fb0: 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20  s, not types or 
9fc0: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69  collations.  Thi
9fd0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65  s.** routine goe
9fe0: 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64  s through and ad
9ff0: 64 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64  ds the types and
a000: 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a   collations..**.
a010: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a020: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c  requires that al
a030: 6c 20 69 6e 64 65 6e 74 69 66 69 65 72 73 20 69  l indentifiers i
a040: 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20  n the SELECT.** 
a050: 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73  statement be res
a060: 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  olved..*/.static
a070: 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 43   void selectAddC
a080: 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
a090: 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a  ation(.  Parse *
a0a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
a0b0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
a0c0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ts */.  int nCol
a0d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
a0e0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
a0f0: 6e 73 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a  ns */.  Column *
a100: 61 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a  aCol,         /*
a110: 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   List of columns
a120: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
a130: 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53  elect       /* S
a140: 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65  ELECT used to de
a150: 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e  termine types an
a160: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a  d collations */.
a170: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
a180: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
a190: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
a1a0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
a1b0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
a1c0: 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  ll;.  int i;.  E
a1d0: 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74  xpr *p;.  struct
a1e0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
a1f0: 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  a;..  assert( pS
a200: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73  elect!=0 );.  as
a210: 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e  sert( (pSelect->
a220: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
a230: 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20  solved)!=0 );.  
a240: 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 70 53  assert( nCol==pS
a250: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
a260: 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  Expr || db->mall
a270: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
a280: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
a290: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  ed ) return;.  m
a2a0: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
a2b0: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73  izeof(sNC));.  s
a2c0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
a2d0: 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61  elect->pSrc;.  a
a2e0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
a2f0: 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30  st->a;.  for(i=0
a300: 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e  , pCol=aCol; i<n
a310: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
a320: 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e  ){.    p = a[i].
a330: 70 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d  pExpr;.    pCol-
a340: 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  >zType = sqlite3
a350: 44 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c  DbStrDup(db, col
a360: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
a370: 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20   0, 0, 0));.    
a380: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
a390: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
a3a0: 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 70 43 6f  nity(p);.    pCo
a3b0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
a3c0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
a3d0: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
a3e0: 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  l ){.      pCol-
a3f0: 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >zColl = sqlite3
a400: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f  DbStrDup(db, pCo
a410: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
a420: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
a430: 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74  iven a SELECT st
a440: 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74  atement, generat
a450: 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  e a Table struct
a460: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
a470: 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  es.** the result
a480: 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c   set of that SEL
a490: 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ECT..*/.Table *s
a4a0: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
a4b0: 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  fSelect(Parse *p
a4c0: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
a4d0: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
a4e0: 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65   *pTab;.  sqlite
a4f0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
a500: 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46  db;.  int savedF
a510: 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c  lags;..  savedFl
a520: 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
a530: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
a540: 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e  ~SQLITE_FullColN
a550: 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  ames;.  db->flag
a560: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
a570: 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c  tColNames;.  sql
a580: 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
a590: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
a5a0: 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  0);.  if( pParse
a5b0: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20  ->nErr ) return 
a5c0: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c  0;.  while( pSel
a5d0: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  ect->pPrior ) pS
a5e0: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
a5f0: 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66  >pPrior;.  db->f
a600: 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67  lags = savedFlag
a610: 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  s;.  pTab = sqli
a620: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
a630: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
a640: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ) );.  if( pTab=
a650: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
a660: 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e   0;.  }.  pTab->
a670: 64 62 4d 65 6d 20 3d 20 64 62 2d 3e 6c 6f 6f 6b  dbMem = db->look
a680: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3f  aside.bEnabled ?
a690: 20 64 62 20 3a 20 30 3b 0a 20 20 70 54 61 62 2d   db : 0;.  pTab-
a6a0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  >nRef = 1;.  pTa
a6b0: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
a6c0: 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
a6d0: 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
a6e0: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  , pSelect->pELis
a6f0: 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
a700: 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
a710: 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  selectAddColumnT
a720: 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
a730: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43  pParse, pTab->nC
a740: 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20  ol, pTab->aCol, 
a750: 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62  pSelect);.  pTab
a760: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
a770: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
a780: 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
a790: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
a7a0: 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Tab);.    return
a7b0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
a7c0: 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
a7d0: 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
a7e0: 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
a7f0: 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
a800: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
a810: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
a820: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
a830: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
a840: 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
a850: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64  in pParse..*/.Vd
a860: 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64  be *sqlite3GetVd
a870: 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  be(Parse *pParse
a880: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
a890: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
a8a0: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
a8b0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
a8c0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  e = sqlite3VdbeC
a8d0: 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62  reate(pParse->db
a8e0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
a8f0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
a900: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20   if( v ){.      
a910: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a920: 30 28 76 2c 20 4f 50 5f 54 72 61 63 65 29 3b 0a  0(v, OP_Trace);.
a930: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
a940: 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a  .  return v;.}..
a950: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
a960: 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  he iLimit and iO
a970: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20  ffset fields of 
a980: 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64  the SELECT based
a990: 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69   on the.** pLimi
a9a0: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78  t and pOffset ex
a9b0: 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d  pressions.  pLim
a9c0: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68  it and pOffset h
a9d0: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
a9e0: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65  ons.** that appe
a9f0: 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ar in the origin
aa00: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
aa10: 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54   after the LIMIT
aa20: 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b   and OFFSET.** k
aa30: 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c  eywords.  Or NUL
aa40: 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f  L if those keywo
aa50: 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e  rds are omitted.
aa60: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
aa70: 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20  set .** are the 
aa80: 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72  integer memory r
aa90: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
aaa0: 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65  for counters use
aab0: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a  d to compute .**
aac0: 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f   the limit and o
aad0: 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65  ffset.  If there
aae0: 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64   is no limit and
aaf0: 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e  /or offset, then
ab00: 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20   .** iLimit and 
ab10: 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61  iOffset are nega
ab20: 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tive..**.** This
ab30: 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73   routine changes
ab40: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69   the values of i
ab50: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
ab60: 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c  t only if.** a l
ab70: 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69  imit or offset i
ab80: 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69  s defined by pLi
ab90: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e  mit and pOffset.
aba0: 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20    iLimit and.** 
abb0: 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68  iOffset should h
abc0: 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20  ave been preset 
abd0: 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  to appropriate d
abe0: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a  efault values.**
abf0: 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f   (usually but no
ac00: 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69  t always -1) pri
ac10: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
ac20: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f  is routine..** O
ac30: 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30  nly if pLimit!=0
ac40: 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64   or pOffset!=0 d
ac50: 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  o the limit regi
ac60: 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64  sters get.** red
ac70: 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49  efined.  The UNI
ac80: 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
ac90: 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72  uses this proper
aca0: 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74  ty to force.** t
acb0: 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20  he reuse of the 
acc0: 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f  same limit and o
acd0: 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20  ffset registers 
ace0: 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a  across multiple.
acf0: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
ad00: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
ad10: 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69  void computeLimi
ad20: 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65  tRegisters(Parse
ad30: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
ad40: 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29   *p, int iBreak)
ad50: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b  {.  Vdbe *v = 0;
ad60: 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20  .  int iLimit = 
ad70: 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74  0;.  int iOffset
ad80: 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20  ;.  int addr1;. 
ad90: 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
ada0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a   return;..  /* .
adb0: 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
adc0: 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
add0: 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
ade0: 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
adf0: 61 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  aversy about wha
ae00: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
ae10: 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
ae20: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
ae30: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
ae40: 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
ae50: 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
ae60: 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
ae70: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  /.  if( p->pLimi
ae80: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  t ){.    p->iLim
ae90: 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b  it = iLimit = ++
aea0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
aeb0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
aec0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
aed0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
aee0: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
aef0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
af00: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d   p->pLimit, iLim
af10: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
af20: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
af30: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d  _MustBeInt, iLim
af40: 69 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  it);.    VdbeCom
af50: 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20  ment((v, "LIMIT 
af60: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
af70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
af80: 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  2(v, OP_IfZero, 
af90: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
afa0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
afb0: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e  ffset ){.    p->
afc0: 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
afd0: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
afe0: 65 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  em;.    if( p->p
aff0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70  Limit ){.      p
b000: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20  Parse->nMem++;  
b010: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20   /* Allocate an 
b020: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66  extra register f
b030: 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20  or limit+offset 
b040: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 76 20 3d  */.    }.    v =
b050: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
b060: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
b070: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
b080: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b090: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
b0a0: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29  Offset, iOffset)
b0b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b0c0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
b0d0: 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74  stBeInt, iOffset
b0e0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
b0f0: 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63  nt((v, "OFFSET c
b100: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 61  ounter"));.    a
b110: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
b120: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
b130: 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a  fPos, iOffset);.
b140: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b150: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
b160: 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29  ger, 0, iOffset)
b170: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b180: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
b190: 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r1);.    if( p->
b1a0: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
b1b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b1c0: 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69  3(v, OP_Add, iLi
b1d0: 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f  mit, iOffset, iO
b1e0: 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  ffset+1);.      
b1f0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
b200: 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29  "LIMIT+OFFSET"))
b210: 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  ;.      addr1 = 
b220: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b230: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  1(v, OP_IfPos, i
b240: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71  Limit);.      sq
b250: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b260: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d  v, OP_Integer, -
b270: 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20  1, iOffset+1);. 
b280: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b290: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
b2a0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
b2b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b2c0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
b2d0: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  LECT./*.** Retur
b2e0: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
b2f0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
b300: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f  ence for the iCo
b310: 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  l-th column of.*
b320: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
b330: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
b340: 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d-select stateme
b350: 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20  nt "p".  Return 
b360: 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63  NULL if.** the c
b370: 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66  olumn has no def
b380: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ault collating s
b390: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
b3a0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
b3b0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f  uence for the co
b3c0: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73  mpound select is
b3d0: 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a   taken from the.
b3e0: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  ** left-most ter
b3f0: 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  m of the select 
b400: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61  that has a colla
b410: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
b420: 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
b430: 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c   *multiSelectCol
b440: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
b450: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
b460: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c  nt iCol){.  Coll
b470: 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  Seq *pRet;.  if(
b480: 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
b490: 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65    pRet = multiSe
b4a0: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
b4b0: 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  se, p->pPrior, i
b4c0: 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col);.  }else{. 
b4d0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d     pRet = 0;.  }
b4e0: 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29  .  if( pRet==0 )
b4f0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
b500: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
b510: 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
b520: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
b530: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
b540: 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pRet;.}.#endif /
b550: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
b560: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
b570: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
b580: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
b590: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
b5a0: 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
b5b0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
b5c0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
b5d0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
b5e0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
b5f0: 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
b600: 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
b610: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
b620: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
b630: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
b640: 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
b650: 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e  lts */.);...#ifn
b660: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b670: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
b680: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
b690: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
b6a0: 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75  process a compou
b6b0: 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72  nd query form fr
b6c0: 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72  om.** two or mor
b6d0: 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
b6e0: 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20  es using UNION, 
b6f0: 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50  UNION ALL, EXCEP
b700: 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45  T, or.** INTERSE
b710: 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  CT.**.** "p" poi
b720: 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
b730: 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
b740: 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
b750: 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
b760: 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
b770: 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
b780: 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
b790: 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
b7a0: 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
b7b0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
b7c0: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
b7d0: 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
b7e0: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
b7f0: 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
b800: 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
b810: 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
b820: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
b830: 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
b840: 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
b850: 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
b860: 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
b870: 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
b880: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
b890: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
b8a0: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
b8b0: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
b8c0: 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
b8d0: 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
b8e0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
b8f0: 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
b900: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
b910: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
b920: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
b930: 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
b940: 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
b950: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
b980: 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
b990: 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
b9a0: 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
b9b0: 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
b9c0: 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
b9d0: 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
b9e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
b9f0: 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
ba00: 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
ba10: 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
ba20: 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
ba30: 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
ba40: 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
ba50: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
ba60: 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
ba70: 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
ba80: 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
ba90: 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
baa0: 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
bab0: 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
bac0: 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
bad0: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
bae0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
baf0: 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
bb00: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
bb10: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
bb20: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
bb30: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
bb40: 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
bb50: 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
bb60: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
bb70: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
bb80: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
bb90: 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
bba0: 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
bbb0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bbc0: 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
bbd0: 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
bbe0: 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
bbf0: 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
bc00: 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
bc10: 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
bc20: 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
bc30: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
bc40: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
bc50: 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
bc60: 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
bc70: 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a  st dest;      /*
bc80: 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74   Alternative dat
bc90: 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  a destination */
bca0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65  .  Select *pDele
bcb0: 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69  te = 0;  /* Chai
bcc0: 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65  n of simple sele
bcd0: 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  cts to delete */
bce0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
bcf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
bd00: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
bd10: 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  */..  /* Make su
bd20: 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  re there is no O
bd30: 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
bd40: 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72   clause on prior
bd50: 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a   SELECTs.  Only.
bd60: 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72    ** the last (r
bd70: 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43  ight-most) SELEC
bd80: 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
bd90: 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
bda0: 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20  R BY or LIMIT.. 
bdb0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20   */.  assert( p 
bdc0: 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20  && p->pPrior ); 
bdd0: 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63   /* Calling func
bde0: 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20  tion guarantees 
bdf0: 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64  this much */.  d
be00: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
be10: 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
be20: 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rior;.  assert( 
be30: 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f  pPrior->pRightmo
be40: 73 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20  st!=pPrior );.  
be50: 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
be60: 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70  pRightmost==p->p
be70: 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64  Rightmost );.  d
be80: 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20  est = *pDest;.  
be90: 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  if( pPrior->pOrd
bea0: 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
beb0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
bec0: 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61  se,"ORDER BY cla
bed0: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
bee0: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
bef0: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
bf00: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
bf10: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
bf20: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
bf30: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
bf40: 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
bf50: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
bf60: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
bf70: 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68  "LIMIT clause sh
bf80: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
bf90: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
bfa0: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
bfb0: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
bfc0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
bfd0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
bfe0: 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71  d;.  }..  v = sq
bff0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
c000: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
c010: 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20  v!=0 );  /* The 
c020: 56 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65  VDBE already cre
c030: 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ated by calling 
c040: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  function */..  /
c050: 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
c060: 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
c070: 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
c080: 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
c090: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
c0a0: 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
c0b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
c0c0: 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  st );.    sqlite
c0d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c0e0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
c0f0: 20 64 65 73 74 2e 69 50 61 72 6d 2c 20 70 2d 3e   dest.iParm, p->
c100: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
c110: 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
c120: 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a   SRT_Table;.  }.
c130: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
c140: 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74  all SELECTs in t
c150: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  he statement hav
c160: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
c170: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20  r of elements.  
c180: 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75  ** in their resu
c190: 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20  lt sets..  */.  
c1a0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
c1b0: 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
c1c0: 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ist );.  if( p->
c1d0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  pEList->nExpr!=p
c1e0: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Prior->pEList->n
c1f0: 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
c200: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
c210: 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20  se, "SELECTs to 
c220: 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
c230: 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20  ht of %s".      
c240: 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  " do not have th
c250: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
c260: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22   result columns"
c270: 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
c280: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
c290: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
c2a0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c2b0: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e   }..  /* Compoun
c2c0: 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68  d SELECTs that h
c2d0: 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
c2e0: 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c  clause are handl
c2f0: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20  ed separately.. 
c300: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72   */.  if( p->pOr
c310: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74  derBy ){.    ret
c320: 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  urn multiSelectO
c330: 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70  rderBy(pParse, p
c340: 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20  , pDest);.  }.. 
c350: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
c360: 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
c370: 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
c380: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
c390: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
c3a0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
c3b0: 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ALL: {.      int
c3c0: 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20   addr = 0;.     
c3d0: 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
c3e0: 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20  ->pLimit );.    
c3f0: 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74    pPrior->pLimit
c400: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
c410: 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66      pPrior->pOff
c420: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
c430: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
c440: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
c450: 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
c460: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
c470: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  it = 0;.      p-
c480: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
c490: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
c4a0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
c4b0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
c4c0: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
c4d0: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
c4e0: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
c4f0: 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
c500: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
c510: 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
c520: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69        if( p->iLi
c530: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  mit ){.        a
c540: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
c550: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
c560: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29  Zero, p->iLimit)
c570: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
c580: 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20  mment((v, "Jump 
c590: 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
c5a0: 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
c5b0: 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
c5c0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
c5d0: 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
c5e0: 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
c5f0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
c600: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
c610: 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  or;.      if( rc
c620: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
c630: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
c640: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
c650: 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20   if( addr ){.   
c660: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c670: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
c680: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c690: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c6a0: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
c6b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  :.    case TK_UN
c6c0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
c6d0: 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a   unionTab;    /*
c6e0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
c6f0: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
c700: 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
c710: 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38  sult */.      u8
c720: 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f   op = 0;       /
c730: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
c740: 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
c750: 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
c760: 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
c770: 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53  Op;     /* The S
c780: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  RT_ operation to
c790: 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20   apply to prior 
c7a0: 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  selects */.     
c7b0: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
c7c0: 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65  pOffset; /* Save
c7d0: 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e  d values of p->n
c7e0: 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66  Limit and p->nOf
c7f0: 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  fset */.      in
c800: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65  t addr;.      Se
c810: 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65  lectDest unionde
c820: 73 74 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f 72  st;..      prior
c830: 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  Op = SRT_Union;.
c840: 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
c850: 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26  Dest==priorOp &&
c860: 20 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c 69 6d   ALWAYS(!p->pLim
c870: 69 74 20 26 26 21 70 2d 3e 70 4f 66 66 73 65 74  it &&!p->pOffset
c880: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
c890: 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74  We can reuse a t
c8a0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67  emporary table g
c8b0: 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45  enerated by a SE
c8c0: 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20  LECT to our.    
c8d0: 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
c8e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
c8f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
c900: 68 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20 2f 2a  htmost!=p );  /*
c910: 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   Can only happen
c920: 20 66 6f 72 20 6c 65 66 74 77 61 72 64 20 65 6c   for leftward el
c930: 65 6d 65 6e 74 73 0a 20 20 20 20 20 20 20 20 20  ements.         
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c950: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
c960: 66 20 61 20 33 2d 77 61 79 20 6f 72 20 6d 6f 72  f a 3-way or mor
c970: 65 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20  e compound */.  
c980: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c990: 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20  >pLimit==0 );   
c9a0: 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65     /* Not allowe
c9b0: 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c  d on leftward el
c9c0: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ements */.      
c9d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
c9e0: 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f  fset==0 );     /
c9f0: 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
ca00: 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
ca10: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e  ts */.        un
ca20: 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 50  ionTab = dest.iP
ca30: 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  arm;.      }else
ca40: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
ca50: 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65  will need to cre
ca60: 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70  ate our own temp
ca70: 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68  orary table to h
ca80: 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  old the.        
ca90: 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
caa0: 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20  results..       
cab0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
cac0: 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
cad0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Tab++;.        a
cae0: 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
caf0: 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
cb00: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
cb10: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cb20: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
cb30: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
cb40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
cb50: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
cb60: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
cb70: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
cb80: 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
cb90: 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
cba0: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  t->selFlags |= S
cbb0: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
cbc0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
cbd0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
cbe0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
cbf0: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
cc00: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
cc10: 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
cc20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
cc30: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
cc40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
cc50: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
cc60: 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72  uniondest, prior
cc70: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20  Op, unionTab);. 
cc80: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cc90: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
cca0: 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65  pPrior, &unionde
ccb0: 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
ccc0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
ccd0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
cce0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
ccf0: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
cd00: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
cd10: 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f  atement.      */
cd20: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  .      if( p->op
cd30: 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20  ==TK_EXCEPT ){. 
cd40: 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f         op = SRT_
cd50: 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65  Except;.      }e
cd60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
cd70: 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ert( p->op==TK_U
cd80: 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  NION );.        
cd90: 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  op = SRT_Union;.
cda0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
cdb0: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
cdc0: 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
cdd0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
cde0: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
cdf0: 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
ce00: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
ce10: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
ce20: 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44      uniondest.eD
ce30: 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20  est = op;.      
ce40: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
ce50: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75  ct(pParse, p, &u
ce60: 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
ce70: 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65   /* Query flatte
ce80: 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53  ning in sqlite3S
ce90: 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65  elect() might re
cea0: 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79  fill p->pOrderBy
ceb0: 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75  ..      ** Be su
cec0: 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e  re to delete p->
ced0: 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66  pOrderBy, theref
cee0: 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  ore, to avoid a 
cef0: 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a  memory leak. */.
cf00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
cf10: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
cf20: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
cf30: 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
cf40: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
cf50: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
cf60: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  r;.      p->pOrd
cf70: 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
cf80: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
cf90: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
cfa0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
cfb0: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
cfc0: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
cfd0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
cfe0: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
cff0: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
d000: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  0;.      if( rc 
d010: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
d020: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
d030: 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ;.      }...    
d040: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
d050: 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d   data in the tem
d060: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74  porary table int
d070: 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a  o whatever form.
d080: 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74        ** it is t
d090: 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79  hat we currently
d0a0: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20   need..      */ 
d0b0: 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
d0c0: 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
d0d0: 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21  rOp || unionTab!
d0e0: 3d 64 65 73 74 2e 69 50 61 72 6d 20 29 7b 0a 20  =dest.iParm ){. 
d0f0: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
d100: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
d110: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d120: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
d130: 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e         if( dest.
d140: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
d150: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  t ){.          S
d160: 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
d170: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  p;.          whi
d180: 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
d190: 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
d1a0: 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
d1b0: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
d1c0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
d1d0: 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
d1e0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
d1f0: 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  }.        iBreak
d200: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
d210: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
d220: 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
d230: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
d240: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
d250: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
d260: 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
d270: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
d280: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d290: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75  (v, OP_Rewind, u
d2a0: 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29  nionTab, iBreak)
d2b0: 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
d2c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
d2d0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
d2e0: 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
d2f0: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
d300: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f   p->pEList, unio
d310: 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  nTab, p->pEList-
d320: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43  0, -1, &dest, iC
d350: 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
d360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d370: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
d380: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
d390: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d3a0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75  p2(v, OP_Next, u
d3b0: 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29  nionTab, iStart)
d3c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d3d0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
d3e0: 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
d3f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d400: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
d410: 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ose, unionTab, 0
d420: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d430: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d440: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
d450: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ECT: {.      int
d460: 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20   tab1, tab2;.   
d470: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
d480: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
d490: 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
d4a0: 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  , *pOffset;.    
d4b0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
d4c0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74    SelectDest int
d4d0: 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20  ersectdest;.    
d4e0: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20    int r1;..     
d4f0: 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73   /* INTERSECT is
d500: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
d510: 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65  the others since
d520: 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20   it requires.   
d530: 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72     ** two tempor
d540: 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e  ary tables.  Hen
d550: 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77  ce it has its ow
d560: 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20  n case.  Begin. 
d570: 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63       ** by alloc
d580: 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73  ating the tables
d590: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20   we will need.. 
d5a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61       */.      ta
d5b0: 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b1 = pParse->nTa
d5c0: 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20  b++;.      tab2 
d5d0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
d5e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d5f0: 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
d600: 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  ;..      addr = 
d610: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d620: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
d630: 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b  meral, tab1, 0);
d640: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d650: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
d660: 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
d670: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
d680: 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
d690: 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d    p->pRightmost-
d6a0: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
d6b0: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
d6c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
d6d0: 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20  pEList );..     
d6e0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
d6f0: 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
d700: 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
d710: 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
d720: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
d730: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
d740: 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73  it(&intersectdes
d750: 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  t, SRT_Union, ta
d760: 62 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  b1);.      rc = 
d770: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
d780: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69  arse, pPrior, &i
d790: 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20  ntersectdest);. 
d7a0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
d7b0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
d7c0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d7d0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
d7e0: 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
d7f0: 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d   SELECT into tem
d800: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
d810: 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  b2".      */.   
d820: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
d830: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d840: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
d850: 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
d860: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
d870: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d  OpenEphm[1] == -
d880: 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
d890: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
d8a0: 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  addr;.      p->p
d8b0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
d8c0: 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
d8d0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
d8e0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
d8f0: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
d900: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
d910: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
d920: 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e    intersectdest.
d930: 69 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  iParm = tab2;.  
d940: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d950: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
d960: 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
d970: 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
d980: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
d990: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
d9a0: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71  pPrior;.      sq
d9b0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
d9c0: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
d9d0: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
d9e0: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
d9f0: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
da00: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
da10: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
da20: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
da30: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
da40: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
da50: 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
da60: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
da70: 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
da80: 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  ry.      ** tabl
da90: 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
daa0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
dab0: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66  List );.      if
dac0: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
dad0: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
dae0: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
daf0: 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
db00: 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
db10: 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
db20: 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
db30: 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74  .        generat
db40: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
db50: 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
db60: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
db70: 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
db80: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
db90: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
dba0: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
dbb0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
dbc0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
dbd0: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
dbe0: 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
dbf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dc00: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
dc10: 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
dc20: 61 6b 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  ak);.      r1 = 
dc30: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
dc40: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
dc50: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
dc60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
dc70: 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20  P_RowKey, tab1, 
dc80: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
dc90: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
dca0: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
dcb0: 32 2c 20 69 43 6f 6e 74 2c 20 72 31 29 3b 0a 20  2, iCont, r1);. 
dcc0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
dcd0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
dce0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65  e, r1);.      se
dcf0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
dd00: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
dd10: 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c  st, tab1, p->pEL
dd20: 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20    0, -1, &dest, 
dd50: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
dd60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dd70: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
dd80: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
dd90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
dda0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
ddb0: 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  1, iStart);.    
ddc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
ddd0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
dde0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
ddf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
de00: 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
de10: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
de20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
de30: 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
de40: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
de50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
de60: 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69   Compute collati
de70: 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65  ng sequences use
de80: 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  d by .  ** tempo
de90: 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64  rary tables need
dea0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
deb0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
dec0: 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68  ect..  ** Attach
ded0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
dee0: 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65  ucture to all te
def0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a  mporary tables..
df00: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73    **.  ** This s
df10: 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79  ection is run by
df20: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
df30: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
df40: 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45   only..  ** SELE
df50: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
df60: 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73   the left always
df70: 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e   skip this part.
df80: 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    The right-most
df90: 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67  .  ** SELECT mig
dfa0: 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69  ht also skip thi
dfb0: 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73  s part if it has
dfc0: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
dfd0: 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20  use and.  ** no 
dfe0: 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20  temp tables are 
dff0: 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
e000: 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
e010: 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65   & SF_UsesEpheme
e020: 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ral ){.    int i
e030: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e040: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
e050: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
e060: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
e070: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
e080: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
e090: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75  nce for the resu
e0a0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65  lt set */.    Se
e0b0: 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  lect *pLoop;    
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
e0d0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
e0e0: 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  gh SELECT statem
e0f0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ents */.    Coll
e100: 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20  Seq **apColl;   
e110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
e120: 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
e130: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
e140: 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  [] */.    int nC
e150: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
e160: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
e170: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
e180: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
e190: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
e1a0: 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20  ightmost==p );. 
e1b0: 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c     nCol = p->pEL
e1c0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
e1d0: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
e1e0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
e1f0: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
e200: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
e210: 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c  (*pKeyInfo)+nCol
e220: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
e230: 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20 20 69 66  *) + 1));.    if
e240: 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
e250: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e260: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
e270: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
e280: 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  end;.    }..    
e290: 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20  pKeyInfo->enc = 
e2a0: 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 4b 65  ENC(db);.    pKe
e2b0: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20  yInfo->nField = 
e2c0: 28 75 31 36 29 6e 43 6f 6c 3b 0a 0a 20 20 20 20  (u16)nCol;..    
e2d0: 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d  for(i=0, apColl=
e2e0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b  pKeyInfo->aColl;
e2f0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70   i<nCol; i++, ap
e300: 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  Coll++){.      *
e310: 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65  apColl = multiSe
e320: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
e330: 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
e340: 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20   if( 0==*apColl 
e350: 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f  ){.        *apCo
e360: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
e370: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
e380: 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  }..    for(pLoop
e390: 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
e3a0: 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b  =pLoop->pPrior){
e3b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e3c0: 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
e3d0: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c     int addr = pL
e3e0: 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
e3f0: 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  m[i];.        if
e400: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
e410: 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20        /* If [0] 
e420: 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b  is unused then [
e430: 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65  1] is also unuse
e440: 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20  d.  So we can.  
e450: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
e460: 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61  s safely abort a
e470: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69  s soon as the fi
e480: 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20  rst unused slot 
e490: 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  is found */.    
e4a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
e4b0: 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
e4c0: 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20  m[1]<0 );.      
e4d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e4e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
e4f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
e500: 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b  (v, addr, nCol);
e510: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e520: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
e530: 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65  addr, (char*)pKe
e540: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
e550: 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  O);.        pLoo
e560: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
e570: 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  i] = -1;.      }
e580: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
e590: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b 65  e3DbFree(db, pKe
e5a0: 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c  yInfo);.  }..mul
e5b0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
e5c0: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 64   pDest->iMem = d
e5d0: 65 73 74 2e 69 4d 65 6d 3b 0a 20 20 70 44 65 73  est.iMem;.  pDes
e5e0: 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73 74 2e 6e  t->nMem = dest.n
e5f0: 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  Mem;.  sqlite3Se
e600: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
e610: 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72  Delete);.  retur
e620: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
e630: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
e640: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
e650: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
e660: 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
e670: 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e  e for a coroutin
e680: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
e690: 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   of a.** SELECT 
e6a0: 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  statment..**.** 
e6b0: 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f  The data to be o
e6c0: 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e  utput is contain
e6d0: 65 64 20 69 6e 20 70 49 6e 2d 3e 69 4d 65 6d 2e  ed in pIn->iMem.
e6e0: 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70    There are.** p
e6f0: 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75 6d 6e 73  In->nMem columns
e700: 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20   to be output.  
e710: 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74  pDest is where t
e720: 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64  he output should
e730: 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a  .** be sent..**.
e740: 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20  ** regReturn is 
e750: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
e760: 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
e770: 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ng the subroutin
e780: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72  e.** return addr
e790: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  ess..**.** If re
e7a0: 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20  gPrev>0 then it 
e7b0: 69 73 20 61 20 74 68 65 20 66 69 72 73 74 20 72  is a the first r
e7c0: 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63  egister in a vec
e7d0: 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f  tor that.** reco
e7e0: 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  rds the previous
e7f0: 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65   output.  mem[re
e800: 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67  gPrev] is a flag
e810: 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a   that is false.*
e820: 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62  * if there has b
e830: 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20  een no previous 
e840: 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50  output.  If regP
e850: 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20  rev>0 then code 
e860: 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  is.** generated 
e870: 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c  to suppress dupl
e880: 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66  icates.  pKeyInf
e890: 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f  o is used for co
e8a0: 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e  mparing.** keys.
e8b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49  .**.** If the LI
e8c0: 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e  MIT found in p->
e8d0: 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65  iLimit is reache
e8e0: 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  d, jump immediat
e8f0: 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b  ely to.** iBreak
e900: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e910: 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
e920: 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73  broutine(.  Pars
e930: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e940: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
e950: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
e960: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
e970: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
e980: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
e990: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e   SelectDest *pIn
e9a0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f  ,        /* Coro
e9b0: 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20  utine supplying 
e9c0: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
e9d0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
e9e0: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65    /* Where to se
e9f0: 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20  nd the data */. 
ea00: 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20   int regReturn, 
ea10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ea20: 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  return address r
ea30: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
ea40: 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20   regPrev,       
ea50: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
ea60: 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
ea70: 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73  .  No uniqueness
ea80: 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e   if 0 */.  KeyIn
ea90: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
eaa0: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72     /* For compar
eab0: 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75  ing with previou
eac0: 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  s entry */.  int
ead0: 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20   p4type,        
eae0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34 20 74       /* The p4 t
eaf0: 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e 66 6f  ype for pKeyInfo
eb00: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eb20: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65   Jump here if we
eb30: 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a   hit the LIMIT *
eb40: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
eb50: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
eb60: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b    int iContinue;
eb70: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20  .  int addr;..  
eb80: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
eb90: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
eba0: 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  ;.  iContinue = 
ebb0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
ebc0: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53  abel(v);..  /* S
ebd0: 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
ebe0: 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58  es for UNION, EX
ebf0: 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
ec00: 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ECT .  */.  if( 
ec10: 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69  regPrev ){.    i
ec20: 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a  nt j1, j2;.    j
ec30: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
ec40: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
ec50: 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  t, regPrev);.   
ec60: 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
ec70: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
ec80: 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  mpare, pIn->iMem
ec90: 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
eca0: 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->nMem,.        
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecc0: 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
ecd0: 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29 3b 0a  yInfo, p4type);.
ece0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ecf0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
ed00: 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75  , j2+2, iContinu
ed10: 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71  e, j2+2);.    sq
ed20: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
ed30: 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71  e(v, j1);.    sq
ed40: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
ed50: 79 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  y(pParse, pIn->i
ed60: 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  Mem, regPrev+1, 
ed70: 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  pIn->nMem);.    
ed80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ed90: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
eda0: 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
edb0: 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
edc0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
edd0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
ede0: 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
edf0: 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
ee00: 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72   entries if ther
ee10: 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63  e is an OFFSET c
ee20: 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64  lause.  */.  cod
ee30: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43  eOffset(v, p, iC
ee40: 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69  ontinue);..  swi
ee50: 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73  tch( pDest->eDes
ee60: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72  t ){.    /* Stor
ee70: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
ee80: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
ee90: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
eea0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
eeb0: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
eec0: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
eed0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
eee0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
eef0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
ef00: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
ef10: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
ef20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ef30: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
ef40: 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
ef50: 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c  iMem, pIn->nMem,
ef60: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
ef70: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ef80: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44   OP_NewRowid, pD
ef90: 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 32 29 3b  est->iParm, r2);
efa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
efb0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
efc0: 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50  nsert, pDest->iP
efd0: 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
efe0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
eff0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
f000: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
f010: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
f020: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
f030: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
f040: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
f050: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
f060: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f070: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f080: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
f090: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
f0a0: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
f0b0: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
f0c0: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
f0d0: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
f0e0: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
f0f0: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
f100: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
f110: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
f120: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
f130: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
f140: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
f150: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
f160: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
f170: 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r1;.      assert
f180: 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29  ( pIn->nMem==1 )
f190: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e  ;.      p->affin
f1a0: 69 74 79 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ity = .         
f1b0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
f1c0: 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74  finity(p->pEList
f1d0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
f1e0: 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a  est->affinity);.
f1f0: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
f200: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
f210: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
f220: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
f230: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
f240: 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72 31  pIn->iMem, 1, r1
f250: 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20  , &p->affinity, 
f260: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
f270: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
f280: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
f290: 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a   pIn->iMem, 1);.
f2a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f2b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
f2c0: 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  xInsert, pDest->
f2d0: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
f2e0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
f2f0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
f300: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
f310: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20  ;.    }..#if 0  
f320: 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20  /* Never occurs 
f330: 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71  on an ORDER BY q
f340: 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  uery */.    /* I
f350: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
f360: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
f370: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
f380: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
f390: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
f3a0: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
f3b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f3c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
f3d0: 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 50  er, 1, pDest->iP
f3e0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  arm);.      /* T
f3f0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
f400: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
f410: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
f420: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
f430: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
f440: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
f450: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
f460: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
f470: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
f480: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
f490: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
f4a0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
f4b0: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
f4c0: 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
f4d0: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
f4e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
f4f0: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
f500: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
f510: 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nMem==1 );.     
f520: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f530: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
f540: 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69  ->iMem, pDest->i
f550: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
f560: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
f570: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
f580: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
f590: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
f5a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
f5b0: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
f5c0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
f5d0: 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65  Y */..    /* The
f5e0: 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
f5f0: 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
f600: 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  e of registers. 
f610: 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
f620: 74 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2e 20 20  t pDest->iMem.  
f630: 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74  Then the co-rout
f640: 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20  ine yields..    
f650: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
f660: 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  Coroutine: {.   
f670: 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d     if( pDest->iM
f680: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  em==0 ){.       
f690: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73   pDest->iMem = s
f6a0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
f6b0: 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
f6c0: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70  nMem);.        p
f6d0: 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e  Dest->nMem = pIn
f6e0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->nMem;.      }.
f6f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f700: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
f710: 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65  , pIn->iMem, pDe
f720: 73 74 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d  st->iMem, pDest-
f730: 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71  >nMem);.      sq
f740: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
f750: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
f760: 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20  st->iParm);.    
f770: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
f780: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 61      /* Results a
f790: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
f7a0: 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
f7b0: 74 65 72 73 2e 20 20 54 68 65 6e 20 74 68 65 0a  ters.  Then the.
f7c0: 20 20 20 20 2a 2a 20 4f 50 5f 52 65 73 75 6c 74      ** OP_Result
f7d0: 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73  Row opcode is us
f7e0: 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69  ed to cause sqli
f7f0: 74 65 33 5f 73 74 65 70 28 29 20 74 6f 20 72 65  te3_step() to re
f800: 74 75 72 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  turn.    ** the 
f810: 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75  next row of resu
f820: 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  lt..    */.    c
f830: 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20  ase SRT_Output: 
f840: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
f850: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f860: 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e  ResultRow, pIn->
f870: 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29  iMem, pIn->nMem)
f880: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
f890: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
f8a0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
f8b0: 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e  In->iMem, pIn->n
f8c0: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Mem);.      brea
f8d0: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  k;.    }..#if !d
f8e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f8f0: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
f900: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
f910: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
f920: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
f930: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
f940: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
f950: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
f960: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
f970: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
f980: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
f990: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
f9a0: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
f9b0: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
f9c0: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
f9d0: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
f9e0: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
f9f0: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
fa00: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
fa10: 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  : {.      break;
fa20: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
fa30: 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
fa40: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
fa50: 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
fa60: 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
fa70: 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
fa80: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
fa90: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
faa0: 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d  _AddImm, p->iLim
fab0: 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c  it, -1);.    sql
fac0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fad0: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e  , OP_IfZero, p->
fae0: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
faf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
fb00: 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69  ate the subrouti
fb10: 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  ne return.  */. 
fb20: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
fb30: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
fb40: 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65  tinue);.  sqlite
fb50: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
fb60: 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74  P_Return, regRet
fb70: 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  urn);..  return 
fb80: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
fb90: 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f  lternative compo
fba0: 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20  und select code 
fbb0: 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61  generator for ca
fbc0: 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a  ses when there.*
fbd0: 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  * is an ORDER BY
fbe0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57   clause..**.** W
fbf0: 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79  e assume a query
fc00: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
fc10: 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  g form:.**.**   
fc20: 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f     <selectA>  <o
fc30: 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63  perator>  <selec
fc40: 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f  tB>  ORDER BY <o
fc50: 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a  rderbylist>.**.*
fc60: 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
fc70: 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c  one of UNION ALL
fc80: 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  , UNION, EXCEPT,
fc90: 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20   or INTERSECT.  
fca0: 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74  The idea.** is t
fcb0: 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c  o code both <sel
fcc0: 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63  ectA> and <selec
fcd0: 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44  tB> with the ORD
fce0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a  ER BY clause as.
fcf0: 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20  ** co-routines. 
fd00: 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f   Then run the co
fd10: 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72  -routines in par
fd20: 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20  allel and merge 
fd30: 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
fd40: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20  nto the output. 
fd50: 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
fd60: 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
fd70: 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63  es (called selec
fd80: 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74  tA and.** select
fd90: 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73  B) there are 7 s
fda0: 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a  ubroutines:.**.*
fdb0: 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f  *    outA:    Mo
fdc0: 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
fdd0: 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72   the selectA cor
fde0: 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
fdf0: 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
fe00: 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
fe10: 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a  pound query..**.
fe20: 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d  **    outB:    M
fe30: 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
fe40: 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f  f the selectB co
fe50: 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
fe60: 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
fe70: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
fe80: 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28  mpound query.  (
fe90: 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66  Only generated f
fea0: 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20  or UNION and.** 
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
fec0: 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61  N ALL.  EXCEPT a
fed0: 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65  nd INSERTSECT ne
fee0: 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77  ver output a row
fef0: 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
ff00: 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c       appears onl
ff10: 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20  y in B.).**.**  
ff20: 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65    AltB:    Calle
ff30: 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
ff40: 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
ff50: 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c  oroutines and A<
ff60: 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42  B..**.**    AeqB
ff70: 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
ff80: 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
ff90: 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
ffa0: 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a  nes and A==B..**
ffb0: 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20  .**    AgtB:    
ffc0: 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
ffd0: 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
ffe0: 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
fff0: 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A>B..**.**   
10000 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64   EofA:    Called
10010 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
10020 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
10030 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45  ectA..**.**    E
10040 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofB:    Called w
10050 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
10060 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
10070 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  tB..**.** The im
10080 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
10090 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20  the latter five 
100a0 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65  subroutines depe
100b0 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20  nd on which .** 
100c0 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73  <operator> is us
100d0 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed:.**.**.**    
100e0 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
100f0 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e  LL         UNION
10100 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45              EXCE
10110 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45  PT          INTE
10120 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  RSECT.**        
10130 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20    ------------- 
10140 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
10150 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
10160 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
10170 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a  -----.**   AltB:
10180 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
10190 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
101a0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
101b0 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a  A         nextA.
101c0 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20  **.**   AeqB:   
101d0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
101e0 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
101f0 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
10200 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a      outA, nextA.
10210 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20  **.**   AgtB:   
10220 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
10230 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
10240 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20        nextB     
10250 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a         nextB.**.
10260 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74  **   EofA:   out
10270 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
10280 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
10290 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20     halt         
102a0 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20      halt.**.**  
102b0 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e   EofB:   outA, n
102c0 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
102d0 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
102e0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
102f0 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  halt.**.** In th
10300 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e  e AltB, AeqB, an
10310 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e  d AgtB subroutin
10320 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20  es, an EOF on A 
10330 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a  following nextA.
10340 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d  ** causes an imm
10350 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
10360 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f  ofA and an EOF o
10370 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n B following ne
10380 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e  xtB causes.** an
10390 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
103a0 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e  to EofB.  Within
103b0 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20   EofA and EofB, 
103c0 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79  and EOF on entry
103d0 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   or.** following
103e0 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20   nextX causes a 
103f0 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  jump to the end 
10400 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72  of the select pr
10410 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
10420 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  Duplicate remova
10430 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20  l in the UNION, 
10440 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
10450 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68  RSECT cases is h
10460 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e  andled.** within
10470 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
10480 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67  outine.  The reg
10490 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65  Prev register se
104a0 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76  t holds the prev
104b0 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74  iously.** output
104c0 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61   value.  A compa
104d0 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67  rison is made ag
104e0 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65  ainst this value
104f0 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
10500 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ** is skipped if
10510 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74   the next result
10520 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73  s would be the s
10530 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69  ame as the previ
10540 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ous..**.** The i
10550 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c  mplementation pl
10560 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65  an is to impleme
10570 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  nt the two corou
10580 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a  tines and seven.
10590 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66  ** subroutines f
105a0 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74  irst, then put t
105b0 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63  he control logic
105c0 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20   at the bottom. 
105d0 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
105e0 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  *          goto 
105f0 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a  Init.**     coA:
10600 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
10610 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a  eft query (A).**
10620 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74       coB: corout
10630 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75  ine for right qu
10640 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75  ery (B).**    ou
10650 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tA: output one r
10660 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75  ow of A.**    ou
10670 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tB: output one r
10680 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61  ow of B (UNION a
10690 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c  nd UNION ALL onl
106a0 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e  y).**    EofA: .
106b0 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e  ...**    EofB: .
106c0 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e  ...**    AltB: .
106d0 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e  ...**    AeqB: .
106e0 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e  ...**    AgtB: .
106f0 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69  ...**    Init: i
10700 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74  nitialize corout
10710 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  ine registers.**
10720 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
10730 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coA.**          
10740 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45  if eof(A) goto E
10750 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ofA.**          
10760 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20  yield coB.**    
10770 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20        if eof(B) 
10780 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20  goto EofB.**    
10790 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c  Cmpr: Compare A,
107a0 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a   B.**          J
107b0 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  ump AltB, AeqB, 
107c0 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a  AgtB.**     End:
107d0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61   ....**.** We ca
107e0 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  ll AltB, AeqB, A
107f0 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45  gtB, EofA, and E
10800 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73  ofB "subroutines
10810 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e  " but they are n
10820 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63  ot.** actually c
10830 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75  alled using Gosu
10840 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f  b and they do no
10850 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20  t Return.  EofA 
10860 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a  and EofB loop.**
10870 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20   until all data 
10880 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65  is exhausted the
10890 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65  n jump to the "e
108a0 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c  nd" labe.  AltB,
108b0 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67   AeqB,.** and Ag
108c0 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65  tB jump to eithe
108d0 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f  r L2 or to one o
108e0 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a  f EofA or EofB..
108f0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
10900 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
10910 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e  SELECT.static in
10920 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
10930 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
10940 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
10950 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
10960 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
10970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10980 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
10990 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
109a0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
109b0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
109c0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
109d0 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
109e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
109f0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
10a00 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
10a10 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
10a20 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
10a30 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
10a40 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
10a50 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
10a60 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
10a70 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
10a80 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
10a90 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
10aa0 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stA;     /* Dest
10ab0 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
10ac0 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c  utine A */.  Sel
10ad0 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20  ectDest destB;  
10ae0 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
10af0 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
10b00 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  B */.  int regAd
10b10 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drA;         /* 
10b20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
10b30 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f   for select-A co
10b40 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10b50 20 72 65 67 45 6f 66 41 3b 20 20 20 20 20 20 20   regEofA;       
10b60 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e     /* Flag to in
10b70 64 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65  dicate when sele
10b80 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c 65 74 65  ct-A is complete
10b90 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
10ba0 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rB;         /* A
10bb0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
10bc0 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  for select-B cor
10bd0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10be0 72 65 67 45 6f 66 42 3b 20 20 20 20 20 20 20 20  regEofB;        
10bf0 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64    /* Flag to ind
10c00 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63  icate when selec
10c10 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65 74 65 20  t-B is complete 
10c20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
10c30 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectA;      /* Ad
10c40 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
10c50 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
10c60 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
10c70 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectB;      /* Ad
10c80 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
10c90 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
10ca0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41  */.  int regOutA
10cb0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
10cc0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
10cd0 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  or the output-A 
10ce0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
10cf0 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20  int regOutB;    
10d00 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10d10 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
10d20 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
10d30 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
10d40 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20  ddrOutA;        
10d50 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
10d60 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
10d70 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10d80 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20  addrOutB = 0;   
10d90 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10da0 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
10db0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10dc0 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20   addrEofA;      
10dd0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
10de0 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78   the select-A-ex
10df0 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
10e00 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
10e10 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofB;         /*
10e20 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
10e30 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74  select-B-exhaust
10e40 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
10e50 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b  .  int addrAltB;
10e60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
10e70 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73  ess of the A<B s
10e80 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
10e90 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20  nt addrAeqB;    
10ea0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
10eb0 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72  of the A==B subr
10ec0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10ed0 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20  addrAgtB;       
10ee0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10ef0 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69  the A>B subrouti
10f00 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  ne */.  int regL
10f10 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a  imitA;        /*
10f20 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
10f30 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
10f40 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b    int regLimitB;
10f50 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
10f60 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
10f70 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
10f80 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
10f90 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20    /* A range of 
10fa0 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
10fb0 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  d previous outpu
10fc0 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
10fd0 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
10fe0 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
10ff0 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e  ->iLimit */.  in
11000 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20  t savedOffset;  
11010 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
11020 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74  ue of p->iOffset
11030 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43   */.  int labelC
11040 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  mpr;        /* L
11050 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61  abel for the sta
11060 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20  rt of the merge 
11070 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69  algorithm */.  i
11080 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20  nt labelEnd;    
11090 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
110a0 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
110b0 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20   overall SELECT 
110c0 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31  stmt */.  int j1
110d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
110e0 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74  /* Jump instruct
110f0 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65  ions that get re
11100 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69  targetted */.  i
11110 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
11120 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
11130 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c  K_ALL, TK_UNION,
11140 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49   TK_EXCEPT, TK_I
11150 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65  NTERSECT */.  Ke
11160 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d  yInfo *pKeyDup =
11170 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f   0; /* Compariso
11180 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
11190 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  r duplicate remo
111a0 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  val */.  KeyInfo
111b0 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f   *pKeyMerge;   /
111c0 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
111d0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72  ormation for mer
111e0 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73  ging rows */.  s
111f0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
11200 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
11210 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
11220 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
11230 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
11240 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
11250 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
11260 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11270 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
11280 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11290 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  se */.  int *aPe
112a0 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  rmute;        /*
112b0 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52   Mapping from OR
112c0 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
112d0 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
112e0 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ns */..  assert(
112f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20   p->pOrderBy!=0 
11300 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
11310 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d  yDup==0 ); /* "M
11320 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65  anaged" code nee
11330 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74  ds this.  Ticket
11340 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20   #3382. */.  db 
11350 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11360 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
11370 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  e;.  if( v==0 ) 
11380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
11390 4d 45 4d 3b 0a 20 20 6c 61 62 65 6c 45 6e 64 20  MEM;.  labelEnd 
113a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
113b0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
113c0 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
113d0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
113e0 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
113f0 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
11400 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
11410 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
11420 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
11430 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
11440 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
11450 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
11460 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
11470 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
11480 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
11490 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
114a0 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
114b0 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
114c0 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
114d0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
114e0 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
114f0 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
11500 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
11510 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
11520 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
11530 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
11540 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
11550 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
11560 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
11570 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
11580 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
11590 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
115a0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
115b0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
115c0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
115d0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
115e0 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
115f0 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
11600 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
11610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
11620 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 29 3b 0a 20  tem->iCol>0 );. 
11630 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
11640 2d 3e 69 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61  ->iCol==i ) brea
11650 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
11660 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79   if( j==nOrderBy
11670 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
11680 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
11690 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
116a0 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20  _INTEGER, 0, 0, 
116b0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
116c0 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
116d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
116e0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61         pNew->fla
116f0 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75  gs |= EP_IntValu
11700 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e;.        pNew-
11710 3e 69 54 61 62 6c 65 20 3d 20 69 3b 0a 20 20 20  >iTable = i;.   
11720 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
11730 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
11740 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f  ppend(pParse, pO
11750 72 64 65 72 42 79 2c 20 70 4e 65 77 2c 20 30 29  rderBy, pNew, 0)
11760 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
11770 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b  By->a[nOrderBy++
11780 5d 2e 69 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b  ].iCol = (u16)i;
11790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
117a0 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
117b0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
117c0 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20  permutation and 
117d0 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20  keyinfo that is 
117e0 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74  used with.  ** t
117f0 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 69  he permutation i
11800 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 61  n order to compa
11810 72 69 73 6f 6e 73 20 74 6f 20 64 65 74 65 72 6d  risons to determ
11820 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a  ine if the next.
11830 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75    ** row of resu
11840 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73  lts comes from s
11850 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74  electA or select
11860 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70  B.  Also add exp
11870 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  licit.  ** colla
11880 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44  tions to the ORD
11890 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
118a0 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20  ms so that when 
118b0 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20  the subqueries. 
118c0 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74   ** to the right
118d0 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72   and the left ar
118e0 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65  e evaluated, the
118f0 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63  y use the correc
11900 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  t.  ** collation
11910 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74  ..  */.  aPermut
11920 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
11930 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
11940 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29  f(int)*nOrderBy)
11950 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65  ;.  if( aPermute
11960 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
11970 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
11980 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  tem;.    for(i=0
11990 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
119a0 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  ->a; i<nOrderBy;
119b0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
119c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
119d0 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 20 26 26 20  tem->iCol>0  && 
119e0 70 49 74 65 6d 2d 3e 69 43 6f 6c 3c 3d 70 2d 3e  pItem->iCol<=p->
119f0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
11a00 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b  .      aPermute[
11a10 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 69 43 6f 6c  i] = pItem->iCol
11a20 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
11a30 70 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20 20 20  pKeyMerge =.    
11a40 20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f    sqlite3DbMallo
11a50 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
11a60 2a 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f 72 64  *pKeyMerge)+nOrd
11a70 65 72 42 79 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  erBy*(sizeof(Col
11a80 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 20 20  lSeq*)+1));.    
11a90 69 66 28 20 70 4b 65 79 4d 65 72 67 65 20 29 7b  if( pKeyMerge ){
11aa0 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65  .      pKeyMerge
11ab0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
11ac0 75 38 2a 29 26 70 4b 65 79 4d 65 72 67 65 2d 3e  u8*)&pKeyMerge->
11ad0 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d 3b  aColl[nOrderBy];
11ae0 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65  .      pKeyMerge
11af0 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
11b00 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  nOrderBy;.      
11b10 70 4b 65 79 4d 65 72 67 65 2d 3e 65 6e 63 20 3d  pKeyMerge->enc =
11b20 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20   ENC(db);.      
11b30 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
11b40 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
11b50 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
11b60 6c 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  l;.        Expr 
11b70 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42  *pTerm = pOrderB
11b80 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
11b90 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
11ba0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
11bb0 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
11bc0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 54 65       pColl = pTe
11bd0 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  rm->pColl;.     
11be0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11bf0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74      pColl = mult
11c00 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
11c10 50 61 72 73 65 2c 20 70 2c 20 61 50 65 72 6d 75  Parse, p, aPermu
11c20 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  te[i]);.        
11c30 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
11c40 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  = EP_ExpCollate;
11c50 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d  .          pTerm
11c60 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ->pColl = pColl;
11c70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11c80 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43     pKeyMerge->aC
11c90 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[i] = pColl;.
11ca0 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67          pKeyMerg
11cb0 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  e->aSortOrder[i]
11cc0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
11cd0 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
11ce0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
11cf0 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67  se{.    pKeyMerg
11d00 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
11d10 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52   Reattach the OR
11d20 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f  DER BY clause to
11d30 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
11d40 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
11d50 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72   pOrderBy;.  pPr
11d60 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ior->pOrderBy = 
11d70 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11d80 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
11d90 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20  OrderBy, 0);..  
11da0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61  /* Allocate a ra
11db0 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  nge of temporary
11dc0 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
11dd0 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65  he KeyInfo neede
11de0 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c  d.  ** for the l
11df0 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65  ogic that remove
11e00 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75  s duplicate resu
11e10 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65  lt rows when the
11e20 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69  .  ** operator i
11e30 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  s UNION, EXCEPT,
11e40 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62   or INTERSECT (b
11e50 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c  ut not UNION ALL
11e60 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  )..  */.  if( op
11e70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
11e80 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d  regPrev = 0;.  }
11e90 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
11ea0 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
11eb0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >nExpr;.    asse
11ec0 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45  rt( nOrderBy>=nE
11ed0 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
11ee0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
11ef0 65 67 50 72 65 76 20 3d 20 73 71 6c 69 74 65 33  egPrev = sqlite3
11f00 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
11f10 72 73 65 2c 20 6e 45 78 70 72 2b 31 29 3b 0a 20  rse, nExpr+1);. 
11f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11f30 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
11f40 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b  er, 0, regPrev);
11f50 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73  .    pKeyDup = s
11f60 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
11f70 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20  ro(db,.         
11f80 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
11f90 2a 70 4b 65 79 44 75 70 29 20 2b 20 6e 45 78 70  *pKeyDup) + nExp
11fa0 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  r*(sizeof(CollSe
11fb0 71 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20 69 66  q*)+1) );.    if
11fc0 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20  ( pKeyDup ){.   
11fd0 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72     pKeyDup->aSor
11fe0 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
11ff0 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e 45  KeyDup->aColl[nE
12000 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79  xpr];.      pKey
12010 44 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75  Dup->nField = (u
12020 31 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  16)nExpr;.      
12030 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d 20 45  pKeyDup->enc = E
12040 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f  NC(db);.      fo
12050 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
12060 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  i++){.        pK
12070 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  eyDup->aColl[i] 
12080 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
12090 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
120a0 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  i);.        pKey
120b0 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Dup->aSortOrder[
120c0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
120d0 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a      }.  }. .  /*
120e0 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65   Separate the le
120f0 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74  ft and the right
12100 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20   query from one 
12110 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70  another.  */.  p
12120 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
12130 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f  pPrior->pRightmo
12140 73 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  st = 0;.  sqlite
12150 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
12160 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
12170 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  p->pOrderBy, "OR
12180 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72  DER");.  if( pPr
12190 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ior->pPrior==0 )
121a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
121b0 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
121c0 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
121d0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
121e0 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d  y, "ORDER");.  }
121f0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
12200 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
12210 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  rs */.  computeL
12220 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
12230 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e  arse, p, labelEn
12240 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
12250 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c  mit && op==TK_AL
12260 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  L ){.    regLimi
12270 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
12280 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69  Mem;.    regLimi
12290 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
122a0 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
122b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
122c0 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65  _Copy, p->iOffse
122d0 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31  t ? p->iOffset+1
122e0 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20   : p->iLimit,.  
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12310 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20  regLimitA);.    
12320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12330 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  2(v, OP_Copy, re
12340 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69  gLimitA, regLimi
12350 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tB);.  }else{.  
12360 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65    regLimitA = re
12370 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d  gLimitB = 0;.  }
12380 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
12390 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
123a0 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  it);.  p->pLimit
123b0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
123c0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
123d0 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e  >pOffset);.  p->
123e0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  pOffset = 0;..  
123f0 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61  regAddrA = ++pPa
12400 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
12410 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  EofA = ++pParse-
12420 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72  >nMem;.  regAddr
12430 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
12440 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d 20  em;.  regEofB = 
12450 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12460 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50    regOutA = ++pP
12470 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
12480 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  gOutB = ++pParse
12490 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
124a0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
124b0 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f  &destA, SRT_Coro
124c0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
124d0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
124e0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42  tDestInit(&destB
124f0 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
12500 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
12510 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65 20  * Jump past the 
12520 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74 69  various subrouti
12530 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69 6e  nes and coroutin
12540 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20  es to the main. 
12550 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20   ** merge loop. 
12560 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74   */.  j1 = sqlit
12570 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
12580 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64 72  OP_Goto);.  addr
12590 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65  SelectA = sqlite
125a0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
125b0 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e 65  (v);...  /* Gene
125c0 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
125d0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
125e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
125f0 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65  t to the.  ** le
12600 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ft of the compou
12610 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68  nd operator - th
12620 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20  e "A" select..  
12630 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
12640 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
12650 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
12660 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ft SELECT"));.  
12670 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
12680 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 73 71   regLimitA;.  sq
12690 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
126a0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
126b0 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
126c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
126d0 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f  nteger, 1, regEo
126e0 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
126f0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
12700 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b  ield, regAddrA);
12710 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
12720 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f  nt((v, "End coro
12730 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53  utine for left S
12740 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20  ELECT"));..  /* 
12750 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
12760 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
12770 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
12780 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74  ement on .  ** t
12790 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22  he right - the "
127a0 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20  B" select.  */. 
127b0 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73   addrSelectB = s
127c0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
127d0 74 41 64 64 72 28 76 29 3b 0a 20 20 56 64 62 65  tAddr(v);.  Vdbe
127e0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
127f0 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65  "Begin coroutine
12800 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43   for right SELEC
12810 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d  T"));.  savedLim
12820 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
12830 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20    savedOffset = 
12840 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
12850 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
12860 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  itB;.  p->iOffse
12870 74 20 3d 20 30 3b 20 20 0a 20 20 73 71 6c 69 74  t = 0;  .  sqlit
12880 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
12890 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
128a0 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
128b0 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
128c0 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
128d0 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
128e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
128f0 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42  eger, 1, regEofB
12900 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12910 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
12920 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20  ld, regAddrB);. 
12930 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
12940 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74  ((v, "End corout
12950 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53 45  ine for right SE
12960 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47  LECT"));..  /* G
12970 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
12980 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
12990 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
129a0 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20  w of the A.  ** 
129b0 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
129c0 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
129d0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
129e0 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
129f0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
12a00 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
12a10 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64   for A"));.  add
12a20 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65  rOutA = generate
12a30 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
12a40 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
12a50 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
12a60 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stA, pDest, regO
12a70 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utA,.           
12a80 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
12a90 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e  KeyDup, P4_KEYIN
12aa0 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62 65  FO_HANDOFF, labe
12ab0 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47  lEnd);.  .  /* G
12ac0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
12ad0 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
12ae0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
12af0 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20  w of the B.  ** 
12b00 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
12b10 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
12b20 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
12b30 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lect..  */.  if(
12b40 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
12b50 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
12b60 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
12b70 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
12b80 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b  outine for B"));
12b90 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20  .    addrOutB = 
12ba0 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
12bb0 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
12bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12bd0 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65    p, &destB, pDe
12be0 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20  st, regOutB,.   
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
12c00 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
12c10 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49  P4_KEYINFO_STATI
12c20 43 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  C, labelEnd);.  
12c30 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
12c40 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
12c50 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
12c60 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
12c70 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t A.  ** are exh
12c80 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
12c90 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42  data in select B
12ca0 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
12cb0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
12cc0 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72  ((v, "eof-A subr
12cd0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 69 66 28  outine"));.  if(
12ce0 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
12cf0 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
12d00 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
12d10 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
12d20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
12d30 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  o, 0, labelEnd);
12d40 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
12d50 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
12d60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12d70 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20  OP_If, regEofB, 
12d80 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73  labelEnd);.    s
12d90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12da0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
12db0 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
12dc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12dd0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
12de0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  eld, regAddrB);.
12df0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12e00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
12e10 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  , 0, addrEofA);.
12e20 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
12e30 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
12e40 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
12e50 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
12e60 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65  ect B.  ** are e
12e70 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
12e80 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
12e90 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   A remains..  */
12ea0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
12eb0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
12ec0 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f  ddrEofB = addrEo
12ed0 66 41 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  fA;.  }else{  . 
12ee0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
12ef0 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75  nt((v, "eof-B su
12f00 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
12f10 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69   addrEofB = sqli
12f20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12f30 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c   OP_If, regEofA,
12f40 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
12f50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12f60 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
12f70 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
12f80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12f90 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
12fa0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b  ield, regAddrA);
12fb0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12fc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
12fd0 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b  o, 0, addrEofB);
12fe0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
12ff0 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
13000 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
13010 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  <B.  */.  VdbeNo
13020 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
13030 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -lt-B subroutine
13040 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20  "));.  addrAltB 
13050 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13060 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
13070 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
13080 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
13090 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
130a0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b  ield, regAddrA);
130b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
130c0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
130d0 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41  egEofA, addrEofA
130e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
130f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
13100 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29  o, 0, labelCmpr)
13110 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
13120 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
13130 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42  the case of A==B
13140 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
13150 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64  TK_ALL ){.    ad
13160 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
13170 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  B;.  }else if( o
13180 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
13190 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
131a0 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20  = addrAltB;.    
131b0 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65  addrAltB++;.  }e
131c0 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  lse{.    VdbeNoo
131d0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
131e0 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  eq-B subroutine"
131f0 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42  ));.    addrAeqB
13200 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   =.    sqlite3Vd
13210 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
13220 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b  ield, regAddrA);
13230 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13240 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
13250 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f   regEofA, addrEo
13260 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fA);.    sqlite3
13270 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13280 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
13290 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  mpr);.  }..  /* 
132a0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
132b0 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
132c0 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56   of A>B.  */.  V
132d0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
132e0 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f  v, "A-gt-B subro
132f0 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
13300 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AgtB = sqlite3Vd
13310 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
13320 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
13330 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
13340 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ON ){.    sqlite
13350 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13360 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
13370 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d  , addrOutB);.  }
13380 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13390 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
133a0 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 73  , regAddrB);.  s
133b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
133c0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
133d0 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20  fB, addrEofB);. 
133e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
133f0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
13400 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
13410 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75   /* This code ru
13420 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ns once to initi
13430 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alize everything
13440 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
13450 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
13460 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  j1);.  sqlite3Vd
13470 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
13480 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f  nteger, 0, regEo
13490 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
134a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
134b0 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f  nteger, 0, regEo
134c0 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fB);.  sqlite3Vd
134d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
134e0 6f 73 75 62 2c 20 72 65 67 41 64 64 72 41 2c 20  osub, regAddrA, 
134f0 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20  addrSelectA);.  
13500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13510 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
13520 65 67 41 64 64 72 42 2c 20 61 64 64 72 53 65 6c  egAddrB, addrSel
13530 65 63 74 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  ectB);.  sqlite3
13540 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13550 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64  _If, regEofA, ad
13560 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74  drEofA);.  sqlit
13570 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13580 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20  OP_If, regEofB, 
13590 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f 2a  addrEofB);..  /*
135a0 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d   Implement the m
135b0 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20  ain merge loop. 
135c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
135d0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
135e0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73   labelCmpr);.  s
135f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13600 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69  (v, OP_Permutati
13610 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  on, 0, 0, 0, (ch
13620 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34  ar*)aPermute, P4
13630 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71  _INTARRAY);.  sq
13640 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13650 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64  v, OP_Compare, d
13660 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65 73 74 42  estA.iMem, destB
13670 2e 69 4d 65 6d 2c 20 6e 4f 72 64 65 72 42 79 2c  .iMem, nOrderBy,
13680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13690 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
136a0 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b  )pKeyMerge, P4_K
136b0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
136c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
136d0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
136e0 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41   addrAltB, addrA
136f0 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 0a  eqB, addrAgtB);.
13700 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 65  .  /* Release te
13710 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
13720 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67  s.  */.  if( reg
13730 50 72 65 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  Prev ){.    sqli
13740 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
13750 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 50  nge(pParse, regP
13760 72 65 76 2c 20 6e 4f 72 64 65 72 42 79 2b 31 29  rev, nOrderBy+1)
13770 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  ;.  }..  /* Jump
13780 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69   to the this poi
13790 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74  nt in order to t
137a0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65  erminate the que
137b0 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ry..  */.  sqlit
137c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
137d0 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  el(v, labelEnd);
137e0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e  ..  /* Set the n
137f0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
13800 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
13810 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
13820 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
13830 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
13840 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  t = pPrior;.    
13850 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
13860 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
13870 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
13880 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
13890 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
138a0 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
138b0 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  st);.  }..  /* R
138c0 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f  eassembly the co
138d0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20  mpound query so 
138e0 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
138f0 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  freed correctly.
13900 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c    ** by the call
13910 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
13920 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
13930 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
13940 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
13950 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20  ->pPrior);.  }. 
13960 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
13970 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44  ior;..  /*** TBD
13980 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75  :  Insert subrou
13990 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c  tine calls to cl
139a0 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69  ose cursors on i
139b0 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a  ncomplete.  ****
139c0 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a   subqueries ****
139d0 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  /.  return SQLIT
139e0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
139f0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
13a00 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
13a10 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
13a20 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
13a30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c  ./* Forward Decl
13a40 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  arations */.stat
13a50 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
13a60 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20  rList(sqlite3*, 
13a70 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20  ExprList*, int, 
13a80 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
13a90 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
13aa0 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65  ect(sqlite3*, Se
13ab0 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70  lect *, int, Exp
13ac0 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  rList *);../*.**
13ad0 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   Scan through th
13ae0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
13af0 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65  pr.  Replace eve
13b00 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  ry reference to.
13b10 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
13b20 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62  able number iTab
13b30 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  le with a copy o
13b40 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  f the iColumn-th
13b50 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c  .** entry in pEL
13b60 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65  ist.  (But leave
13b70 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
13b80 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
13b90 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a  .** unchanged.).
13ba0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13bb0 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ne is part of th
13bc0 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f  e flattening pro
13bd0 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75  cedure.  A subqu
13be0 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73  ery.** whose res
13bf0 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e  ult set is defin
13c00 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70  ed by pEList app
13c10 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e  ears as entry in
13c20 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
13c30 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
13c40 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44  such that the VD
13c50 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e  BE cursor assign
13c60 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f  ed to that.** FO
13c70 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  RM clause entry 
13c80 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73  is iTable.  This
13c90 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68   routine make th
13ca0 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
13cb0 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
13cc0 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
13cd0 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
13ce0 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
13cf0 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
13d00 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
13d10 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
13d20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
13d30 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
13d40 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
13d50 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  b,        /* Rep
13d60 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
13d70 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63  s to this connec
13d80 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
13d90 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
13da0 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
13db0 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
13dc0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  rs */.  int iTab
13dd0 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
13de0 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
13df0 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
13e00 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
13e10 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78  /* Substitute ex
13e20 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  pressions */.){.
13e30 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
13e40 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
13e50 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
13e60 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
13e70 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
13e80 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
13e90 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
13ea0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
13eb0 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
13ec0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
13ed0 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ew;.      assert
13ee0 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
13ef0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
13f00 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
13f10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
13f20 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
13f30 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
13f40 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   );.      pNew =
13f50 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
13f60 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
13f70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13f80 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20  pNew!=0 );.     
13f90 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65   pExpr->op = pNe
13fa0 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73  w->op;.      ass
13fb0 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
13fc0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  t==0 );.      pE
13fd0 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  xpr->pLeft = sql
13fe0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
13ff0 70 4e 65 77 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  pNew->pLeft, 0);
14000 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14010 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
14020 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
14030 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
14040 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65 77  ExprDup(db, pNew
14050 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
14060 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
14070 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65  e = pNew->iTable
14080 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
14090 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61 62  Tab = pNew->pTab
140a0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
140b0 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69  Column = pNew->i
140c0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45  Column;.      pE
140d0 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77  xpr->iAgg = pNew
140e0 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71  ->iAgg;.      sq
140f0 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64  lite3TokenCopy(d
14100 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  b, &pExpr->token
14110 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b  , &pNew->token);
14120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
14130 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45 78  kenCopy(db, &pEx
14140 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d  pr->span, &pNew-
14150 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 61 73  >span);.      as
14160 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70  sert( pExpr->x.p
14170 4c 69 73 74 3d 3d 30 20 26 26 20 70 45 78 70 72  List==0 && pExpr
14180 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ->x.pSelect==0 )
14190 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
141a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
141b0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
141c0 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
141d0 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
141e0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
141f0 62 2c 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65  b, pNew->x.pSele
14200 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  ct, 0);.      }e
14210 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 45 78  lse{.        pEx
14220 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  pr->x.pList = sq
14230 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
14240 28 64 62 2c 20 70 4e 65 77 2d 3e 78 2e 70 4c 69  (db, pNew->x.pLi
14250 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  st, 0);.      }.
14260 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61        pExpr->fla
14270 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73  gs = pNew->flags
14280 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
14290 41 67 67 49 6e 66 6f 20 3d 20 70 4e 65 77 2d 3e  AggInfo = pNew->
142a0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
142b0 70 4e 65 77 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  pNew->pAggInfo =
142c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
142d0 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e{.    substExpr
142e0 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
142f0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
14300 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
14310 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69  r(db, pExpr->pRi
14320 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ght, iTable, pEL
14330 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ist);.    if( Ex
14340 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
14350 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
14360 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  t) ){.      subs
14370 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70  tSelect(db, pExp
14380 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54  r->x.pSelect, iT
14390 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
143a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
143b0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
143c0 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
143d0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
143e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  );.    }.  }.}.s
143f0 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
14400 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69  ExprList(.  sqli
14410 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
14420 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
14430 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
14440 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
14450 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st,     /* List 
14460 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77  to scan and in w
14470 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
14480 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e  stitutes */.  in
14490 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
144a0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
144b0 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f  e substituted */
144c0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
144d0 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
144e0 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
144f0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
14500 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
14510 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
14520 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
14530 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45  i++){.    substE
14540 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  xpr(db, pList->a
14550 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
14560 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
14570 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
14580 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c  bstSelect(.  sql
14590 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
145a0 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
145b0 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
145c0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
145d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
145e0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
145f0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
14600 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
14610 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
14620 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
14630 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f  o be replaced */
14640 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
14650 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
14660 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
14670 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
14680 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
14690 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
146a0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
146b0 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
146c0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
146d0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  , p->pEList, iTa
146e0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
146f0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
14700 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  , p->pGroupBy, i
14710 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
14720 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
14730 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
14740 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
14750 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 64 62  ;.  substExpr(db
14760 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54  , p->pHaving, iT
14770 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
14780 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
14790 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65  ->pWhere, iTable
147a0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
147b0 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e  stSelect(db, p->
147c0 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20  pPrior, iTable, 
147d0 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20  pEList);.  pSrc 
147e0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
147f0 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a  ert( pSrc );  /*
14800 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43   Even for (SELEC
14810 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70 53  T 1) we have: pS
14820 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e  rc!=0 but pSrc->
14830 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28  nSrc==0 */.  if(
14840 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b   ALWAYS(pSrc) ){
14850 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  .    for(i=pSrc-
14860 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72  >nSrc, pItem=pSr
14870 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  c->a; i>0; i--, 
14880 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
14890 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
148a0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
148b0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
148c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
148d0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
148e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
148f0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
14900 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
14910 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
14920 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14930 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
14940 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14950 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
14960 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
14970 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
14980 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72  subqueries in or
14990 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20  der to speed.** 
149a0 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72  execution.  It r
149b0 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
149c0 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
149d0 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
149e0 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  ing.** occurs..*
149f0 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
14a00 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
14a10 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
14a20 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
14a30 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
14a40 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
14a50 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
14a60 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
14a70 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
14a80 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
14a90 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
14aa0 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
14ab0 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
14ac0 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
14ad0 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
14ae0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
14af0 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
14b00 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
14b10 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
14b20 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
14b30 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
14b40 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
14b50 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
14b60 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
14b70 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
14b80 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
14b90 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
14ba0 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
14bb0 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
14bc0 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
14bd0 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
14be0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
14bf0 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
14c00 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
14c10 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
14c20 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
14c30 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
14c40 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
14c50 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
14c60 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
14c70 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
14c80 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
14c90 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
14ca0 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f  his simpificatio
14cb0 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
14cc0 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
14cd0 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
14ce0 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
14cf0 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
14d00 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
14d10 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
14d20 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
14d30 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
14d40 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
14d50 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
14d60 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
14d70 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
14d80 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14d90 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
14da0 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
14db0 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
14dc0 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
14dd0 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
14de0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
14df0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
14e00 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
14e10 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
14e20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
14e30 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
14e40 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
14e50 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
14e60 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
14e70 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20  t outer join.** 
14e80 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c         (Original
14e90 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20  ly ticket #306. 
14ea0 20 53 74 72 65 6e 67 68 74 65 6e 65 64 20 62 79   Strenghtened by
14eb0 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a   ticket #3300).*
14ec0 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
14ed0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
14ee0 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
14ef0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
14f00 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
14f10 20 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71     (5)  The subq
14f20 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
14f30 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
14f40 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
14f50 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
14f60 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
14f70 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
14f80 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
14f90 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
14fa0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
14fb0 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
14fc0 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
14fd0 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
14fe0 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
14ff0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
15000 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (8)  The subquer
15010 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
15020 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
15030 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
15040 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
15050 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
15060 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
15070 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
15080 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
15090 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
150a0 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
150b0 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75   (10)  The subqu
150c0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
150d0 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
150e0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
150f0 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
15100 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a    use LIMIT..**.
15110 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
15120 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
15130 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
15140 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45  t both have ORDE
15150 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  R BY clauses..**
15160 0a 2a 2a 20 20 28 31 32 29 20 20 4e 6f 74 20 69  .**  (12)  Not i
15170 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62  mplemented.  Sub
15180 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72  sumed into restr
15190 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73  iction (3).  Was
151a0 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20   previously.**  
151b0 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65        a separate
151c0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72   restriction der
151d0 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65  iving from ticke
151e0 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28  t #350..**.**  (
151f0 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  13)  The subquer
15200 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72  y and outer quer
15210 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
15220 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28  e LIMIT.**.**  (
15230 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
15240 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f  y does not use O
15250 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31 35  FFSET.**.**  (15
15260 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  )  The outer que
15270 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ry is not part o
15280 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
15290 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20  ect or the.**   
152a0 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f       subquery do
152b0 65 73 20 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  es not have both
152c0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 61 6e 64   an ORDER BY and
152d0 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e   a LIMIT clause.
152e0 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
152f0 74 69 63 6b 65 74 20 23 32 33 33 39 29 0a 2a 2a  ticket #2339).**
15300 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f  .**  (16)  The o
15310 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
15320 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
15330 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 64  r the subquery d
15340 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f  oes.**        no
15350 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  t contain ORDER 
15360 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
15370 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
15380 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
15390 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
153a0 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
153b0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
153c0 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
153d0 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d 71   (17)  The sub-q
153e0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f  uery is not a co
153f0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f  mpound select, o
15400 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20  r it is a UNION 
15410 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63  ALL .**        c
15420 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d  ompound clause m
15430 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20  ade up entirely 
15440 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  of non-aggregate
15450 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a   queries, and .*
15460 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61 72  *        the par
15470 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  ent query:.**.**
15480 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
15490 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f  ot itself part o
154a0 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
154b0 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ect,.**         
154c0 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67   * is not an agg
154d0 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e  regate or DISTIN
154e0 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a  CT query, and.**
154f0 20 20 20 20 20 20 20 20 20 20 2a 20 68 61 73 20            * has 
15500 6e 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  no other tables 
15510 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69  or sub-selects i
15520 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
15530 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e..**.**        
15540 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73  The parent and s
15550 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e  ub-query may con
15560 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73  tain WHERE claus
15570 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a  es. Subject to.*
15580 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28  *        rules (
15590 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31  11), (13) and (1
155a0 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73  4), they may als
155b0 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  o contain ORDER 
155c0 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49  BY,.**        LI
155d0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
155e0 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
155f0 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  18)  If the sub-
15600 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
15610 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
15620 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
15630 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45  e.**        ORDE
15640 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74  R by clause of t
15650 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  he parent must b
15660 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e  e simple referen
15670 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  ces to .**      
15680 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65    columns of the
15690 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a   sub-query..**.*
156a0 2a 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62  *  (19)  The sub
156b0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
156c0 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
156d0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
156e0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68   not.**        h
156f0 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ave a WHERE clau
15700 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  se..**.** In thi
15710 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
15720 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
15730 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
15740 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
15750 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
15760 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
15770 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
15780 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
15790 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
157a0 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
157b0 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
157c0 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
157d0 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
157e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
157f0 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
15800 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
15810 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
15820 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
15830 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
15840 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
15850 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
15860 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
15870 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
15880 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
15890 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
158a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
158b0 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
158c0 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
158d0 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
158e0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
158f0 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
15900 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15910 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
15920 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
15930 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
15940 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
15950 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
15960 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
15970 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
15980 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
15990 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
159a0 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
159b0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c   */.  int isAgg,
159c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
159d0 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
159e0 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
159f0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
15a00 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41   int subqueryIsA
15a10 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  gg    /* True if
15a20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
15a30 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
15a40 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63  ctions */.){.  c
15a50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
15a60 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
15a70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
15a80 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ext;.  Select *p
15a90 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74  Parent;.  Select
15aa0 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
15ab0 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
15ac0 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
15ad0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
15ae0 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  1;      /* Point
15af0 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d  er to the rightm
15b00 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75  ost select in su
15b10 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  b-query */.  Src
15b20 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
15b30 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
15b40 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
15b50 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
15b60 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
15b70 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
15b80 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
15b90 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ry */.  ExprList
15ba0 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54   *pList;    /* T
15bb0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
15bc0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
15bd0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
15be0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
15bf0 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
15c00 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
15c10 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
15c20 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
15c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
15c40 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
15c50 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c70 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
15c80 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
15c90 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
15ca0 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
15cb0 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
15cc0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
15cd0 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
15ce0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
15cf0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
15d00 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
15d10 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
15d20 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
15d30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
15d40 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20  Prior==0 );  /* 
15d50 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65  Unable to flatte
15d60 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69  n compound queri
15d70 65 73 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70  es */.  pSrc = p
15d80 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
15d90 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
15da0 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
15db0 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
15dc0 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  item = &pSrc->a[
15dd0 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e  iFrom];.  iParen
15de0 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43  t = pSubitem->iC
15df0 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20  ursor;.  pSub = 
15e00 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
15e10 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
15e20 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  b!=0 );.  if( is
15e30 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49  Agg && subqueryI
15e40 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e60 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
15e70 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75  (1)  */.  if( su
15e80 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70  bqueryIsAgg && p
15e90 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
15ea0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
15eb0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
15ec0 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72  (2)  */.  pSubSr
15ed0 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
15ee0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
15ef0 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20  c );.  /* Prior 
15f00 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32  to version 3.1.2
15f10 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  , when LIMIT and
15f20 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62   OFFSET had to b
15f30 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e  e simple constan
15f40 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62  ts,.  ** not arb
15f50 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73 69  itrary expresssi
15f60 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20  ons, we allowed 
15f70 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f  some combining o
15f80 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  f LIMIT and OFFS
15f90 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  ET.  ** because 
15fa0 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f  they could be co
15fb0 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c  mputed at compil
15fc0 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65  e-time.  But whe
15fd0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
15fe0 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61  ET.  ** became a
15ff0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
16000 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f  ions, we were fo
16010 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74  rced to add rest
16020 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20  rictions (13).  
16030 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a  ** and (14). */.
16040 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
16050 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20  it && p->pLimit 
16060 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
16070 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
16080 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a  riction (13) */.
16090 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66    if( pSub->pOff
160a0 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  set ) return 0; 
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
160d0 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a  riction (14) */.
160e0 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d    if( p->pRightm
160f0 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  ost && pSub->pLi
16100 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  mit && pSub->pOr
16110 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74  derBy ){.    ret
16120 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 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 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
16160 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
16170 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
16180 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
161b0 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
161c0 66 28 20 28 28 70 53 75 62 2d 3e 73 65 6c 46 6c  f( ((pSub->selFl
161d0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
161e0 74 29 21 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70  t)!=0 || pSub->p
161f0 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20  Limit) .        
16200 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e   && (pSrc->nSrc>
16210 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 20 20  1 || isAgg) ){  
16220 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
16230 69 63 74 69 6f 6e 73 20 28 34 29 28 35 29 28 38  ictions (4)(5)(8
16240 29 28 39 29 20 2a 2f 0a 20 20 20 20 20 72 65 74  )(9) */.     ret
16250 75 72 6e 20 30 3b 20 20 20 20 20 20 20 0a 20 20  urn 0;       .  
16260 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  }.  if( (p->selF
16270 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
16280 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75 65  ct)!=0 && subque
16290 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ryIsAgg ){.     
162a0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
162b0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
162c0 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69   (6)  */.  }.  i
162d0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26  f( p->pOrderBy &
162e0 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
162f0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
16300 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  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 2f 2a 20               /* 
16330 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29  Restriction (11)
16340 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   */.  }.  if( is
16350 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  Agg && pSub->pOr
16360 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30  derBy ) return 0
16370 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16380 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
16390 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (16) */.  if( pS
163a0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
163b0 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
163c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
163d0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
163e0 28 31 39 29 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42  (19) */..  /* OB
163f0 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31  SOLETE COMMENT 1
16400 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69  :.  ** Restricti
16410 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
16420 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
16430 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
16440 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
16450 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
16460 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
16470 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
16480 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
16490 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
164a0 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
164b0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
164c0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
164d0 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
164e0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
164f0 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
16500 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
16510 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
16520 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
16530 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
16540 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
16550 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
16560 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
16570 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54   **.  ** OBSOLET
16580 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a  E COMMENT 2:.  *
16590 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
165a0 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
165b0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
165c0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
165d0 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
165e0 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
165f0 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
16600 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
16610 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
16620 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
16630 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
16640 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
16650 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
16660 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
16670 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
16680 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
16690 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
166a0 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
166b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
166c0 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
166d0 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
166e0 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
166f0 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
16700 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
16710 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
16720 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
16730 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
16740 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
16750 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
16760 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
16770 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56   **.  ** THIS OV
16780 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45  ERRIDES OBSOLETE
16790 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20   COMMENTS 1 AND 
167a0 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69  2 ABOVE:.  ** Ti
167b0 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73  cket #3300 shows
167c0 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67   that flattening
167d0 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
167e0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20  of a LEFT JOIN. 
167f0 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77   ** is fraught w
16800 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73  ith danger.  Bes
16810 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77  t to avoid the w
16820 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20  hole thing.  If 
16830 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
16840 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  y is the right t
16850 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
16860 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  IN, then do not 
16870 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  flatten..  */.  
16880 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a  if( (pSubitem->j
16890 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
168a0 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
168b0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
168c0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37  * Restriction 17
168d0 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
168e0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
168f0 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
16900 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
16910 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
16920 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
16930 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
16940 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
16950 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
16960 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
16970 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
16980 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
16990 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
169a0 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
169b0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
169c0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
169d0 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65   isAgg || (p->se
169e0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
169f0 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63  inct)!=0 || pSrc
16a00 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20  ->nSrc!=1 ){.   
16a10 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
16a20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31   }.    for(pSub1
16a30 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53  =pSub; pSub1; pS
16a40 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f  ub1=pSub1->pPrio
16a50 72 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  r){.      if( (p
16a60 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
16a70 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
16a80 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a  _Aggregate))!=0.
16a90 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
16aa0 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
16ab0 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a  1->op!=TK_ALL) .
16ac0 20 20 20 20 20 20 20 7c 7c 20 21 70 53 75 62 31         || !pSub1
16ad0 2d 3e 70 53 72 63 20 7c 7c 20 70 53 75 62 31 2d  ->pSrc || pSub1-
16ae0 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 0a 20  >pSrc->nSrc!=1. 
16af0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
16b00 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
16b10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
16b20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20  Restriction 18. 
16b30 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  */.    if( p->pO
16b40 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
16b50 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f  int ii;.      fo
16b60 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f  r(ii=0; ii<p->pO
16b70 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
16b80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
16b90 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ( p->pOrderBy->a
16ba0 5b 69 69 5d 2e 69 43 6f 6c 3d 3d 30 20 29 20 72  [ii].iCol==0 ) r
16bb0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
16bc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16bd0 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68  **** If we reach
16be0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61   this point, fla
16bf0 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
16c00 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20  tted. *****/..  
16c10 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65  /* Authorize the
16c20 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70   subquery */.  p
16c30 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
16c40 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ext = pSubitem->
16c50 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  zName;.  sqlite3
16c60 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
16c70 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
16c80 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 70 50 61   0, 0, 0);.  pPa
16c90 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
16ca0 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
16cb0 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  ntext;..  /* If 
16cc0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
16cd0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
16ce0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
16cf0 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69  en (by restricti
16d00 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20  ons.  ** 17 and 
16d10 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73  18 above) it mus
16d20 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
16d30 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20   and the parent 
16d40 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a  query must .  **
16d50 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
16d60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
16d70 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
16d80 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
16d90 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
16da0 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
16db0 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
16dc0 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
16dd0 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
16de0 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
16df0 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d  .  ** creates N-
16e00 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  1 copies of the 
16e10 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
16e20 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
16e30 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
16e40 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
16e50 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
16e60 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
16e70 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
16e80 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
16e90 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
16ea0 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
16eb0 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
16ec0 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
16ed0 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
16ee0 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
16ef0 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
16f00 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
16f10 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
16f20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
16f30 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  (.  **        SE
16f40 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a  LECT x FROM tab.
16f50 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
16f60 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
16f70 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
16f80 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
16f90 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
16fa0 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73        SELECT abs
16fb0 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a  (z*2) FROM tab2.
16fc0 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45    **     ) WHERE
16fd0 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31   a!=5 ORDER BY 1
16fe0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73  .  **.  ** Trans
16ff0 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  formed into:.  *
17000 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
17010 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T x+1 FROM tab W
17020 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a  HERE x+1!=5.  **
17030 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
17040 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79   **     SELECT y
17050 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
17060 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E y+1!=5.  **   
17070 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
17080 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
17090 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32  z*2)+1 FROM tab2
170a0 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b   WHERE abs(z*2)+
170b0 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52  1!=5.  **     OR
170c0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
170d0 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20  ** We call this 
170e0 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  the "compound-su
170f0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
17100 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  g"..  */.  for(p
17110 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
17120 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
17130 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
17140 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
17150 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
17160 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
17170 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
17180 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
17190 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
171a0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
171b0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
171c0 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
171d0 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
171e0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
171f0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
17200 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
17210 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c  SelectDup(db, p,
17220 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d   0);.    p->pLim
17230 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
17240 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
17250 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e  OrderBy;.    p->
17260 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
17270 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b   p->op = TK_ALL;
17280 0a 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f  .    p->pRightmo
17290 73 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  st = 0;.    if( 
172a0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
172b0 20 70 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a   pNew = pPrior;.
172c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
172d0 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
172e0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e  pPrior;.      pN
172f0 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  ew->pRightmost =
17300 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d   0;.    }.    p-
17310 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a  >pPrior = pNew;.
17320 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
17330 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
17340 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  n 1;.  }..  /* B
17350 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20  egin flattening 
17360 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74  the iFrom-th ent
17370 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
17380 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74  lause .  ** in t
17390 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
173a0 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
173b0 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
173c0 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44  pSelect;..  /* D
173d0 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69  elete the transi
173e0 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
173f0 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
17400 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
17410 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
17420 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
17430 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
17440 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  se);.  sqlite3Db
17450 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
17460 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  m->zName);.  sql
17470 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
17480 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
17490 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ;.  pSubitem->zD
174a0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70  atabase = 0;.  p
174b0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
174c0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
174d0 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53  zAlias = 0;.  pS
174e0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ubitem->pSelect 
174f0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72  = 0;..  /* Defer
17500 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61   deleting the Ta
17510 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ble object assoc
17520 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
17530 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74   ** subquery unt
17540 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
17550 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c  on is.  ** compl
17560 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
17570 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
17580 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69   Expr.pTab entri
17590 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66  es that.  ** ref
175a0 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  er to the subque
175b0 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c  ry even after fl
175c0 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65  attening.  Ticke
175d0 74 20 23 33 33 34 36 2e 0a 20 20 2a 2f 0a 20 20  t #3346..  */.  
175e0 69 66 28 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  if( pSubitem->pT
175f0 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 54 61 62  ab!=0 ){.    Tab
17600 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20  le *pTabToDel = 
17610 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a  pSubitem->pTab;.
17620 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65      if( pTabToDe
17630 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20  l->nRef==1 ){.  
17640 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70      pTabToDel->p
17650 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 50 61  NextZombie = pPa
17660 72 73 65 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b  rse->pZombieTab;
17670 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70  .      pParse->p
17680 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62  ZombieTab = pTab
17690 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  ToDel;.    }else
176a0 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  {.      pTabToDe
176b0 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d  l->nRef--;.    }
176c0 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  .    pSubitem->p
176d0 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Tab = 0;.  }..  
176e0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
176f0 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20   loop runs once 
17700 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e  for each term in
17710 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
17720 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65  uery.  ** flatte
17730 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69 62  ning (as describ
17740 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77  ed above).  If w
17750 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69  e are doing a di
17760 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a  fferent kind.  *
17770 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * of flattening 
17780 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f  - a flattening o
17790 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70  ther than a comp
177a0 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
177b0 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20  attening -.  ** 
177c0 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f  then this loop o
177d0 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20  nly runs once.. 
177e0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
177f0 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20  op moves all of 
17800 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  the FROM element
17810 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  s of the subquer
17820 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  y into the.  ** 
17830 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
17840 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
17850 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e  ry.  Before doin
17860 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72  g this, remember
17870 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  .  ** the cursor
17880 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
17890 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71  original outer q
178a0 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e  uery FROM elemen
178b0 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e  t in.  ** iParen
178c0 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20  t.  The iParent 
178d0 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65  cursor will neve
178e0 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73  r be used.  Subs
178f0 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a  equent code.  **
17900 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65   will scan expre
17910 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66  ssions looking f
17920 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72  or iParent refer
17930 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63  ences and replac
17940 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66  e.  ** those ref
17950 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70  erences with exp
17960 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65  ressions that re
17970 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62  solve to the sub
17980 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20  query FROM.  ** 
17990 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20  elements we are 
179a0 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a  now copying in..
179b0 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65    */.  for(pPare
179c0 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70  nt=p; pParent; p
179d0 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e  Parent=pParent->
179e0 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75  pPrior, pSub=pSu
179f0 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
17a00 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20  int nSubSrc;.   
17a10 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30   u8 jointype = 0
17a20 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d 20  ;.    pSubSrc = 
17a30 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20  pSub->pSrc;     
17a40 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
17a50 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  f subquery */.  
17a60 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62    nSubSrc = pSub
17a70 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e  Src->nSrc;  /* N
17a80 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
17a90 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20  n subquery FROM 
17aa0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53  clause */.    pS
17ab0 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
17ac0 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
17ad0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
17ae0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ter query */..  
17af0 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20    if( pSrc ){.  
17b00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
17b10 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69  ent==p );  /* Fi
17b20 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68  rst time through
17b30 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
17b40 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53     jointype = pS
17b50 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
17b60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17b70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
17b80 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64  nt!=p );  /* 2nd
17b90 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
17ba0 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68  times through th
17bb0 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
17bc0 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
17bd0 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
17be0 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
17bf0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
17c00 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20  if( pSrc==0 ){. 
17c10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
17c20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
17c30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
17c40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17c50 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  .    /* The subq
17c60 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67  uery uses a sing
17c70 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46  le slot of the F
17c80 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
17c90 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71  e outer.    ** q
17ca0 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75  uery.  If the su
17cb0 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20  bquery has more 
17cc0 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  than one element
17cd0 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
17ce0 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  use,.    ** then
17cf0 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65   expand the oute
17d00 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20  r query to make 
17d10 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20  space for it to 
17d20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  hold all element
17d30 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
17d40 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  subquery..    **
17d50 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
17d60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
17d70 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
17d80 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20  tabA, (SELECT * 
17d90 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29  FROM sub1, sub2)
17da0 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20  , tabB;.    **. 
17db0 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20     ** The outer 
17dc0 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74  query has 3 slot
17dd0 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  s in its FROM cl
17de0 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20  ause.  One slot 
17df0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  of the.    ** ou
17e00 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d  ter query (the m
17e10 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75  iddle slot) is u
17e20 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75  sed by the subqu
17e30 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20  ery.  The next. 
17e40 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63     ** block of c
17e50 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  ode will expand 
17e60 74 68 65 20 6f 75 74 20 71 75 65 72 79 20 74 6f  the out query to
17e70 20 34 20 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d   4 slots.  The m
17e80 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f  iddle.    ** slo
17e90 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f  t is expanded to
17ea0 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72   two slots in or
17eb0 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  der to make spac
17ec0 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e for the.    **
17ed0 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
17ee0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
17ef0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
17f00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
17f10 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
17f20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
17f30 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74  c = pSrc = sqlit
17f40 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
17f50 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53  (db, pSrc, nSubS
17f60 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20  rc-1,iFrom+1);. 
17f70 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
17f80 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
17f90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17fa0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
17fb0 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 46  * Transfer the F
17fc0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
17fd0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65   from the subque
17fe0 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  ry into the.    
17ff0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  ** outer query..
18000 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
18010 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
18020 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d  ++){.      pSrc-
18030 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
18040 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
18050 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
18060 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
18070 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
18080 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
18090 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f  Src->a[iFrom].jo
180a0 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
180b0 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77  e;.  .    /* Now
180c0 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
180d0 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
180e0 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
180f0 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  ons for .    ** 
18100 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
18110 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65  e iParent in the
18120 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
18130 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61    ** .    ** Exa
18140 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
18150 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
18160 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
18170 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
18180 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
18190 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20   WHERE a>b;.    
181a0 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  **   \          
181b0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
181c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65  _________ subque
181d0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  ry __________/  
181e0 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a          /.    **
181f0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
18200 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
18210 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
18220 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18230 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20  _____/.    **.  
18240 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20    ** We look at 
18250 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
18260 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
18270 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c  ery and every pl
18280 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a  ace we see.    *
18290 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
182a0 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
182b0 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
182c0 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
182d0 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a  te "y+10"..    *
182e0 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50  /.    pList = pP
182f0 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  arent->pEList;. 
18300 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
18310 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
18320 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
18330 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
18340 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
18350 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d 20  ==0 && (pExpr = 
18360 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
18370 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b  r)->span.z!=0 ){
18380 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
18390 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 0a 20 20  a[i].zName = .  
183a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
183b0 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
183c0 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  , (char*)pExpr->
183d0 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73  span.z, pExpr->s
183e0 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  pan.n);.      }.
183f0 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74 45      }.    substE
18400 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
18410 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61  ent->pEList, iPa
18420 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
18430 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69 73 41  st);.    if( isA
18440 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  gg ){.      subs
18450 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50  tExprList(db, pP
18460 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c  arent->pGroupBy,
18470 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
18480 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73  pEList);.      s
18490 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
184a0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
184b0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
184c0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
184d0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
184e0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rBy ){.      ass
184f0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f  ert( pParent->pO
18500 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
18510 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
18520 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
18530 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
18540 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
18550 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
18560 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
18570 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
18580 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
18590 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  ent->pOrderBy, i
185a0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
185b0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
185c0 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
185d0 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72  e ){.      pWher
185e0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
185f0 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
18600 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ere, 0);.    }el
18610 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65  se{.      pWhere
18620 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
18630 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
18640 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
18650 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  t( pParent->pHav
18660 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ing==0 );.      
18670 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
18680 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65   = pParent->pWhe
18690 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
186a0 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  t->pWhere = pWhe
186b0 72 65 3b 0a 20 20 20 20 20 20 73 75 62 73 74 45  re;.      substE
186c0 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  xpr(db, pParent-
186d0 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
186e0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
186f0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
18700 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
18710 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50  e3ExprAnd(db, pP
18720 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
18730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18750 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
18760 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76  p(db, pSub->pHav
18770 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ing, 0));.      
18780 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
18790 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
187a0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
187b0 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
187c0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
187d0 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c   pSub->pGroupBy,
187e0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
187f0 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 28        substExpr(
18800 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  db, pParent->pWh
18810 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ere, iParent, pS
18820 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
18830 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
18840 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
18850 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  And(db, pParent-
18860 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
18870 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
18880 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20  * The flattened 
18890 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
188a0 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  t if either the 
188b0 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20  inner or the.   
188c0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
188d0 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20  is distinct. .  
188e0 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74    */.    pParent
188f0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53  ->selFlags |= pS
18900 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
18910 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20  F_Distinct;.  . 
18920 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c     /*.    ** SEL
18930 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45  ECT ... FROM (SE
18940 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61  LECT ... LIMIT a
18950 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54   OFFSET b) LIMIT
18960 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20   x OFFSET y;.   
18970 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69   **.    ** One i
18980 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79  s tempted to try
18990 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20   to add a and b 
189a0 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  to combine the l
189b0 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73  imits.  But this
189c0 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  .    ** does not
189d0 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20   work if either 
189e0 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
189f0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
18a00 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  ( pSub->pLimit )
18a10 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
18a20 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e  >pLimit = pSub->
18a30 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53  pLimit;.      pS
18a40 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ub->pLimit = 0;.
18a50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18a60 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
18a70 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
18a80 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
18a90 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
18aa0 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
18ab0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
18ac0 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20  e(db, pSub1);.. 
18ad0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
18ae0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
18af0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
18b00 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
18b10 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
18b20 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  EW) */../*.** An
18b30 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54  alyze the SELECT
18b40 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
18b50 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
18b60 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a   to see if it.**
18b70 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d   is a min() or m
18b80 61 78 28 29 20 71 75 65 72 79 2e 20 52 65 74 75  ax() query. Retu
18b90 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
18ba0 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52  _MIN or WHERE_OR
18bb0 44 45 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a  DERBY_MAX if .**
18bc0 20 69 74 20 69 73 2c 20 6f 72 20 30 20 6f 74 68   it is, or 0 oth
18bd0 65 72 77 69 73 65 2e 20 41 74 20 70 72 65 73 65  erwise. At prese
18be0 6e 74 2c 20 61 20 71 75 65 72 79 20 69 73 20 63  nt, a query is c
18bf0 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 0a  onsidered to be.
18c00 2a 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29  ** a min()/max()
18c10 20 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a   query if:.**.**
18c20 20 20 20 31 2e 20 54 68 65 72 65 20 69 73 20 61     1. There is a
18c30 20 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69   single object i
18c40 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
18c50 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68  e..**.**   2. Th
18c60 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ere is a single 
18c70 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
18c80 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e  e result set, an
18c90 64 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20  d it is.**      
18ca0 65 69 74 68 65 72 20 6d 69 6e 28 78 29 20 6f 72  either min(x) or
18cb0 20 6d 61 78 28 78 29 2c 20 77 68 65 72 65 20 78   max(x), where x
18cc0 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66   is a column ref
18cd0 65 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erence..*/.stati
18ce0 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79  c u8 minMaxQuery
18cf0 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45  (Select *p){.  E
18d00 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78  xpr *pExpr;.  Ex
18d10 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
18d20 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69   p->pEList;..  i
18d30 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  f( pEList->nExpr
18d40 21 3d 31 20 29 20 72 65 74 75 72 6e 20 57 48 45  !=1 ) return WHE
18d50 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
18d60 4c 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c  L;.  pExpr = pEL
18d70 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
18d80 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
18d90 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
18da0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20 72 65  _xIsSelect) ) re
18db0 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74  turn 0;.  pEList
18dc0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
18dd0 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  t;.  if( pExpr->
18de0 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
18df0 49 4f 4e 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30  ION || pEList==0
18e00 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   || pEList->nExp
18e10 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
18e20 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61  .  if( pEList->a
18e30 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54  [0].pExpr->op!=T
18e40 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72  K_AGG_COLUMN ) r
18e50 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
18e60 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66  RBY_NORMAL;.  if
18e70 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  ( pExpr->token.n
18e80 21 3d 33 20 29 20 72 65 74 75 72 6e 20 57 48 45  !=3 ) return WHE
18e90 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
18ea0 4c 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  L;.  if( sqlite3
18eb0 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
18ec0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
18ed0 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  min",3)==0 ){.  
18ee0 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f    return WHERE_O
18ef0 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65  RDERBY_MIN;.  }e
18f00 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
18f10 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70  trNICmp((char*)p
18f20 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
18f30 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  ax",3)==0 ){.   
18f40 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   return WHERE_OR
18f50 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20  DERBY_MAX;.  }. 
18f60 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   return WHERE_OR
18f70 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a  DERBY_NORMAL;.}.
18f80 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
18f90 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
18fa0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
18fb0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61  argument is an a
18fc0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a  ggregate query..
18fd0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
18fe0 67 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73  gment is the ass
18ff0 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74  ociated aggregat
19000 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54  e-info object. T
19010 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
19020 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45   tests if the SE
19030 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66  LECT is of the f
19040 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  orm:.**.**   SEL
19050 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
19060 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68  M <tbl>.**.** wh
19070 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64  ere table is a d
19080 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e  atabase table, n
19090 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ot a sub-select 
190a0 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20  or view. If the 
190b0 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61  query.** does ma
190c0 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e  tch this pattern
190d0 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
190e0 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62   to the Table ob
190f0 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e  ject representin
19100 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65  g.** <tbl> is re
19110 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
19120 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
19130 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c  ..*/.static Tabl
19140 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  e *isSimpleCount
19150 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49  (Select *p, AggI
19160 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
19170 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
19180 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20   Expr *pExpr;.. 
19190 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72   assert( !p->pGr
191a0 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20  oupBy );..  if( 
191b0 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e  p->pWhere || p->
191c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
191d0 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d   .   || p->pSrc-
191e0 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70  >nSrc!=1 || p->p
191f0 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
19200 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t.  ){.    retur
19210 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20  n 0;.  }.  pTab 
19220 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
19230 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20  pTab;.  pExpr = 
19240 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
19250 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
19260 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e   pTab && !pTab->
19270 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72  pSelect && pExpr
19280 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72   );..  if( IsVir
19290 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
192a0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
192b0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
192c0 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
192d0 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49   0;.  if( (pAggI
192e0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46  nfo->aFunc[0].pF
192f0 75 6e 63 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  unc->flags&SQLIT
19300 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30  E_FUNC_COUNT)==0
19310 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
19320 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  f( pExpr->flags&
19330 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  EP_Distinct ) re
19340 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72  turn 0;..  retur
19350 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
19360 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c   If the source-l
19370 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20  ist item passed 
19380 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77  as an argument w
19390 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74  as augmented wit
193a0 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20  h an.** INDEXED 
193b0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
193c0 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  try to locate th
193d0 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65  e specified inde
193e0 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77  x. If there.** w
193f0 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65  as such a clause
19400 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69   and the named i
19410 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66  ndex cannot be f
19420 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  ound, return .**
19430 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e   SQLITE_ERROR an
19440 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  d leave an error
19450 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65   in pParse. Othe
19460 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20  rwise, populate 
19470 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65  .** pFrom->pInde
19480 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  x and return SQL
19490 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
194a0 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
194b0 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61  ookup(Parse *pPa
194c0 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
194d0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
194e0 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70  {.  if( pFrom->p
194f0 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49  Tab && pFrom->zI
19500 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61 62 6c  ndex ){.    Tabl
19510 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
19520 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20  >pTab;.    char 
19530 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d  *zIndex = pFrom-
19540 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64  >zIndex;.    Ind
19550 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
19560 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
19570 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49  dex; .        pI
19580 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  dx && sqlite3Str
19590 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65  ICmp(pIdx->zName
195a0 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20 20  , zIndex); .    
195b0 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70      pIdx=pIdx->p
195c0 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Next.    );.    
195d0 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20  if( !pIdx ){.   
195e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
195f0 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
19600 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20  uch index: %s", 
19610 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20  zIndex, 0);.    
19620 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19630 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
19640 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d   pFrom->pIndex =
19650 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74   pIdx;.  }.  ret
19660 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19670 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
19680 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72  tine is a Walker
19690 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65   callback for "e
196a0 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45  xpanding" a SELE
196b0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
196c0 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61   "Expanding" mea
196d0 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c  ns to do the fol
196e0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
196f0 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20   (1)  Make sure 
19700 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
19710 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
19720 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a  signed to every.
19730 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65  **         eleme
19740 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  nt of the FROM c
19750 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lause..**.**    
19760 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  (2)  Fill in the
19770 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
19780 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68  Tab fields in th
19790 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a  e SrcList that .
197a0 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e  **         defin
197b0 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  es FROM clause. 
197c0 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65   When views appe
197d0 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
197e0 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20  lause,.**       
197f0 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d    fill pTabList-
19800 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74  >a[].pSelect wit
19810 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
19820 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
19830 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74  .**         that
19840 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
19850 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73  view.  A copy is
19860 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65   made of the vie
19870 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20  w's SELECT.**   
19880 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20        statement 
19890 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66  so that we can f
198a0 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20  reely modify or 
198b0 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74  delete that stat
198c0 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
198d0 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e   without worryin
198e0 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20  g about messing 
198f0 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e  up the presisten
19900 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
19910 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74  .**         of t
19920 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20  he view..**.**  
19930 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73    (3)  Add terms
19940 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
19950 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61  ause to accomoda
19960 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
19970 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
19980 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
19990 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
199a0 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
199b0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
199c0 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
199d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
199e0 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
199f0 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
19a00 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
19a10 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
19a20 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
19a30 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
19a40 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
19a50 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
19a60 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
19a70 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
19a80 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
19a90 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
19aa0 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
19ab0 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
19ac0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
19ad0 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b  ectExpander(Walk
19ae0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
19af0 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
19b00 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
19b10 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e  er->pParse;.  in
19b20 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63  t i, j, k;.  Src
19b30 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
19b40 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
19b50 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
19b60 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
19b70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
19b80 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
19b90 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
19ba0 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65  ailed  ){.    re
19bb0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
19bc0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 53 72    }.  if( p->pSr
19bd0 63 3d 3d 30 20 7c 7c 20 28 70 2d 3e 73 65 6c 46  c==0 || (p->selF
19be0 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64  lags & SF_Expand
19bf0 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ed)!=0 ){.    re
19c00 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
19c10 20 20 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67    }.  p->selFlag
19c20 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64  s |= SF_Expanded
19c30 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
19c40 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
19c50 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   = p->pEList;.. 
19c60 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75   /* Make sure cu
19c70 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
19c80 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
19c90 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  to all entries i
19ca0 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  n.  ** the FROM 
19cb0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
19cc0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
19cd0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
19ce0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
19cf0 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  rs(pParse, pTabL
19d00 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ist);..  /* Look
19d10 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
19d20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
19d30 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
19d40 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a  select.  If.  **
19d50 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
19d60 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
19d70 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65  a subquery inste
19d80 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ad of a table or
19d90 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e   view,.  ** then
19da0 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69   create a transi
19db0 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
19dc0 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20  ure to describe 
19dd0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
19de0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  */.  for(i=0, pF
19df0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
19e00 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
19e10 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
19e20 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
19e30 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  b;.    if( pFrom
19e40 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20  ->pTab!=0 ){.   
19e50 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65     /* This state
19e60 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79  ment has already
19e70 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20   been prepared. 
19e80 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
19e90 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f  d.      ** to go
19ea0 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20   further. */.   
19eb0 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20     assert( i==0 
19ec0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
19ed0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
19ee0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
19ef0 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
19f00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19f10 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53  SUBQUERY.      S
19f20 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
19f30 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
19f40 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
19f50 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
19f60 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
19f70 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  T */.      asser
19f80 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20  t( pSel!=0 );.  
19f90 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
19fa0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
19fb0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
19fc0 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
19fd0 53 65 6c 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  Sel);.      pFro
19fe0 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
19ff0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1a000 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1a010 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69  Table));.      i
1a020 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
1a030 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1a040 20 20 20 20 20 70 54 61 62 2d 3e 64 62 4d 65 6d       pTab->dbMem
1a050 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65   = db->lookaside
1a060 2e 62 45 6e 61 62 6c 65 64 20 3f 20 64 62 20 3a  .bEnabled ? db :
1a070 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   0;.      pTab->
1a080 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
1a090 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pTab->zName = sq
1a0a0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1a0b0 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72   "sqlite_subquer
1a0c0 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70  y_%p_", (void*)p
1a0d0 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  Tab);.      whil
1a0e0 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
1a0f0 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e  ){ pSel = pSel->
1a100 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20  pPrior; }.      
1a110 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
1a120 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
1a130 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20  , pSel->pEList, 
1a140 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
1a150 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  ab->aCol);.     
1a160 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
1a170 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  1;.      pTab->t
1a180 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
1a190 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a  hemeral;.#endif.
1a1a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a1b0 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
1a1c0 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
1a1d0 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
1a1e0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
1a1f0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
1a200 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
1a210 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
1a220 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
1a230 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
1a240 70 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e  pParse,0,pFrom->
1a250 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61  zName,pFrom->zDa
1a260 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69  tabase);.      i
1a270 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
1a280 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1a290 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
1a2a0 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  +;.#if !defined(
1a2b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1a2c0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53  ) || !defined (S
1a2d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1a2e0 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69  ALTABLE).      i
1a2f0 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
1a300 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54   || IsVirtual(pT
1a310 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ab) ){.        /
1a320 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20  * We reach here 
1a330 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
1a340 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61  le is a really a
1a350 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20   view */.       
1a360 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
1a370 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
1a380 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72  Parse, pTab) ) r
1a390 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1a3a0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ..        /* If 
1a3b0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d  pFrom->pSelect!=
1a3c0 30 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  0 it means we ar
1a3d0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
1a3e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77  .        ** view
1a3f0 20 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20   within a view. 
1a400 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 72 75   The SELECT stru
1a410 63 74 75 72 65 20 68 61 73 20 61 6c 72 65 61 64  cture has alread
1a420 79 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a  y been.        *
1a430 2a 20 63 6f 70 69 65 64 20 62 79 20 74 68 65 20  * copied by the 
1a440 6f 75 74 65 72 20 76 69 65 77 20 73 6f 20 77 65  outer view so we
1a450 20 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f   can skip the co
1a460 70 79 20 73 74 65 70 20 68 65 72 65 0a 20 20 20  py step here.   
1a470 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
1a480 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20  nner view..     
1a490 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1a4a0 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
1a4b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1a4c0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
1a4d0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
1a4e0 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65  up(db, pTab->pSe
1a4f0 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lect, 0);.      
1a500 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
1a510 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
1a520 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  From->pSelect);.
1a530 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a540 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  }.#endif.    }..
1a550 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68      /* Locate th
1a560 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79  e index named by
1a570 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20   the INDEXED BY 
1a580 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20  clause, if any. 
1a590 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
1a5a0 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
1a5b0 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  p(pParse, pFrom)
1a5c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1a5d0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
1a5e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
1a5f0 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  ess NATURAL keyw
1a600 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64  ords, and ON and
1a610 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
1a620 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  f joins..  */.  
1a630 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1a640 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72  iled || sqlitePr
1a650 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65  ocessJoin(pParse
1a660 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , p) ){.    retu
1a670 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1a680 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  }..  /* For ever
1a690 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72  y "*" that occur
1a6a0 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  s in the column 
1a6b0 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65  list, insert the
1a6c0 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61   names of.  ** a
1a6d0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
1a6e0 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66  l tables.  And f
1a6f0 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a  or every TABLE.*
1a700 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
1a710 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f  s.  ** of all co
1a720 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20  lumns in TABLE. 
1a730 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65   The parser inse
1a740 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65  rted a special e
1a750 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77  xpression.  ** w
1a760 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f  ith the TK_ALL o
1a770 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  perator for each
1a780 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75   "*" that it fou
1a790 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  nd in the column
1a7a0 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20   list..  ** The 
1a7b0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
1a7c0 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
1a7d0 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70  e the TK_ALL exp
1a7e0 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70  ressions and exp
1a7f0 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e  and.  ** each on
1a800 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
1a810 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
1a820 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  all tables..  **
1a830 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
1a840 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73  loop just checks
1a850 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
1a860 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65   are any "*" ope
1a870 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74  rators.  ** that
1a880 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e   need expanding.
1a890 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  .  */.  for(k=0;
1a8a0 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
1a8b0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; k++){.    Expr
1a8c0 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61   *pE = pEList->a
1a8d0 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [k].pExpr;.    i
1a8e0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  f( pE->op==TK_AL
1a8f0 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  L ) break;.    i
1a900 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
1a910 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20  T && pE->pRight 
1a920 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  && pE->pRight->o
1a930 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20  p==TK_ALL.      
1a940 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20     && pE->pLeft 
1a950 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70  && pE->pLeft->op
1a960 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b  ==TK_ID ) break;
1a970 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c  .  }.  if( k<pEL
1a980 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
1a990 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
1a9a0 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
1a9b0 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
1a9c0 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
1a9d0 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
1a9e0 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
1a9f0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
1aa00 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
1aa10 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
1aa20 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
1aa30 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
1aa40 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
1aa50 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
1aa60 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
1aa70 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
1aa80 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
1aa90 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
1aaa0 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
1aab0 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  = pParse->db->fl
1aac0 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e  ags;.    int lon
1aad0 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20  gNames = (flags 
1aae0 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
1aaf0 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20  Names)!=0.      
1ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab10 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  && (flags & SQLI
1ab20 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
1ab30 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b  )==0;..    for(k
1ab40 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
1ab50 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
1ab60 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d   Expr *pE = a[k]
1ab70 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
1ab80 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ( pE->op!=TK_ALL
1ab90 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28   &&.           (
1aba0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
1abb0 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20  | pE->pRight==0 
1abc0 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  || pE->pRight->o
1abd0 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
1abe0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
1abf0 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
1ac00 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
1ac10 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
1ac20 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1ac30 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
1ac40 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1ac50 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
1ac60 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  a[k].pExpr, 0);.
1ac70 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1ac80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
1ac90 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
1aca0 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
1acb0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
1acc0 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e   }.        a[k].
1acd0 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
1ace0 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
1acf0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
1ad00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
1ad10 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
1ad20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e  "*" or a "TABLE.
1ad30 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  *" and needs to 
1ad40 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  be.        ** ex
1ad50 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20  panded. */.     
1ad60 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e     int tableSeen
1ad70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65   = 0;      /* Se
1ad80 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c  t to 1 when TABL
1ad90 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20  E matches */.   
1ada0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d       char *zTNam
1adb0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1adc0 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66   text of name of
1add0 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20   TABLE */.      
1ade0 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
1adf0 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66  _DOT && pE->pLef
1ae00 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  t ){.          z
1ae10 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  TName = sqlite3N
1ae20 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1ae30 20 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b   &pE->pLeft->tok
1ae40 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  en);.        }el
1ae50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se{.          zT
1ae60 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
1ae70 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
1ae80 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
1ae90 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
1aea0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
1aeb0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
1aec0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
1aed0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
1aee0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
1aef0 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e  abName = pFrom->
1af00 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
1af10 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
1af20 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
1af30 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  ==0 ){ .        
1af40 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
1af50 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
1af60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1af70 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1af80 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
1af90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
1afa0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
1afb0 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
1afc0 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  TabName)!=0 ){. 
1afd0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1afe0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
1aff0 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65  .          table
1b000 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
1b010 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1b020 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
1b030 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
1b040 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68  r *pExpr, *pRigh
1b050 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  t;.            c
1b060 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
1b070 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
1b080 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;..            /
1b090 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73  * If a column is
1b0a0 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64   marked as 'hidd
1b0b0 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f  en' (currently o
1b0c0 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20  nly possible.   
1b0d0 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
1b0e0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c  virtual tables),
1b0f0 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20   do not include 
1b100 69 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64  it in the expand
1b110 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ed.            *
1b120 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73  * result-set lis
1b130 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
1b140 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
1b150 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e  ( IsHiddenColumn
1b160 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29  (&pTab->aCol[j])
1b170 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b180 20 20 61 73 73 65 72 74 28 49 73 56 69 72 74 75    assert(IsVirtu
1b190 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20  al(pTab));.     
1b1a0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1b1b0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
1b1c0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1b1d0 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d  ( i>0 && zTName=
1b1e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1b1f0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1b200 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d  st_item *pLeft =
1b210 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d   &pTabList->a[i-
1b220 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1];.            
1b230 20 20 69 66 28 20 28 70 4c 65 66 74 5b 31 5d 2e    if( (pLeft[1].
1b240 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
1b250 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20  TURAL)!=0 &&.   
1b260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b270 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78       columnIndex
1b280 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e  (pLeft->pTab, zN
1b290 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
1b2a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1b2b0 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
1b2c0 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
1b2d0 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
1b2e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b2f0 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65   ** table on the
1b300 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20   right */.      
1b310 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1b320 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1b330 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1b340 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
1b350 69 73 74 49 6e 64 65 78 28 70 4c 65 66 74 5b 31  istIndex(pLeft[1
1b360 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ].pUsing, zName)
1b370 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
1b380 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
1b390 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47  oin with a USING
1b3a0 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f   clause, omit co
1b3b0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  lumns in the.   
1b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1b3d0 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
1b3e0 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
1b3f0 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
1b400 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
1b410 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1b420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b430 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1b440 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
1b450 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1b460 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
1b470 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b480 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61  pRight==0 ) brea
1b490 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  k;.            s
1b4a0 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50  etQuotedToken(pP
1b4b0 61 72 73 65 2c 20 26 70 52 69 67 68 74 2d 3e 74  arse, &pRight->t
1b4c0 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  oken, zName);.  
1b4d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
1b4e0 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c  ngNames || pTabL
1b4f0 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20  ist->nSrc>1 ){. 
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
1b510 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
1b520 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
1b530 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
1b540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1b550 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
1b560 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
1b570 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
1b580 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
1b590 20 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d       if( pExpr==
1b5a0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
1b5b0 20 20 20 20 20 20 20 20 20 73 65 74 51 75 6f 74           setQuot
1b5c0 65 64 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20  edToken(pParse, 
1b5d0 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a  &pLeft->token, z
1b5e0 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
1b5f0 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e          setToken
1b600 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 0a  (&pExpr->span, .
1b610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b620 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
1b630 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54  (db, "%s.%s", zT
1b640 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b  abName, zName));
1b650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1b660 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d  Expr->span.dyn =
1b670 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
1b680 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a    pExpr->token.z
1b690 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1b6a0 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
1b6b0 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
1b6c0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
1b6d0 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20  en.dyn = 0;.    
1b6e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1b700 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
1b710 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1b720 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e  ->span = pExpr->
1b730 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20  token;.         
1b740 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
1b750 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  .dyn = 0;.      
1b760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b770 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
1b780 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
1b790 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1b7a0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1b7b0 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45  pParse, pNew, pE
1b7c0 78 70 72 2c 20 26 70 45 78 70 72 2d 3e 73 70 61  xpr, &pExpr->spa
1b7d0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
1b7e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1b7f0 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
1b800 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1b810 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
1b820 70 45 78 70 72 2c 20 26 70 52 69 67 68 74 2d 3e  pExpr, &pRight->
1b830 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  token);.        
1b840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1b850 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1b860 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
1b870 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
1b880 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
1b890 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b8a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1b8b0 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
1b8c0 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
1b8d0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1b8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1b8f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1b900 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
1b910 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
1b920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b930 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1b940 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 4e  e3DbFree(db, zTN
1b950 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1b960 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
1b970 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
1b980 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
1b990 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
1b9a0 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
1b9b0 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
1b9c0 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d   p->pEList && p-
1b9d0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64  >pEList->nExpr>d
1b9e0 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
1b9f0 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
1ba00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1ba10 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
1ba20 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
1ba30 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b  in result set");
1ba40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
1ba50 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1ba60 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f  e;.}../*.** No-o
1ba70 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68  p routine for th
1ba80 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c  e parse-tree wal
1ba90 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ker..**.** When 
1baa0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1bab0 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  the Walker.xExpr
1bac0 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78  Callback then ex
1bad0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a  pression trees.*
1bae0 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74  * are walked wit
1baf0 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73  hout any actions
1bb00 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20   being taken at 
1bb10 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73  each node.  Pres
1bb20 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20  umably,.** when 
1bb30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1bb40 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e  used for Walker.
1bb50 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
1bb60 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53  en .** Walker.xS
1bb70 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73  electCallback is
1bb80 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74   set to do somet
1bb90 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20  hing useful for 
1bba0 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65  every .** subque
1bbb0 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ry in the parser
1bbc0 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   tree..*/.static
1bbd0 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f   int exprWalkNoo
1bbe0 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65  p(Walker *NotUse
1bbf0 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64  d, Expr *NotUsed
1bc00 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
1bc10 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
1bc20 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
1bc30 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1bc40 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
1bc50 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64   routine "expand
1bc60 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  s" a SELECT stat
1bc70 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66  ement and all of
1bc80 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e   its subqueries.
1bc90 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e  .** For addition
1bca0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  al information o
1bcb0 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20  n what it means 
1bcc0 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45  to "expand" a SE
1bcd0 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
1bce0 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  t, see the comme
1bcf0 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74  nt on the select
1bd00 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61  Expand worker ca
1bd10 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a  llback above..**
1bd20 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20  .** Expanding a 
1bd30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1bd40 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74   is the first st
1bd50 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  ep in processing
1bd60 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
1bd70 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c  tement.  The SEL
1bd80 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75  ECT statement mu
1bd90 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62  st be expanded b
1bda0 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65  efore.** name re
1bdb0 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66  solution is perf
1bdc0 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormed..**.** If 
1bdd0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
1bde0 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  ong, an error me
1bdf0 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
1be00 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a   into pParse..**
1be10 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
1be20 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74  ction can detect
1be30 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20   the problem by 
1be40 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73  looking at pPars
1be50 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f  e->nErr.** and/o
1be60 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  r pParse->db->ma
1be70 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73  llocFailed..*/.s
1be80 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
1be90 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50  e3SelectExpand(P
1bea0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
1beb0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
1bec0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
1bed0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1bee0 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  = selectExpander
1bef0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
1bf00 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f  ack = exprWalkNo
1bf10 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
1bf20 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
1bf30 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
1bf40 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23   pSelect);.}...#
1bf50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bf60 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
1bf70 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b  * This is a Walk
1bf80 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
1bf90 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ck callback for 
1bfa0 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63  the sqlite3Selec
1bfb0 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69  tTypeInfo().** i
1bfc0 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
1bfd0 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c  For each FROM-cl
1bfe0 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61  ause subquery, a
1bff0 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20  dd Column.zType 
1c000 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  and Column.zColl
1c010 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
1c020 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  to the Table str
1c030 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
1c040 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
1c050 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74  t set.** of that
1c060 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
1c070 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
1c080 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73  ture that repres
1c090 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  ents the result 
1c0a0 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63  set was construc
1c0b0 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74  ted.** by select
1c0c0 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74  Expander() but t
1c0d0 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  he type and coll
1c0e0 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
1c0f0 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a  n was omitted.**
1c100 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62   at that point b
1c110 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65  ecause identifie
1c120 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62  rs had not yet b
1c130 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54  een resolved.  T
1c140 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
1c150 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69  s called after i
1c160 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75  dentifier resolu
1c170 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1c180 69 6e 74 20 73 65 6c 65 63 74 41 64 64 53 75 62  int selectAddSub
1c190 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61  queryTypeInfo(Wa
1c1a0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
1c1b0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
1c1c0 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e  se *pParse;.  in
1c1d0 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  t i;.  SrcList *
1c1e0 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
1c1f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1c200 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72  *pFrom;..  asser
1c210 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
1c220 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a   SF_Resolved );.
1c230 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
1c240 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
1c250 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nfo)==0 ){.    p
1c260 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
1c270 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20  _HasTypeInfo;.  
1c280 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
1c290 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  er->pParse;.    
1c2a0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
1c2b0 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rc;.    for(i=0,
1c2c0 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
1c2d0 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
1c2e0 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
1c2f0 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  ++){.      Table
1c300 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
1c310 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
1c320 70 54 61 62 20 26 26 20 28 70 54 61 62 2d 3e 74  pTab && (pTab->t
1c330 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
1c340 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20  emeral)!=0 ){.  
1c350 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
1c360 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
1c370 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1c380 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  ECT */.        S
1c390 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
1c3a0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
1c3b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1c3c0 65 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68  el );.        wh
1c3d0 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
1c3e0 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d  r ) pSel = pSel-
1c3f0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
1c400 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
1c410 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
1c420 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e  (pParse, pTab->n
1c430 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c  Col, pTab->aCol,
1c440 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   pSel);.      }.
1c450 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1c460 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1c470 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
1c480 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1c490 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
1c4a0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1c4b0 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
1c4c0 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
1c4d0 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
1c4e0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
1c4f0 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
1c500 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1c510 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
1c520 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
1c530 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
1c540 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c550 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
1c560 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
1c570 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
1c580 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
1c590 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1c5a0 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
1c5b0 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  w;.  w.xSelectCa
1c5c0 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 41  llback = selectA
1c5d0 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
1c5e0 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  fo;.  w.xExprCal
1c5f0 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b  lback = exprWalk
1c600 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
1c610 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c   = pParse;.  sql
1c620 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
1c630 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e  w, pSelect);.#en
1c640 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.}.../*.** Th
1c650 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
1c660 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
1c670 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73  ement for proces
1c680 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f  sing.  The.** fo
1c690 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d  llowing is accom
1c6a0 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  plished:.**.**  
1c6b0 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f     *  VDBE Curso
1c6c0 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73  r numbers are as
1c6d0 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52  signed to all FR
1c6e0 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  OM-clause terms.
1c6f0 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d  .**     *  Ephem
1c700 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
1c710 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ts are created f
1c720 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  or all FROM-clau
1c730 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  se subqueries..*
1c740 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20  *     *  ON and 
1c750 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72  USING clauses ar
1c760 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57  e shifted into W
1c770 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a  HERE statements.
1c780 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61  **     *  Wildca
1c790 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42  rds "*" and "TAB
1c7a0 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20  LE.*" in result 
1c7b0 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65  sets are expande
1c7c0 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65  d..**     *  Ide
1c7d0 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72  ntifiers in expr
1c7e0 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68  ession are match
1c7f0 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a  ed to tables..**
1c800 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c810 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c   acts recursivel
1c820 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72  y on all subquer
1c830 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53  ies within the S
1c840 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
1c850 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
1c860 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1c870 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
1c880 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
1c890 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c8b0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
1c8c0 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
1c8d0 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  . */.  NameConte
1c8e0 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a  xt *pOuterNC  /*
1c8f0 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
1c900 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29  r container */.)
1c910 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1c920 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1c930 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61  turn;.  db = pPa
1c940 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
1c950 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1c960 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65  HasTypeInfo ) re
1c970 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
1c980 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
1c990 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
1c9a0 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
1c9b0 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61  SelectExpand(pPa
1c9c0 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
1c9d0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
1c9e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c9f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1ca00 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74  te3ResolveSelect
1ca10 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c  Names(pParse, p,
1ca20 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66   pOuterNC);.  if
1ca30 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1ca40 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1ca50 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
1ca60 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
1ca70 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ypeInfo(pParse, 
1ca80 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  p);.}../*.** Res
1ca90 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65  et the aggregate
1caa0 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a   accumulator..**
1cab0 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74  .** The aggregat
1cac0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73  e accumulator is
1cad0 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79   a set of memory
1cae0 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64   cells that hold
1caf0 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65  .** intermediate
1cb00 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63   results while c
1cb10 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67  alculating an ag
1cb20 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a  gregate.  This.*
1cb30 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79  * routine simply
1cb40 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e   stores NULLs in
1cb50 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65   all of those me
1cb60 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  mory cells..*/.s
1cb70 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74  tatic void reset
1cb80 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
1cb90 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
1cba0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
1cbb0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1cbc0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1cbd0 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
1cbe0 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b  nfo_func *pFunc;
1cbf0 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  .  if( pAggInfo-
1cc00 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d  >nFunc+pAggInfo-
1cc10 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20  >nColumn==0 ){. 
1cc20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1cc30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
1cc40 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  Info->nColumn; i
1cc50 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1cc60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cc70 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
1cc80 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
1cc90 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75  );.  }.  for(pFu
1cca0 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  nc=pAggInfo->aFu
1ccb0 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49  nc, i=0; i<pAggI
1ccc0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
1ccd0 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73   pFunc++){.    s
1cce0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ccf0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
1cd00 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20  pFunc->iMem);.  
1cd10 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69    if( pFunc->iDi
1cd20 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
1cd30 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46     Expr *pE = pF
1cd40 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  unc->pExpr;.    
1cd50 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1cd60 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
1cd70 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
1cd80 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e        if( pE->x.
1cd90 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
1cda0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  x.pList->nExpr!=
1cdb0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
1cdc0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1cdd0 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61  rse, "DISTINCT a
1cde0 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68  ggregates must h
1cdf0 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  ave exactly one 
1ce00 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72  ".           "ar
1ce10 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20  gument");.      
1ce20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
1ce30 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
1ce40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
1ce50 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1ce60 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
1ce70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
1ce80 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
1ce90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cea0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
1ceb0 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63  Ephemeral, pFunc
1cec0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20  ->iDistinct, 0, 
1ced0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1cef0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
1cf00 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
1cf10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1cf20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
1cf30 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46  voke the OP_AggF
1cf40 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66  inalize opcode f
1cf50 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61  or every aggrega
1cf60 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  te function.** i
1cf70 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  n the AggInfo st
1cf80 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
1cf90 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65  ic void finalize
1cfa0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72  AggFunctions(Par
1cfb0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
1cfc0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
1cfd0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1cfe0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1cff0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
1d000 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
1d010 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
1d020 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
1d030 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1d040 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
1d050 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1d060 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
1d070 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
1d080 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1d090 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
1d0a0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
1d0b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d0c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46  ddOp4(v, OP_AggF
1d0d0 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20  inal, pF->iMem, 
1d0e0 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
1d0f0 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20  Expr : 0, 0,.   
1d100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d110 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46     (void*)pF->pF
1d120 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
1d130 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ;.  }.}../*.** U
1d140 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75  pdate the accumu
1d150 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c  lator memory cel
1d160 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67  ls for an aggreg
1d170 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ate based on.** 
1d180 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
1d190 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
1d1a0 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61  static void upda
1d1b0 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  teAccumulator(Pa
1d1c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
1d1d0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
1d1e0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1d1f0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1d200 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
1d210 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
1d220 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1d230 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67  _col *pC;..  pAg
1d240 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
1d250 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 1;.  for(i=0
1d260 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
1d270 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
1d280 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
1d290 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ++){.    int nAr
1d2a0 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  g;.    int addrN
1d2b0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
1d2c0 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70   regAgg;.    Exp
1d2d0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
1d2e0 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
1d2f0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
1d300 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1d310 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
1d320 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
1d330 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
1d340 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d     nArg = pList-
1d350 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65  >nExpr;.      re
1d360 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65  gAgg = sqlite3Ge
1d370 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1d380 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  e, nArg);.      
1d390 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
1d3a0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1d3b0 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30  pList, regAgg, 0
1d3c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1d3d0 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20      nArg = 0;.  
1d3e0 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a      regAgg = 0;.
1d3f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
1d400 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
1d410 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
1d420 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1d430 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1d440 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
1d450 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44  1 );.      codeD
1d460 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
1d470 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
1d480 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41  ddrNext, 1, regA
1d490 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gg);.    }.    i
1d4a0 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c  f( pF->pFunc->fl
1d4b0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
1d4c0 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
1d4d0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
1d4e0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  ll = 0;.      st
1d4f0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1d500 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
1d510 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73   int j;.      as
1d520 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
1d530 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69  ;  /* pList!=0 i
1d540 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20  f pF->pFunc has 
1d550 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20  NEEDCOLL */.    
1d560 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
1d570 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
1d580 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b  l && j<nArg; j++
1d590 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1d5a0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1d5b0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1d5c0 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
1d5d0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
1d5e0 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1d5f0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
1d600 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
1d610 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
1d620 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d630 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
1d640 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
1d650 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
1d660 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
1d670 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1d680 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
1d690 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67  ggStep, 0, regAg
1d6a0 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20  g, pF->iMem,.   
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6c0 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46     (void*)pF->pF
1d6d0 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
1d6e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1d6f0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
1d700 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  )nArg);.    sqli
1d710 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
1d720 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
1d730 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73  gg, nArg);.    s
1d740 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1d750 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
1d760 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
1d770 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  rg);.    if( add
1d780 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
1d790 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1d7a0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
1d7b0 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  xt);.    }.  }. 
1d7c0 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67   for(i=0, pC=pAg
1d7d0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70  gInfo->aCol; i<p
1d7e0 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
1d7f0 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b  lator; i++, pC++
1d800 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1d810 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1d820 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d  C->pExpr, pC->iM
1d830 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49  em);.  }.  pAggI
1d840 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
1d850 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = 0;.}../*.** Ge
1d860 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1d870 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1d880 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68  ment given in th
1d890 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  e p argument.  .
1d8a0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
1d8b0 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65  s are distribute
1d8c0 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79  d in various way
1d8d0 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  s depending on t
1d8e0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  he.** contents o
1d8f0 66 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74  f the SelectDest
1d900 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
1d910 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65 6e  ed to by argumen
1d920 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66 6f  t pDest.** as fo
1d930 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
1d940 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 20 20   pDest->eDest   
1d950 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d   Result.**     -
1d960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
1d970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
1d9a0 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20 20 20    SRT_Output    
1d9b0 20 20 47 65 6e 65 72 61 74 65 20 61 20 72 6f 77    Generate a row
1d9c0 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73 69 6e   of output (usin
1d9d0 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52  g the OP_ResultR
1d9e0 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
1d9f0 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f 64 65            opcode
1da00 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69  ) for each row i
1da10 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
1da20 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1da30 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e 6c 79  Mem         Only
1da40 20 76 61 6c 69 64 20 69 66 20 74 68 65 20 72 65   valid if the re
1da50 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67 6c 65  sult is a single
1da60 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20   column..**     
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da80 53 74 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  Store the first 
1da90 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 69  column of the fi
1daa0 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77 0a 2a  rst result row.*
1dab0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1dac0 20 20 20 20 20 20 69 6e 20 72 65 67 69 73 74 65        in registe
1dad0 72 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 74  r pDest->iParm t
1dae0 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74 68 65 20  hen abandon the 
1daf0 72 65 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  rest.**         
1db00 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
1db10 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20  he query.  This 
1db20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 6d 70 6c  destination impl
1db30 69 65 73 20 22 4c 49 4d 49 54 20 31 22 2e 0a 2a  ies "LIMIT 1"..*
1db40 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74  *.**     SRT_Set
1db50 20 20 20 20 20 20 20 20 20 54 68 65 20 72 65 73           The res
1db60 75 6c 74 20 6d 75 73 74 20 62 65 20 61 20 73 69  ult must be a si
1db70 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 53 74  ngle column.  St
1db80 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20 20 20 20  ore each.**     
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dba0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 20 61 73  row of result as
1dbb0 20 74 68 65 20 6b 65 79 20 69 6e 20 74 61 62 6c   the key in tabl
1dbc0 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 20  e pDest->iParm. 
1dbd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1dbe0 20 20 20 20 20 20 20 20 41 70 70 6c 79 20 74 68          Apply th
1dbf0 65 20 61 66 66 69 6e 69 74 79 20 70 44 65 73 74  e affinity pDest
1dc00 2d 3e 61 66 66 69 6e 69 74 79 20 62 65 66 6f 72  ->affinity befor
1dc10 65 20 73 74 6f 72 69 6e 67 0a 2a 2a 20 20 20 20  e storing.**    
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc30 20 72 65 73 75 6c 74 73 2e 20 20 55 73 65 64 20   results.  Used 
1dc40 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 49 4e  to implement "IN
1dc50 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a   (SELECT ...)"..
1dc60 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e  **.**     SRT_Un
1dc70 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20  ion       Store 
1dc80 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79  results as a key
1dc90 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
1dca0 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
1dcb0 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
1dcc0 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52 65  T_Except      Re
1dcd0 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f  move results fro
1dce0 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  m the temporary 
1dcf0 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
1dd00 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
1dd10 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74  T_Table       St
1dd20 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ore results in t
1dd30 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70  emporary table p
1dd40 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 20  Dest->iParm..** 
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd60 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65      This is like
1dd70 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 65 78   SRT_EphemTab ex
1dd80 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74 61  cept that the ta
1dd90 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ble.**          
1dda0 20 20 20 20 20 20 20 20 20 20 20 69 73 20 61 73             is as
1ddb0 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61 64 79  sumed to already
1ddc0 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20   be open..**.** 
1ddd0 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62      SRT_EphemTab
1dde0 20 20 20 20 43 72 65 61 74 65 20 61 6e 20 74 65      Create an te
1ddf0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
1de00 65 73 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20 73  est->iParm and s
1de10 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  tore.**         
1de20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
1de30 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68  result there. Th
1de40 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
1de50 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20   open after.**  
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de70 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 54     returning.  T
1de80 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f  his is like SRT_
1de90 54 61 62 6c 65 20 65 78 63 65 70 74 20 74 68 61  Table except tha
1dea0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1deb0 20 20 20 20 20 20 20 20 20 74 68 69 73 20 64 65           this de
1dec0 73 74 69 6e 61 74 69 6f 6e 20 75 73 65 73 20 4f  stination uses O
1ded0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
1dee0 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 20 20 20  to create.**    
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df00 20 74 68 65 20 74 61 62 6c 65 20 66 69 72 73 74   the table first
1df10 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1df20 43 6f 72 6f 75 74 69 6e 65 20 20 20 47 65 6e 65  Coroutine   Gene
1df30 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e  rate a co-routin
1df40 65 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61  e that returns a
1df50 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a 2a 20 20   new row of.**  
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df70 20 20 20 72 65 73 75 6c 74 73 20 65 61 63 68 20     results each 
1df80 74 69 6d 65 20 69 74 20 69 73 20 69 6e 76 6f 6b  time it is invok
1df90 65 64 2e 20 20 54 68 65 20 65 6e 74 72 79 20 70  ed.  The entry p
1dfa0 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  oint.**         
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
1dfc0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73  he co-routine is
1dfd0 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
1dfe0 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ter pDest->iParm
1dff0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1e000 45 78 69 73 74 73 20 20 20 20 20 20 53 74 6f 72  Exists      Stor
1e010 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20  e a 1 in memory 
1e020 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61 72  cell pDest->iPar
1e030 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 0a  m if the result.
1e040 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1e050 20 20 20 20 20 20 20 73 65 74 20 69 73 20 6e 6f         set is no
1e060 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20  t empty..**.**  
1e070 20 20 20 53 52 54 5f 44 69 73 63 61 72 64 20 20     SRT_Discard  
1e080 20 20 20 54 68 72 6f 77 20 74 68 65 20 72 65 73     Throw the res
1e090 75 6c 74 73 20 61 77 61 79 2e 20 20 54 68 69 73  ults away.  This
1e0a0 20 69 73 20 75 73 65 64 20 62 79 20 53 45 4c 45   is used by SELE
1e0b0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  CT.**           
1e0c0 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d            statem
1e0d0 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69 67  ents within trig
1e0e0 67 65 72 73 20 77 68 6f 73 65 20 6f 6e 6c 79 20  gers whose only 
1e0f0 70 75 72 70 6f 73 65 20 69 73 0a 2a 2a 20 20 20  purpose is.**   
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e110 20 20 74 68 65 20 73 69 64 65 2d 65 66 66 65 63    the side-effec
1e120 74 73 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 2e  ts of functions.
1e130 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1e140 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
1e150 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
1e160 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
1e170 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
1e180 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
1e190 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
1e1a0 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
1e1b0 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
1e1c0 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
1e1d0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
1e1e0 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
1e1f0 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
1e200 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
1e210 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1e220 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
1e230 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e240 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
1e250 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1e260 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
1e270 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1e280 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1e290 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
1e2a0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
1e2b0 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c   coded. */.  Sel
1e2c0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
1e2d0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
1e2e0 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79  o with the query
1e2f0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
1e300 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
1e310 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1e320 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
1e330 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
1e340 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66       /* Return f
1e350 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65  rom sqlite3Where
1e360 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62  Begin() */.  Vdb
1e370 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
1e380 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
1e390 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72  al machine under
1e3a0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1e3b0 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20  .  int isAgg;   
1e3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e3d0 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
1e3e0 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
1e3f0 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
1e400 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f   *pEList;      /
1e410 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
1e420 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
1e430 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
1e440 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
1e450 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
1e460 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
1e470 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
1e480 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1e490 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
1e4a0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
1e4b0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
1e4c0 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ;    /* The ORDE
1e4d0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  R BY clause.  Ma
1e4e0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
1e4f0 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
1e500 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
1e510 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
1e520 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1e530 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
1e540 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
1e550 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
1e560 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
1e570 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20  nt isDistinct;  
1e580 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e590 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
1e5a0 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
1e5b0 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
1e5c0 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ct;          /* 
1e5d0 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72  Table to use for
1e5e0 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
1e5f0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
1e600 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
1e610 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
1e620 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
1e630 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ion */.  int add
1e640 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20  rSortIndex;     
1e650 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e  /* Address of an
1e660 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1e670 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
1e680 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49  .  AggInfo sAggI
1e690 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66  nfo;      /* Inf
1e6a0 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79  ormation used by
1e6b0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
1e6c0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  es */.  int iEnd
1e6d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1e6e0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1e6f0 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72   end of the quer
1e700 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
1e710 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
1e720 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1e730 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64  nnection */..  d
1e740 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1e750 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62    if( p==0 || db
1e760 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
1e770 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
1e780 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
1e790 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1e7a0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1e7b0 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
1e7c0 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74  , 0, 0, 0) ) ret
1e7d0 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  urn 1;.  memset(
1e7e0 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69  &sAggInfo, 0, si
1e7f0 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b  zeof(sAggInfo));
1e800 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ..  pOrderBy = p
1e810 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66  ->pOrderBy;.  if
1e820 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72  ( IgnorableOrder
1e830 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
1e840 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
1e850 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65  ;..    /* In the
1e860 73 65 20 63 61 73 65 73 20 74 68 65 20 44 49 53  se cases the DIS
1e870 54 49 4e 43 54 20 6f 70 65 72 61 74 6f 72 20 6d  TINCT operator m
1e880 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  akes no differen
1e890 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ce to the.    **
1e8a0 20 72 65 73 75 6c 74 73 2c 20 73 6f 20 72 65 6d   results, so rem
1e8b0 6f 76 65 20 69 74 20 69 66 20 69 74 20 77 65 72  ove it if it wer
1e8c0 65 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20  e specified..   
1e8d0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70   */.    assert(p
1e8e0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1e8f0 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
1e900 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
1e910 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
1e920 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
1e930 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
1e940 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
1e950 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20 70 2d  Discard);.    p-
1e960 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
1e970 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20  _Distinct;.  }. 
1e980 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
1e990 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29  ep(pParse, p, 0)
1e9a0 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
1e9b0 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
1e9c0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
1e9d0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1e9e0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1e9f0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
1ea00 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
1ea10 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
1ea20 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 73 41   pOrderBy;.  isA
1ea30 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  gg = (p->selFlag
1ea40 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
1ea50 29 21 3d 30 3b 0a 20 20 69 66 28 20 70 45 4c 69  )!=0;.  if( pELi
1ea60 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  st==0 ) goto sel
1ea70 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a  ect_end;..  /* .
1ea80 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e    ** Do not even
1ea90 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65   attempt to gene
1eaa0 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66  rate any code if
1eab0 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64 79   we have already
1eac0 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72   seen.  ** error
1ead0 73 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  s before this ro
1eae0 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20  utine starts..  
1eaf0 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
1eb00 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73  >nErr>0 ) goto s
1eb10 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
1eb20 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e   ORDER BY is ign
1eb30 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65  ored for some de
1eb40 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  stinations..  */
1eb50 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
1eb60 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
1eb70 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d  {.    pOrderBy =
1eb80 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   0;.  }..  /* Be
1eb90 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
1eba0 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ode..  */.  v = 
1ebb0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1ebc0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
1ebd0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
1ebe0 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  _end;..  /* Gene
1ebf0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
1ec00 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e  l sub-queries in
1ec10 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1ec20 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
1ec30 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1ec40 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1ec50 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1ec60 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30  _VIEW).  for(i=0
1ec70 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20  ; !p->pPrior && 
1ec80 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
1ec90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
1eca0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1ecb0 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
1ecc0 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65  st->a[i];.    Se
1ecd0 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
1ece0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
1ecf0 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
1ed00 3b 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67 53  ;.    int isAggS
1ed10 75 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 75  ub;..    if( pSu
1ed20 62 3d 3d 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69  b==0 || pItem->i
1ed30 73 50 6f 70 75 6c 61 74 65 64 20 29 20 63 6f 6e  sPopulated ) con
1ed40 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 49  tinue;..    /* I
1ed50 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e  ncrement Parse.n
1ed60 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65  Height by the he
1ed70 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67  ight of the larg
1ed80 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  est expression. 
1ed90 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72     ** tree refer
1eda0 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74  ed to by this, t
1edb0 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74  he parent select
1edc0 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65  . The child sele
1edd0 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f  ct.    ** may co
1ede0 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  ntain expression
1edf0 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73   trees of at mos
1ee00 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45  t.    ** (SQLITE
1ee10 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d  _MAX_EXPR_DEPTH-
1ee20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68  Parse.nHeight) h
1ee30 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61  eight. This is a
1ee40 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65   bit.    ** more
1ee50 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68   conservative th
1ee60 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75  an necessary, bu
1ee70 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68  t much easier th
1ee80 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20  an enforcing.   
1ee90 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d   ** an exact lim
1eea0 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  it..    */.    p
1eeb0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b  Parse->nHeight +
1eec0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
1eed0 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20  xprHeight(p);.. 
1eee0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
1eef0 65 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ee if the subque
1ef00 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62  ry can be absorb
1ef10 65 64 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ed into the pare
1ef20 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 73 41 67 67  nt. */.    isAgg
1ef30 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c  Sub = (pSub->sel
1ef40 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
1ef50 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66  gate)!=0;.    if
1ef60 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  ( flattenSubquer
1ef70 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20  y(pParse, p, i, 
1ef80 69 73 41 67 67 2c 20 69 73 41 67 67 53 75 62 29  isAgg, isAggSub)
1ef90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
1efa0 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20  AggSub ){.      
1efb0 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20    isAgg = 1;.   
1efc0 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
1efd0 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65   |= SF_Aggregate
1efe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1eff0 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  i = -1;.    }els
1f000 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1f010 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
1f020 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54  dest, SRT_EphemT
1f030 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  ab, pItem->iCurs
1f040 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  or);.      asser
1f050 74 28 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75  t( pItem->isPopu
1f060 6c 61 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  lated==0 );.    
1f070 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
1f080 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
1f090 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
1f0a0 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d  m->isPopulated =
1f0b0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
1f0c0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1f0d0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1f0e0 65 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  ed ){.      goto
1f0f0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
1f100 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e   }.    pParse->n
1f110 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65  Height -= sqlite
1f120 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
1f130 74 28 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69  t(p);.    pTabLi
1f140 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
1f150 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65    if( !Ignorable
1f160 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
1f170 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  {.      pOrderBy
1f180 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
1f190 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69      }.  }.  pELi
1f1a0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
1f1b0 23 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20  #endif.  pWhere 
1f1c0 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
1f1d0 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
1f1e0 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67  oupBy;.  pHaving
1f1f0 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
1f200 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 28 70   isDistinct = (p
1f210 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1f220 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23  Distinct)!=0;..#
1f230 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f240 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
1f250 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  CT.  /* If there
1f260 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e   is are a sequen
1f270 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64  ce of queries, d
1f280 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e  o the earlier on
1f290 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20  es first..  */. 
1f2a0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
1f2b0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69  {.    if( p->pRi
1f2c0 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20  ghtmost==0 ){.  
1f2d0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
1f2e0 70 2c 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a  p, *pRight = 0;.
1f2f0 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20        int cnt = 
1f300 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53  0;.      int mxS
1f310 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 66 6f 72  elect;.      for
1f320 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b  (pLoop=p; pLoop;
1f330 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
1f340 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20  rior, cnt++){.  
1f350 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69        pLoop->pRi
1f360 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20  ghtmost = p;.   
1f370 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78       pLoop->pNex
1f380 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
1f390 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f      pRight = pLo
1f3a0 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  op;.      }.    
1f3b0 20 20 6d 78 53 65 6c 65 63 74 20 3d 20 64 62 2d    mxSelect = db-
1f3c0 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
1f3d0 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
1f3e0 4c 45 43 54 5d 3b 0a 20 20 20 20 20 20 69 66 28  LECT];.      if(
1f3f0 20 6d 78 53 65 6c 65 63 74 20 26 26 20 63 6e 74   mxSelect && cnt
1f400 3e 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  >mxSelect ){.   
1f410 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1f420 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
1f430 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20  o many terms in 
1f440 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22  compound SELECT"
1f450 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1f460 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
1f470 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75   }.    return mu
1f480 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
1f490 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  , p, pDest);.  }
1f4a0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1f4b0 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f   writing to memo
1f4c0 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  ry or generating
1f4d0 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79   a set.  ** only
1f4e0 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
1f4f0 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a   may be output..
1f500 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1f510 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1f520 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72  Y.  if( checkFor
1f530 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
1f540 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
1f550 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Dest, pEList->nE
1f560 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  xpr) ){.    goto
1f570 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
1f580 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1f590 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 77 72 69   possible, rewri
1f5a0 74 65 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  te the query to 
1f5b0 75 73 65 20 47 52 4f 55 50 20 42 59 20 69 6e 73  use GROUP BY ins
1f5c0 74 65 61 64 20 6f 66 20 44 49 53 54 49 4e 43 54  tead of DISTINCT
1f5d0 2e 0a 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20  ..  ** GROUP BY 
1f5e0 6d 69 67 68 74 20 75 73 65 20 61 6e 20 69 6e 64  might use an ind
1f5f0 65 78 2c 20 44 49 53 54 49 4e 43 54 20 6e 65 76  ex, DISTINCT nev
1f600 65 72 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20  er does..  */.  
1f610 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1f620 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1f630 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
1f640 53 46 5f 44 69 73 74 69 6e 63 74 20 26 26 20 21  SF_Distinct && !
1f650 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  p->pGroupBy ){. 
1f660 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d     p->pGroupBy =
1f670 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1f680 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
1f690 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72 6f 75  t, 0);.    pGrou
1f6a0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
1f6b0 79 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  y;.    p->selFla
1f6c0 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e  gs &= ~SF_Distin
1f6d0 63 74 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e  ct;.    isDistin
1f6e0 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ct = 0;.  }..  /
1f6f0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
1f700 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1f710 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74  , then this sort
1f720 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d  ing.  ** index m
1f730 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e  ight end up bein
1f740 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
1f750 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a  data can be .  *
1f760 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70  * extracted in p
1f770 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  re-sorted order.
1f780 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
1f790 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a   case, then the.
1f7a0 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65    ** OP_OpenEphe
1f7b0 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
1f7c0 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  n will be change
1f7d0 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
1f7e0 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67  once.  ** we fig
1f7f0 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
1f800 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
1f810 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  s not needed.  T
1f820 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  he addrSortIndex
1f830 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69  .  ** variable i
1f840 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69  s used to facili
1f850 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65  tate that change
1f860 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
1f870 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
1f880 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
1f890 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
1f8a0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
1f8b0 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
1f8c0 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72  rBy);.    pOrder
1f8d0 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70  By->iECursor = p
1f8e0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
1f8f0 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
1f900 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74  hm[2] = addrSort
1f910 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71  Index =.      sq
1f920 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1f930 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
1f940 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f960 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
1f970 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  or, pOrderBy->nE
1f980 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20  xpr+2, 0,.      
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9a0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1f9b0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
1f9c0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
1f9d0 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74  se{.    addrSort
1f9e0 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
1f9f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
1fa00 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
1fa10 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
1fa20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
1fa30 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
1fa40 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
1fa50 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
1fa60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1fa70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
1fa80 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73  nEphemeral, pDes
1fa90 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74  t->iParm, pEList
1faa0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
1fab0 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
1fac0 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64  ter..  */.  iEnd
1fad0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1fae0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f  keLabel(v);.  co
1faf0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
1fb00 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
1fb10 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  End);..  /* Open
1fb20 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
1fb30 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
1fb40 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
1fb50 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69  */.  if( isDisti
1fb60 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  nct ){.    KeyIn
1fb70 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
1fb80 20 20 61 73 73 65 72 74 28 20 69 73 41 67 67 20    assert( isAgg 
1fb90 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 3b 0a 20  || pGroupBy );. 
1fba0 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50     distinct = pP
1fbb0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
1fbc0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
1fbd0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
1fbe0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
1fbf0 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
1fc00 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1fc10 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
1fc20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  distinct, 0, 0,.
1fc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc40 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1fc50 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
1fc60 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
1fc70 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69  }else{.    disti
1fc80 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  nct = -1;.  }.. 
1fc90 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e   /* Aggregate an
1fca0 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  d non-aggregate 
1fcb0 71 75 65 72 69 65 73 20 61 72 65 20 68 61 6e 64  queries are hand
1fcc0 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
1fcd0 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  */.  if( !isAgg 
1fce0 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
1fcf0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
1fd00 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67  se is for non-ag
1fd10 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 0a  gregate queries.
1fd20 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65      ** Begin the
1fd30 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20   database scan. 
1fd40 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f     */.    pWInfo
1fd50 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
1fd60 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
1fd70 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26  bList, pWhere, &
1fd80 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b  pOrderBy, 0, 0);
1fd90 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
1fda0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
1fdb0 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  _end;..    /* If
1fdc0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
1fdd0 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
1fde0 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
1fdf0 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
1fe00 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
1fe10 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
1fe20 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
1fe30 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
1fe40 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
1fe50 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
1fe60 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
1fe70 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  f( addrSortIndex
1fe80 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d  >=0 && pOrderBy=
1fe90 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1fea0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
1feb0 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49  oop(v, addrSortI
1fec0 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 20 20 20  ndex, 1);.      
1fed0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
1fee0 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  2] = -1;.    }..
1fef0 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
1ff00 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
1ff10 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  op.    */.    as
1ff20 73 65 72 74 28 21 69 73 44 69 73 74 69 6e 63 74  sert(!isDistinct
1ff30 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  );.    selectInn
1ff40 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
1ff50 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
1ff60 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 70 44  pOrderBy, -1, pD
1ff70 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
1ff80 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
1ff90 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e  >iContinue, pWIn
1ffa0 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
1ffb0 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
1ffc0 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
1ffd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
1ffe0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
1fff0 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
20000 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
20010 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
20020 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
20030 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  s */.    NameCon
20040 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20  text sNC;    /* 
20050 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
20060 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
20070 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  egate informatio
20080 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d  n */.    int iAM
20090 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
200a0 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
200b0 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75  s for storing cu
200c0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a  rrent GROUP BY *
200d0 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b  /.    int iBMem;
200e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
200f0 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
20100 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55  or previous GROU
20110 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
20120 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20  iUseFlag;       
20130 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68  /* Mem address h
20140 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69  olding flag indi
20150 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c  cating that at l
20160 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  east.           
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
20180 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69  one row of the i
20190 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72  nput to the aggr
201a0 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a  egator has been.
201b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201c0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
201d0 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ssed */.    int 
201e0 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20  iAbortFlag;     
201f0 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77  /* Mem address w
20200 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72  hich causes quer
20210 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74  y abort if posit
20220 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67  ive */.    int g
20230 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f  roupBySort;    /
20240 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d  * Rows come from
20250 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50   source in GROUP
20260 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20   BY order */.   
20270 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20   int addrEnd;   
20280 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
20290 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68  rocessing for th
202a0 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20  is SELECT */..  
202b0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20    /* Remove any 
202c0 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20  and all aliases 
202d0 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75  between the resu
202e0 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20  lt set and the. 
202f0 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63     ** GROUP BY c
20300 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
20310 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
20320 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20  {.      int k;  
20330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20340 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
20350 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73  unter */.      s
20360 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
20370 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20  tem *pItem;  /* 
20380 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
20390 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
203a0 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20   list */..      
203b0 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d  for(k=p->pEList-
203c0 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
203d0 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b  >pEList->a; k>0;
203e0 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
203f0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
20400 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
20410 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70   }.      for(k=p
20420 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20  GroupBy->nExpr, 
20430 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e  pItem=pGroupBy->
20440 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74  a; k>0; k--, pIt
20450 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
20460 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30  Item->iAlias = 0
20470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20480 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  . .    /* Create
20490 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70   a label to jump
204a0 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74   to when we want
204b0 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75   to abort the qu
204c0 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45  ery */.    addrE
204d0 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
204e0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
204f0 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b     /* Convert TK
20500 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e  _COLUMN nodes in
20510 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
20520 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65   and make entrie
20530 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67  s in.    ** sAgg
20540 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f  Info for all TK_
20550 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
20560 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
20570 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
20580 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
20590 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
205a0 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
205b0 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
205c0 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
205d0 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
205e0 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
205f0 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66  .    sNC.pAggInf
20600 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20  o = &sAggInfo;. 
20610 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72     sAggInfo.nSor
20620 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72  tingColumn = pGr
20630 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79  oupBy ? pGroupBy
20640 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20  ->nExpr+1 : 0;. 
20650 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f     sAggInfo.pGro
20660 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
20670 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
20680 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
20690 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  sNC, pEList);.  
206a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
206b0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
206c0 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
206d0 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
206e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
206f0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
20700 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
20710 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  );.    }.    sAg
20720 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74  gInfo.nAccumulat
20730 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43  or = sAggInfo.nC
20740 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69  olumn;.    for(i
20750 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
20760 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
20770 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
20780 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49  asProperty(sAggI
20790 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
207a0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
207b0 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
207c0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
207d0 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49  List(&sNC, sAggI
207e0 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
207f0 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
20800 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
20810 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
20820 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
20830 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69  .    /* Processi
20840 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
20850 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20  s with GROUP BY 
20860 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e  is very differen
20870 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63  t and.    ** muc
20880 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74  h more complex t
20890 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77  han aggregates w
208a0 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42  ithout a GROUP B
208b0 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  Y..    */.    if
208c0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
208d0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
208e0 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e  yInfo;  /* Keyin
208f0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
20900 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63  r the group by c
20910 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
20920 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20  nt j1;          
20930 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d     /* A-vs-B com
20940 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f  parision jump */
20950 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f  .      int addrO
20960 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74  utputRow;  /* St
20970 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e  art of subroutin
20980 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
20990 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20   result row */. 
209a0 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70       int regOutp
209b0 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75  utRow;   /* Retu
209c0 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
209d0 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73  ter for output s
209e0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  ubroutine */.   
209f0 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62     int addrSetAb
20a00 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68  ort;   /* Set th
20a10 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64  e abort flag and
20a20 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20   return */.     
20a30 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
20a40 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  op;  /* Top of t
20a50 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
20a60 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
20a70 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68  ortingIdx; /* Th
20a80 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
20a90 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69  al for the sorti
20aa0 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
20ab0 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b    int addrReset;
20ac0 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
20ad0 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e  ine for resettin
20ae0 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
20af0 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  r */.      int r
20b00 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f  egReset;       /
20b10 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
20b20 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65   register for re
20b30 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  set subroutine *
20b40 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  /..      /* If t
20b50 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20  here is a GROUP 
20b60 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67  BY clause we mig
20b70 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e  ht need a sortin
20b80 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20  g index to.     
20b90 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74   ** implement it
20ba0 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74  .  Allocate that
20bb0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e   sorting index n
20bc0 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73  ow.  If it turns
20bd0 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   out.      ** th
20be0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  at we do not nee
20bf0 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20  d it after all, 
20c00 74 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  the OpenEphemera
20c10 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20  l instruction.  
20c20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63      ** will be c
20c30 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
20c40 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f  Noop.  .      */
20c50 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  .      sAggInfo.
20c60 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61  sortingIdx = pPa
20c70 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
20c80 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
20c90 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
20ca0 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
20cb0 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53  By);.      addrS
20cc0 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69  ortingIdx = sqli
20cd0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
20ce0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
20cf0 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 41  l, .          sA
20d00 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
20d10 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72  x, sAggInfo.nSor
20d20 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20  tingColumn, .   
20d30 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a         0, (char*
20d40 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
20d50 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
20d60 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
20d70 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
20d80 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
20d90 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
20da0 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
20db0 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
20dc0 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
20dd0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f  nMem;.      iAbo
20de0 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  rtFlag = ++pPars
20df0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
20e00 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b  egOutputRow = ++
20e10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
20e20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
20e30 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  w = sqlite3VdbeM
20e40 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
20e50 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b     regReset = ++
20e60 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
20e70 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20      addrReset = 
20e80 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
20e90 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
20ea0 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
20eb0 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
20ec0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
20ed0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
20ee0 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
20ef0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
20f00 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
20f10 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
20f20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
20f30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20f40 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
20f50 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
20f60 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
20f70 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74  (v, "clear abort
20f80 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
20f90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20fa0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
20fb0 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
20fc0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
20fd0 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61  ((v, "indicate a
20fe0 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
20ff0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42  "));..      /* B
21000 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74  egin a loop that
21010 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c   will extract al
21020 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e  l source rows in
21030 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e   GROUP BY order.
21040 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d  .      ** This m
21050 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f  ight involve two
21060 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20   separate loops 
21070 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20  with an OP_Sort 
21080 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20  in between, or. 
21090 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
210a0 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f   be a single loo
210b0 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69  p that uses an i
210c0 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20  ndex to extract 
210d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20  information.    
210e0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68    ** in the righ
210f0 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e  t order to begin
21100 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   with..      */.
21110 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21120 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
21130 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61  sub, regReset, a
21140 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
21150 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
21160 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
21170 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
21180 68 65 72 65 2c 20 26 70 47 72 6f 75 70 42 79 2c  here, &pGroupBy,
21190 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
211a0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
211b0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
211c0 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42       if( pGroupB
211d0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
211e0 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
211f0 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
21200 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
21210 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
21220 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
21230 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
21240 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
21250 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
21260 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
21270 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
21280 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
21290 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
212a0 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
212b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72    */.        pGr
212c0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
212d0 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f  pBy;.        gro
212e0 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
212f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21300 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
21310 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
21320 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
21330 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
21340 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
21350 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
21360 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
21370 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
21380 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
21390 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
213a0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
213b0 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
213c0 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
213d0 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
213e0 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
213f0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
21400 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
21410 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
21420 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
21430 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
21440 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
21450 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
21460 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42  .        nGroupB
21470 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y = pGroupBy->nE
21480 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  xpr;.        nCo
21490 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20 31  l = nGroupBy + 1
214a0 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
214b0 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20  roupBy+1;.      
214c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
214d0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
214e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
214f0 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  f( sAggInfo.aCol
21500 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  [i].iSorterColum
21510 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
21520 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
21530 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
21540 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21550 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61   }.        regBa
21560 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
21570 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
21580 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
21590 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
215a0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
215b0 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73  pGroupBy, regBas
215c0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
215d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
215e0 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
215f0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
21600 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72  gIdx,regBase+nGr
21610 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20  oupBy);.        
21620 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a  j = nGroupBy+1;.
21630 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
21640 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
21650 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
21660 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
21670 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
21680 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
21690 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
216a0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
216b0 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
216c0 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
216d0 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
216e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b           int r2;
216f0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32  ..            r2
21700 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
21710 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
21720 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
21730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21740 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
21750 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
21760 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c  Col->iTable, r1,
21770 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
21780 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20   if( r1!=r2 ){. 
21790 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
217a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
217b0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20  , OP_SCopy, r2, 
217c0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
217d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a   }.            j
217e0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
217f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21800 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
21810 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
21820 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
21830 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21840 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
21850 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  ord, regBase, nC
21860 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
21870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
21880 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21890 49 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49  IdxInsert, sAggI
218a0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
218b0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
218c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
218d0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
218e0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
218f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
21900 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
21910 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
21920 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
21930 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
21940 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
21950 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21960 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67  (v, OP_Sort, sAg
21970 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
21980 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
21990 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
219a0 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f  (v, "GROUP BY so
219b0 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73  rt"));.        s
219c0 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69  AggInfo.useSorti
219d0 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20  ngIdx = 1;.     
219e0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61   }..      /* Eva
219f0 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e  luate the curren
21a00 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
21a10 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30   and store in b0
21a20 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20  , b1, b2....    
21a30 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f    ** (b0 is memo
21a40 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65  ry location iBMe
21a50 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d  m+0, b1 is iBMem
21a60 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  +1, and so forth
21a70 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  ).      ** Then 
21a80 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72  compare the curr
21a90 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
21aa0 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47  ms against the G
21ab0 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20  ROUP BY terms.  
21ac0 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
21ad0 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72  previous row cur
21ae0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
21af0 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20   a0, a1, a2.... 
21b00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
21b10 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71  drTopOfLoop = sq
21b20 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
21b30 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66  Addr(v);.      f
21b40 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
21b50 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
21b60 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f  .        if( gro
21b70 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
21b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21b90 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
21ba0 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73  lumn, sAggInfo.s
21bb0 6f 72 74 69 6e 67 49 64 78 2c 20 6a 2c 20 69 42  ortingIdx, j, iB
21bc0 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
21bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21be0 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74   sAggInfo.direct
21bf0 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Mode = 1;.      
21c00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21c10 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
21c20 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  upBy->a[j].pExpr
21c30 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
21c40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21c50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21c60 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
21c70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65  are, iAMem, iBMe
21c80 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
21c90 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
21cb0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
21cc0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
21cd0 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
21ce0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
21cf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21d00 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
21d10 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a  Jump, j1+1, 0, j
21d20 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  1+1);..      /* 
21d30 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
21d40 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72  at runs whenever
21d50 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68   the GROUP BY ch
21d60 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  anges..      ** 
21d70 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47  Changes in the G
21d80 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65  ROUP BY are dete
21d90 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76  cted by the prev
21da0 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20  ious code.      
21db0 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68  ** block.  If th
21dc0 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e  ere were no chan
21dd0 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20  ges, this block 
21de0 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20  is skipped..    
21df0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
21e00 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63  is code copies c
21e10 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20  urrent group by 
21e20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62  terms in b0,b1,b
21e30 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f  2,....      ** o
21e40 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e  ver to a0,a1,a2.
21e50 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20    It then calls 
21e60 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
21e70 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61  utine.      ** a
21e80 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67  nd resets the ag
21e90 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
21ea0 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e  tor registers in
21eb0 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20   preparation.   
21ec0 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65     ** for the ne
21ed0 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63  xt GROUP BY batc
21ee0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
21ef0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
21f00 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42  eMove(pParse, iB
21f10 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f  Mem, iAMem, pGro
21f20 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  upBy->nExpr);.  
21f30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21f40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
21f50 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
21f60 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
21f70 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
21f80 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f  nt((v, "output o
21f90 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20  ne row"));.     
21fa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21fb0 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
21fc0 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72  iAbortFlag, addr
21fd0 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65  End);.      Vdbe
21fe0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65  Comment((v, "che
21ff0 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ck abort flag"))
22000 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22010 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22020 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c  Gosub, regReset,
22030 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
22040 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
22050 76 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75  v, "reset accumu
22060 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
22070 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
22080 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
22090 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74  ators based on t
220a0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20  he content of.  
220b0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
220c0 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a  nt row.      */.
220d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
220e0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
220f0 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63  ;.      updateAc
22100 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
22110 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
22120 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22130 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
22140 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67  ger, 1, iUseFlag
22150 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
22160 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
22170 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d  te data in accum
22180 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
22190 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    /* End of the 
221a0 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20  loop.      */.  
221b0 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
221c0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
221d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
221e0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67  (v, OP_Next, sAg
221f0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
22200 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29  , addrTopOfLoop)
22210 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22220 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
22230 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
22240 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22250 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
22260 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  v, addrSortingId
22270 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  x, 1);.      }..
22280 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
22290 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66  the final row of
222a0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f   result.      */
222b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
222c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
222d0 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
222e0 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
222f0 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
22300 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
22310 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a  t final row"));.
22320 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f  .      /* Jump o
22330 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69  ver the subrouti
22340 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nes.      */.   
22350 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22360 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
22370 20 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20   0, addrEnd);.. 
22380 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
22390 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
223a0 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e  at outputs a sin
223b0 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
223c0 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
223d0 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75  et.  This subrou
223e0 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73  tine first looks
223f0 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67   at the iUseFlag
22400 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20  .  If iUseFlag. 
22410 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20       ** is less 
22420 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
22430 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f   zero, the subro
22440 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
22450 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74  .  If.      ** t
22460 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61  he processing ca
22470 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72  lls for the quer
22480 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73  y to abort, this
22490 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
224a0 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20    ** increments 
224b0 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d  the iAbortFlag m
224c0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62  emory location b
224d0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
224e0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
224f0 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20  r to signal the 
22500 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e  caller to abort.
22510 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22520 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73  addrSetAbort = s
22530 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
22540 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
22550 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22560 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
22570 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
22580 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
22590 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72  nt((v, "set abor
225a0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
225b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
225c0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
225d0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
225e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
225f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
22600 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
22610 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
22620 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
22630 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
22640 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22650 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22660 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c  IfPos, iUseFlag,
22670 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32   addrOutputRow+2
22680 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
22690 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62  ment((v, "Groupb
226a0 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
226b0 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29  or entry point")
226c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
226d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
226e0 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
226f0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69  utRow);.      fi
22700 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
22710 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
22720 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
22730 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
22740 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
22750 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
22760 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70  Having, addrOutp
22770 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f  utRow+1, SQLITE_
22780 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
22790 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63     }.      selec
227a0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
227b0 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
227c0 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
227d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
227e0 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c         distinct,
227f0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
22810 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
22820 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20  ddrSetAbort);.  
22830 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22840 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
22850 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
22860 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
22870 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72  ment((v, "end gr
22880 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
22890 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
228a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
228b0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
228c0 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
228d0 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
228e0 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
228f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
22900 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
22910 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
22920 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
22930 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
22940 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
22950 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
22960 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
22970 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  set);.     .    
22980 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75  } /* endif pGrou
22990 70 42 79 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  pBy */.    else 
229a0 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
229b0 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e   *pDel = 0;.#ifn
229c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
229d0 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20  BTREECOUNT.     
229e0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
229f0 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20      if( (pTab = 
22a00 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c  isSimpleCount(p,
22a10 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20   &sAggInfo))!=0 
22a20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
22a30 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29   isSimpleCount()
22a40 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
22a50 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74  er to a Table st
22a60 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20  ructure, then.  
22a70 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
22a80 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66   statement is of
22a90 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20   the form:.     
22aa0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
22ab0 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
22ac0 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20  *) FROM <tbl>.  
22ad0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
22ae0 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54 61   ** where the Ta
22af0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 72 65  ble structure re
22b00 74 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74  turned represent
22b10 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20  s table <tbl>.. 
22b20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
22b30 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d    ** This statem
22b40 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e  ent is so common
22b50 20 74 68 61 74 20 69 74 20 69 73 20 6f 70 74 69   that it is opti
22b60 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e  mized specially.
22b70 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
22b80 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63  OP_Count instruc
22b90 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64  tion is executed
22ba0 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69   either on the i
22bb0 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74  ntkey table that
22bc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
22bd0 61 69 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f  ains the data fo
22be0 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72  r table <tbl> or
22bf0 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69   on one of its i
22c00 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20  ndexes. It.     
22c10 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20     ** is better 
22c20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 6f  to execute the o
22c30 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61  p on an index, a
22c40 73 20 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c  s indexes are al
22c50 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  most.        ** 
22c60 61 6c 77 61 79 73 20 73 70 72 65 61 64 20 61 63  always spread ac
22c70 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73 20  ross less pages 
22c80 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65  than their corre
22c90 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e  sponding tables.
22ca0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
22cb0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
22cc0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
22cd0 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
22ce0 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
22cf0 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ma);.        con
22d00 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50  st int iCsr = pP
22d10 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
22d20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73    /* Cursor to s
22d30 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  can b-tree */.  
22d40 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
22d50 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
22d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
22d70 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
22d80 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  */.        KeyIn
22d90 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30  fo *pKeyInfo = 0
22da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22db0 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73  /* Keyinfo for s
22dc0 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a  canned index */.
22dd0 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
22de0 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Best = 0;       
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22e00 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64  Best index found
22e10 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
22e20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70     int iRoot = p
22e30 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20  Tab->tnum;      
22e40 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
22e50 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20  page of scanned 
22e60 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20  b-tree */..     
22e70 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
22e80 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
22e90 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  e, iDb);.       
22ea0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
22eb0 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
22ec0 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
22ed0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  ab->zName);..   
22ee0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
22ef0 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  or the index tha
22f00 74 20 68 61 73 20 74 68 65 20 6c 65 61 73 74 20  t has the least 
22f10 61 6d 6f 75 6e 74 20 6f 66 20 63 6f 6c 75 6d 6e  amount of column
22f20 73 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a  s. If.        **
22f30 20 74 68 65 72 65 20 69 73 20 73 75 63 68 20 61   there is such a
22f40 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 74 20  n index, and it 
22f50 68 61 73 20 6c 65 73 73 20 63 6f 6c 75 6d 6e 73  has less columns
22f60 20 74 68 61 6e 20 74 68 65 20 74 61 62 6c 65 0a   than the table.
22f70 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 2c          ** does,
22f80 20 74 68 65 6e 20 77 65 20 63 61 6e 20 61 73 73   then we can ass
22f90 75 6d 65 20 74 68 61 74 20 69 74 20 63 6f 6e 73  ume that it cons
22fa0 75 6d 65 73 20 6c 65 73 73 20 73 70 61 63 65 20  umes less space 
22fb0 6f 6e 20 64 69 73 6b 20 61 6e 64 0a 20 20 20 20  on disk and.    
22fc0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 74 68 65 72      ** will ther
22fd0 65 66 6f 72 65 20 62 65 20 63 68 65 61 70 65 72  efore be cheaper
22fe0 20 74 6f 20 73 63 61 6e 20 74 6f 20 64 65 74 65   to scan to dete
22ff0 72 6d 69 6e 65 20 74 68 65 20 71 75 65 72 79 20  rmine the query 
23000 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20  result..        
23010 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
23020 73 65 74 20 69 52 6f 6f 74 20 74 6f 20 74 68 65  set iRoot to the
23030 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
23040 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62  r of the index b
23050 2d 74 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a  -tree.        **
23060 20 61 6e 64 20 70 4b 65 79 49 6e 66 6f 20 74 6f   and pKeyInfo to
23070 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
23080 75 63 74 75 72 65 20 72 65 71 75 69 72 65 64 20  ucture required 
23090 74 6f 20 6e 61 76 69 67 61 74 65 20 74 68 65 0a  to navigate the.
230a0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
230b0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
230c0 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74       ** In pract
230d0 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ice the KeyInfo 
230e0 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e  structure will n
230f0 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69  ot be used. It i
23100 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20  s only .        
23110 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65  ** passed to kee
23120 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61  p OP_OpenRead ha
23130 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ppy..        */.
23140 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
23150 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
23160 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
23170 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
23180 20 20 69 66 28 20 21 70 42 65 73 74 20 7c 7c 20    if( !pBest || 
23190 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 42  pIdx->nColumn<pB
231a0 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  est->nColumn ){.
231b0 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73              pBes
231c0 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  t = pIdx;.      
231d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
231e0 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73          if( pBes
231f0 74 20 26 26 20 70 42 65 73 74 2d 3e 6e 43 6f 6c  t && pBest->nCol
23200 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  umn<pTab->nCol )
23210 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f  {.          iRoo
23220 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b  t = pBest->tnum;
23230 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49  .          pKeyI
23240 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  nfo = sqlite3Ind
23250 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
23260 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
23270 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
23280 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Open a read-only
23290 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65   cursor, execute
232a0 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63   the OP_Count, c
232b0 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e  lose the cursor.
232c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
232d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
232e0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43   OP_OpenRead, iC
232f0 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 29 3b  sr, iRoot, iDb);
23300 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
23310 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
23320 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
23330 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
23340 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  har *)pKeyInfo, 
23350 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
23360 46 46 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  FF);.        }. 
23370 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23380 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
23390 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67  ount, iCsr, sAgg
233a0 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d  Info.aFunc[0].iM
233b0 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
233c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
233d0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72  , OP_Close, iCsr
233e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
233f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
23400 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20  OMIT_BTREECOUNT 
23410 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
23420 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
23430 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f  he query is of o
23440 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
23450 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20  ing forms:.     
23460 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
23470 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29     SELECT min(x)
23480 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
23490 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61    **   SELECT ma
234a0 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  x(x) FROM ....  
234b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
234c0 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68   ** If it is, th
234d0 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20  en ask the code 
234e0 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74  in where.c to at
234f0 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65  tempt to sort re
23500 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  sults.        **
23510 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73   as if there was
23520 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22   an "ORDER ON x"
23530 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20   or "ORDER ON x 
23540 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20  DESC" clause. . 
23550 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65         ** If whe
23560 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20  re.c is able to 
23570 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20  produce results 
23580 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f  sorted in this o
23590 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20  rder, then.     
235a0 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63     ** add vdbe c
235b0 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ode to break out
235c0 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69   of the processi
235d0 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68  ng loop after th
235e0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  e .        ** fi
235f0 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73  rst iteration (s
23600 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69  ince the first i
23610 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
23620 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20  loop is .       
23630 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
23640 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
23650 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69   row with the mi
23660 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d  nimum or maximum
23670 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c   .        ** val
23680 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c  ue of x, the onl
23690 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e  y row required).
236a0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
236b0 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c      ** A special
236c0 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61   flag must be pa
236d0 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
236e0 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73  hereBegin() to s
236f0 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20  lightly.        
23700 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69  ** modify behavi
23710 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  our as follows:.
23720 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
23730 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65     **   + If the
23740 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c   query is a "SEL
23750 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65  ECT min(x)", the
23760 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64  n the loop coded
23770 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   by.        **  
23780 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c     where.c shoul
23790 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76  d not iterate ov
237a0 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69  er any values wi
237b0 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a  th a NULL value.
237c0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66          **     f
237d0 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  or x..        **
237e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
237f0 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f  The optimizer co
23800 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74  de in where.c (t
23810 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65  he thing that de
23820 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20  cides which.    
23830 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78      **     index
23840 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75   or indices to u
23850 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65  se) should place
23860 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69   a different pri
23870 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20  ority on .      
23880 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79    **     satisfy
23890 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42  ing the 'ORDER B
238a0 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69  Y' clause than i
238b0 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20  t does in other 
238c0 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  cases..        *
238d0 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63  *     Refer to c
238e0 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ode and comments
238f0 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20   in where.c for 
23900 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20  details..       
23910 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
23920 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20  List *pMinMax = 
23930 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c  0;.        u8 fl
23940 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79  ag = minMaxQuery
23950 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
23960 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20   flag ){.       
23970 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
23980 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70  HasProperty(p->p
23990 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
239a0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
239b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   );.          pM
239c0 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45  inMax = sqlite3E
239d0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
239e0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
239f0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 30 29  Expr->x.pList,0)
23a00 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c  ;.          pDel
23a10 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20   = pMinMax;.    
23a20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61        if( pMinMa
23a30 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  x && !db->malloc
23a40 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
23a50 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
23a60 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
23a70 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45  flag!=WHERE_ORDE
23a80 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20  RBY_MIN ?1:0;.  
23a90 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
23aa0 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  x->a[0].pExpr->o
23ab0 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
23ac0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23ad0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
23ae0 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e  /* This case run
23af0 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61  s if the aggrega
23b00 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20  te has no GROUP 
23b10 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
23b20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
23b30 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69  ssing is much si
23b40 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72  mpler since ther
23b50 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e is only a sing
23b60 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a  le row.        *
23b70 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20  * of output..   
23b80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23b90 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
23ba0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
23bb0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49  fo);.        pWI
23bc0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
23bd0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
23be0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
23bf0 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 66 6c 61 67  , &pMinMax, flag
23c00 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
23c10 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  ( pWInfo==0 ){. 
23c20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23c30 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
23c40 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20  b, pDel);.      
23c50 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
23c60 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
23c70 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63         updateAcc
23c80 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
23c90 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
23ca0 20 20 20 20 20 69 66 28 20 21 70 4d 69 6e 4d 61       if( !pMinMa
23cb0 78 20 26 26 20 66 6c 61 67 20 29 7b 0a 20 20 20  x && flag ){.   
23cc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23cd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
23ce0 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e  oto, 0, pWInfo->
23cf0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
23d00 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
23d10 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65  v, "%s() by inde
23d20 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
23d30 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45      (flag==WHERE
23d40 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69  _ORDERBY_MIN?"mi
23d50 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20  n":"max")));.   
23d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
23d70 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
23d80 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
23d90 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
23da0 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
23db0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d  ggInfo);.      }
23dc0 0a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ..      pOrderBy
23dd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
23de0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
23df0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
23e00 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
23e10 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20  aving, addrEnd, 
23e20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
23e30 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  L);.      }.    
23e40 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
23e50 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
23e60 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  pEList, 0, 0, 0,
23e70 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20   -1, .          
23e80 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
23e90 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72  t, addrEnd, addr
23ea0 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  End);.      sqli
23eb0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
23ec0 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
23ed0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
23ee0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
23ef0 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
23f00 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67  .  } /* endif ag
23f10 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
23f20 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
23f30 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
23f40 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
23f50 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
23f60 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
23f70 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
23f80 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
23f90 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
23fa0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
23fb0 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
23fc0 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c  il(pParse, p, v,
23fd0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
23fe0 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pDest);.  }..  /
23ff0 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
24000 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20  kip this query. 
24010 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
24020 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
24030 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68   iEnd);..  /* Th
24040 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63  e SELECT was suc
24050 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e  cessfully coded.
24060 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72     Set the retur
24070 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a  n code to 0.  **
24080 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20   to indicate no 
24090 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72  errors..  */.  r
240a0 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  c = 0;..  /* Con
240b0 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
240c0 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
240d0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
240e0 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
240f0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
24100 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
24110 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
24120 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  nd:..  /* Identi
24130 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
24140 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  if results of th
24150 65 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20  e SELECT are to 
24160 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
24170 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24180 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44  _OK && pDest->eD
24190 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
241a0 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
241b0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
241c0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
241d0 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  ist);.  }..  sql
241e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73  ite3DbFree(db, s
241f0 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20  AggInfo.aCol);. 
24200 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24210 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  b, sAggInfo.aFun
24220 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  c);.  return rc;
24230 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
24240 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
24250 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
24260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
242a0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
242b0 67 20 63 6f 64 65 20 69 73 20 75 73 65 64 20 66  g code is used f
242c0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
242d0 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20  ebugging only.  
242e0 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74  The code.** that
242f0 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f   follows does no
24300 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d  t appear in norm
24310 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a  al builds..**.**
24320 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
24330 61 72 65 20 75 73 65 64 20 74 6f 20 70 72 69 6e  are used to prin
24340 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  t out the conten
24350 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72 74  t of all or part
24360 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73 65 20   of a .** parse 
24370 73 74 72 75 63 74 75 72 65 73 20 73 75 63 68 20  structures such 
24380 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45 78 70  as Select or Exp
24390 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74 6f 75  r.  Such printou
243a0 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a  ts are useful.**
243b0 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f 20   for helping to 
243c0 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61 74 20  understand what 
243d0 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 73  is happening ins
243e0 69 64 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e  ide the code gen
243f0 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67  erator.** during
24400 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f   the execution o
24410 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54  f complex SELECT
24420 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
24430 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
24440 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20   are not called 
24450 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20 77 69  anywhere from wi
24460 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a  thin the normal.
24470 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20 20 54  ** code base.  T
24480 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64 65 64  hen are intended
24490 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 72   to be called fr
244a0 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64 65  om within the de
244b0 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f  bugger.** or fro
244c0 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70 72 69  m temporary "pri
244d0 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74 73 20  ntf" statements 
244e0 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64 65 62  inserted for deb
244f0 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  ugging..*/.void 
24500 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
24510 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
24520 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70   p->token.z && p
24530 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20  ->token.n>0 ){. 
24540 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24550 72 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c 20 70  rintf("(%.*s", p
24560 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f  ->token.n, p->to
24570 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  ken.z);.  }else{
24580 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
24590 67 50 72 69 6e 74 66 28 22 28 25 64 22 2c 20 70  gPrintf("(%d", p
245a0 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->op);.  }.  if(
245b0 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20   p->pLeft ){.   
245c0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
245d0 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71  ntf(" ");.    sq
245e0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
245f0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20  ->pLeft);.  }.  
24600 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b  if( p->pRight ){
24610 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
24620 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20  gPrintf(" ");.  
24630 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
24640 70 72 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  pr(p->pRight);. 
24650 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
24660 67 50 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a  gPrintf(")");.}.
24670 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e  void sqlite3Prin
24680 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  tExprList(ExprLi
24690 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
246a0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
246b0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
246c0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
246d0 33 50 72 69 6e 74 45 78 70 72 28 70 4c 69 73 74  3PrintExpr(pList
246e0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
246f0 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e     if( i<pList->
24700 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20  nExpr-1 ){.     
24710 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24720 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d  ntf(", ");.    }
24730 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
24740 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28 53  te3PrintSelect(S
24750 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e  elect *p, int in
24760 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  dent){.  sqlite3
24770 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
24780 53 45 4c 45 43 54 28 25 70 29 20 22 2c 20 69 6e  SELECT(%p) ", in
24790 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20  dent, "", p);.  
247a0 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
247b0 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b  List(p->pEList);
247c0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
247d0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69  rintf("\n");.  i
247e0 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20  f( p->pSrc ){.  
247f0 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 3b    char *zPrefix;
24800 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
24810 7a 50 72 65 66 69 78 20 3d 20 22 46 52 4f 4d 22  zPrefix = "FROM"
24820 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
24830 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20  <p->pSrc->nSrc; 
24840 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
24850 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
24860 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72  *pItem = &p->pSr
24870 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73  c->a[i];.      s
24880 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24890 66 28 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74  f("%*s ", indent
248a0 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20 20  +6, zPrefix);.  
248b0 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 22      zPrefix = ""
248c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
248d0 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
248e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
248f0 75 67 50 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b  ugPrintf("(\n");
24900 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24910 50 72 69 6e 74 53 65 6c 65 63 74 28 70 49 74 65  PrintSelect(pIte
24920 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64 65  m->pSelect, inde
24930 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20 20 20 20  nt+10);.        
24940 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24950 74 66 28 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e  tf("%*s)", inden
24960 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  t+8, "");.      
24970 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d  }else if( pItem-
24980 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
24990 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
249a0 69 6e 74 66 28 22 25 73 22 2c 20 70 49 74 65 6d  intf("%s", pItem
249b0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
249c0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
249d0 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20  m->pTab ){.     
249e0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
249f0 72 69 6e 74 66 28 22 28 74 61 62 6c 65 3a 20 25  rintf("(table: %
24a00 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  s)", pItem->pTab
24a10 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
24a20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
24a30 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
24a40 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24a50 67 50 72 69 6e 74 66 28 22 20 41 53 20 25 73 22  gPrintf(" AS %s"
24a60 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
24a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24a80 69 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  if( i<p->pSrc->n
24a90 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Src-1 ){.       
24aa0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24ab0 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20 20 20 20  ntf(",");.      
24ac0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
24ad0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
24ae0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
24af0 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  ( p->pWhere ){. 
24b00 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24b10 72 69 6e 74 66 28 22 25 2a 73 20 57 48 45 52 45  rintf("%*s WHERE
24b20 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b   ", indent, "");
24b30 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
24b40 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 29  tExpr(p->pWhere)
24b50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
24b60 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
24b70 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72    }.  if( p->pGr
24b80 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  oupBy ){.    sql
24b90 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24ba0 22 25 2a 73 20 47 52 4f 55 50 20 42 59 20 22 2c  "%*s GROUP BY ",
24bb0 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
24bc0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
24bd0 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
24be0 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
24bf0 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
24c00 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
24c10 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73  pHaving ){.    s
24c20 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24c30 66 28 22 25 2a 73 20 48 41 56 49 4e 47 20 22 2c  f("%*s HAVING ",
24c40 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
24c50 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
24c60 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  pr(p->pHaving);.
24c70 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24c80 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
24c90 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
24ca0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
24cb0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
24cc0 2a 73 20 4f 52 44 45 52 20 42 59 20 22 2c 20 69  *s ORDER BY ", i
24cd0 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20  ndent, "");.    
24ce0 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
24cf0 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
24d00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
24d10 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
24d20 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66  .  }.}./* End of
24d30 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64   the structure d
24d40 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f  ebug printing co
24d50 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  de.*************
24d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24da0 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  /.#endif /* defi
24db0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
24dc0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
24dd0 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a           TE_DEBUG) */.