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

Artifact 35225756c247484f473678e5bd191d70a6e4dba0:


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 38  select.c,v 1.508
0200: 20 32 30 30 39 2f 30 34 2f 31 36 20 30 30 3a 32   2009/04/16 00:2
0210: 34 3a 32 34 20 64 72 68 20 45 78 70 20 24 0a 2a  4:24 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 64 65 6e 74 69 66 69 65 72 73 20 69 6e  l identifiers in
a040: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73   the SELECT.** s
a050: 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f  tatement be reso
a060: 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lved..*/.static 
a070: 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 43 6f  void selectAddCo
a080: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
a090: 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  tion(.  Parse *p
a0a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
a0b0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
a0c0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c  s */.  int nCol,
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a0e0: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
a0f0: 73 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  s */.  Column *a
a100: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Col,         /* 
a110: 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
a120: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
a130: 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45  lect       /* SE
a140: 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74  LECT used to det
a150: 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64  ermine types and
a160: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29   collations */.)
a170: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
a180: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
a190: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
a1a0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
a1b0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
a1c0: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  l;.  int i;.  Ex
a1d0: 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20  pr *p;.  struct 
a1e0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
a1f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
a200: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  lect!=0 );.  ass
a210: 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73  ert( (pSelect->s
a220: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
a230: 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61  olved)!=0 );.  a
a240: 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 70 53 65  ssert( nCol==pSe
a250: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
a260: 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
a270: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
a280: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a290: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  d ) return;.  me
a2a0: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
a2b0: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
a2c0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  C.pSrcList = pSe
a2d0: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20  lect->pSrc;.  a 
a2e0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
a2f0: 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  t->a;.  for(i=0,
a300: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43   pCol=aCol; i<nC
a310: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
a320: 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70  {.    p = a[i].p
a330: 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Expr;.    pCol->
a340: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44  zType = sqlite3D
a350: 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75  bStrDup(db, colu
a360: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
a370: 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70  0, 0, 0));.    p
a380: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
a390: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
a3a0: 69 74 79 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c  ity(p);.    pCol
a3b0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
a3c0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
a3d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
a3e0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e   ){.      pCol->
a3f0: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44  zColl = sqlite3D
a400: 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c  bStrDup(db, pCol
a410: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
a420: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
a430: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
a440: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
a450: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
a460: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
a470: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
a480: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
a490: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
a4a0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
a4b0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
a4c0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
a4d0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
a4e0: 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
a4f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
a500: 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c  b;.  int savedFl
a510: 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61  ags;..  savedFla
a520: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
a530: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
a540: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
a550: 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  mes;.  db->flags
a560: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
a570: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69  ColNames;.  sqli
a580: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
a590: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
a5a0: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
a5b0: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
a5c0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
a5d0: 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
a5e0: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
a5f0: 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c  pPrior;.  db->fl
a600: 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73  ags = savedFlags
a610: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
a620: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
a630: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
a640: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
a650: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a660: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 64  0;.  }.  pTab->d
a670: 62 4d 65 6d 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  bMem = db->looka
a680: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3f 20  side.bEnabled ? 
a690: 64 62 20 3a 20 30 3b 0a 20 20 70 54 61 62 2d 3e  db : 0;.  pTab->
a6a0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  nRef = 1;.  pTab
a6b0: 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 73  ->zName = 0;.  s
a6c0: 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d  electColumnsFrom
a6d0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
a6e0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
a6f0: 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
a700: 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73  pTab->aCol);.  s
a710: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
a720: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
a730: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f  Parse, pTab->nCo
a740: 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70  l, pTab->aCol, p
a750: 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d  Select);.  pTab-
a760: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69  >iPKey = -1;.  i
a770: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
a780: 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
a790: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 54  e3DeleteTable(pT
a7a0: 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ab);.    return 
a7b0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
a7c0: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pTab;.}../*.** G
a7d0: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
a7e0: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
a7f0: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
a800: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
a810: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
a820: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
a830: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
a840: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
a850: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
a860: 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
a870: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
a880: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
a890: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
a8a0: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
a8b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
a8c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72   = sqlite3VdbeCr
a8d0: 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29  eate(pParse->db)
a8e0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
a8f0: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20  _OMIT_TRACE.    
a900: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20 73  if( v ){.      s
a910: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
a920: 28 76 2c 20 4f 50 5f 54 72 61 63 65 29 3b 0a 20  (v, OP_Trace);. 
a930: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
a940: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a    return v;.}...
a950: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
a960: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
a970: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
a980: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
a990: 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
a9a0: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70   and pOffset exp
a9b0: 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69  ressions.  pLimi
a9c0: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f  t and pOffset ho
a9d0: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
a9e0: 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
a9f0: 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
aa00: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
aa10: 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
aa20: 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
aa30: 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
aa40: 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
aa50: 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
aa60: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
aa70: 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
aa80: 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
aa90: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
aaa0: 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
aab0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
aac0: 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
aad0: 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
aae0: 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
aaf0: 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
ab00: 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
ab10: 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
ab20: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
ab30: 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
ab40: 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
ab50: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
ab60: 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
ab70: 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
ab80: 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
ab90: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20  it and pOffset. 
aba0: 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
abb0: 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
abc0: 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
abd0: 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
abe0: 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20  fault values.** 
abf0: 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74  (usually but not
ac00: 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f   always -1) prio
ac10: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
ac20: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e  s routine..** On
ac30: 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20  ly if pLimit!=0 
ac40: 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f  or pOffset!=0 do
ac50: 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
ac60: 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65  ters get.** rede
ac70: 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f  fined.  The UNIO
ac80: 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75  N ALL operator u
ac90: 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74  ses this propert
aca0: 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68  y to force.** th
acb0: 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73  e reuse of the s
acc0: 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  ame limit and of
acd0: 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61  fset registers a
ace0: 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a  cross multiple.*
acf0: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
ad00: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
ad10: 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  oid computeLimit
ad20: 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20  Registers(Parse 
ad30: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
ad40: 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b  *p, int iBreak){
ad50: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a  .  Vdbe *v = 0;.
ad60: 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30    int iLimit = 0
ad70: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b  ;.  int iOffset;
ad80: 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20  .  int addr1;.  
ad90: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
ada0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
adb0: 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
adc0: 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
add0: 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
ade0: 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61  some.  ** contra
adf0: 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
ae00: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
ae10: 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
ae20: 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
ae30: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
ae40: 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
ae50: 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
ae60: 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
ae70: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
ae80: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   ){.    p->iLimi
ae90: 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70  t = iLimit = ++p
aea0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
aeb0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
aec0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
aed0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
aee0: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  rn;.    sqlite3E
aef0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
af00: 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69  p->pLimit, iLimi
af10: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
af20: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
af30: 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69  MustBeInt, iLimi
af40: 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  t);.    VdbeComm
af50: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
af60: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 73  ounter"));.    s
af70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
af80: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69  (v, OP_IfZero, i
af90: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a  Limit, iBreak);.
afa0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66    }.  if( p->pOf
afb0: 66 73 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69  fset ){.    p->i
afc0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74  Offset = iOffset
afd0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
afe0: 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  m;.    if( p->pL
aff0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50  imit ){.      pP
b000: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20  arse->nMem++;   
b010: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65  /* Allocate an e
b020: 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f  xtra register fo
b030: 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a  r limit+offset *
b040: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 76 20 3d 20  /.    }.    v = 
b050: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
b060: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
b070: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
b080: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
b090: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f  de(pParse, p->pO
b0a0: 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b  ffset, iOffset);
b0b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b0c0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
b0d0: 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29  tBeInt, iOffset)
b0e0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
b0f0: 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f  t((v, "OFFSET co
b100: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 61 64  unter"));.    ad
b110: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
b120: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
b130: 50 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  Pos, iOffset);. 
b140: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b150: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
b160: 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b  er, 0, iOffset);
b170: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b180: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
b190: 31 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  1);.    if( p->p
b1a0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73  Limit ){.      s
b1b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b1c0: 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d  (v, OP_Add, iLim
b1d0: 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66  it, iOffset, iOf
b1e0: 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56  fset+1);.      V
b1f0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
b200: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b  LIMIT+OFFSET"));
b210: 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73  .      addr1 = s
b220: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b230: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c  (v, OP_IfPos, iL
b240: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
b250: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b260: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31  , OP_Integer, -1
b270: 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20  , iOffset+1);.  
b280: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
b290: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
b2a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
b2b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b2c0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
b2d0: 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
b2e0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
b2f0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
b300: 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
b310: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
b320: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
b330: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
b340: 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
b350: 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
b360: 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
b370: 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
b380: 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
b390: 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
b3a0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
b3b0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
b3c0: 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
b3d0: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
b3e0: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
b3f0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
b400: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
b410: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
b420: 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
b430: 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
b440: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
b450: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
b460: 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
b470: 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
b480: 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
b490: 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
b4a0: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
b4b0: 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
b4c0: 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
b4d0: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
b4e0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
b4f0: 30 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d  0 );.  if( pRet=
b500: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45  =0 && iCol<p->pE
b510: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
b520: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
b530: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
b540: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
b550: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
b560: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
b570: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
b580: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
b590: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
b5a0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
b5b0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
b5c0: 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
b5d0: 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
b5e0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
b5f0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
b600: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
b610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b620: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
b630: 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
b640: 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
b650: 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
b660: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
b670: 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
b680: 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66   */.);...#ifndef
b690: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
b6a0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
b6b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b6c0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
b6d0: 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  cess a compound 
b6e0: 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a  query form from.
b6f0: 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  ** two or more s
b700: 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20  eparate queries 
b710: 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49  using UNION, UNI
b720: 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20  ON ALL, EXCEPT, 
b730: 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a  or.** INTERSECT.
b740: 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
b750: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
b760: 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
b770: 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
b780: 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
b790: 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
b7a0: 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
b7b0: 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
b7c0: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
b7d0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
b7e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
b7f0: 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
b800: 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
b810: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
b820: 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
b830: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
b840: 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
b850: 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
b860: 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
b870: 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
b880: 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
b890: 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
b8a0: 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
b8b0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
b8c0: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
b8d0: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
b8e0: 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
b8f0: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
b900: 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
b910: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
b920: 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
b930: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
b940: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
b950: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
b960: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
b970: 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
b980: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
b9a0: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
b9b0: 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
b9c0: 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
b9d0: 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
b9e0: 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
b9f0: 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
ba00: 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
ba10: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
ba20: 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
ba30: 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
ba40: 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
ba50: 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
ba60: 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
ba70: 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
ba80: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
ba90: 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
baa0: 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
bab0: 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
bac0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
bad0: 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
bae0: 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
baf0: 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
bb00: 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
bb10: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
bb20: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
bb30: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
bb40: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
bb50: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
bb60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
bb70: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
bb80: 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
bb90: 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
bba0: 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
bbb0: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
bbc0: 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
bbd0: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
bbe0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
bbf0: 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
bc00: 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
bc10: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
bc20: 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
bc30: 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
bc40: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
bc50: 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
bc60: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
bc70: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
bc80: 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
bc90: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
bca0: 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c  dest;      /* Al
bcb0: 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64  ternative data d
bcc0: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
bcd0: 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20  Select *pDelete 
bce0: 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f  = 0;  /* Chain o
bcf0: 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73  f simple selects
bd00: 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
bd10: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
bd20: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
bd30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
bd40: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
bd50: 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
bd60: 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c  R BY or LIMIT cl
bd70: 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45  ause on prior SE
bd80: 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a  LECTs.  Only.  *
bd90: 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68  * the last (righ
bda0: 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69  t-most) SELECT i
bdb0: 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79  n the series may
bdc0: 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
bdd0: 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f  Y or LIMIT..  */
bde0: 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20  .  assert( p && 
bdf0: 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a  p->pPrior );  /*
be00: 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   Calling functio
be10: 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69  n guarantees thi
be20: 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20 3d  s much */.  db =
be30: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
be40: 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
be50: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
be60: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21  ior->pRightmost!
be70: 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73  =pPrior );.  ass
be80: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
be90: 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67  ghtmost==p->pRig
bea0: 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73 74  htmost );.  dest
beb0: 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28   = *pDest;.  if(
bec0: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
bed0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
bee0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
bef0: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
bf00: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
bf10: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
bf20: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
bf30: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
bf40: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
bf50: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
bf60: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
bf70: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
bf80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
bf90: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
bfa0: 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
bfb0: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
bfc0: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
bfd0: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
bfe0: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
bff0: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
c000: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c010: 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74    }..  v = sqlit
c020: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
c030: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
c040: 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42  0 );  /* The VDB
c050: 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  E already create
c060: 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e  d by calling fun
c070: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ction */..  /* C
c080: 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
c090: 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
c0a0: 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
c0b0: 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  ry.  */.  if( de
c0c0: 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  st.eDest==SRT_Ep
c0d0: 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73  hemTab ){.    as
c0e0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
c0f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c100: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
c110: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65  penEphemeral, de
c120: 73 74 2e 69 50 61 72 6d 2c 20 70 2d 3e 70 45 4c  st.iParm, p->pEL
c130: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
c140: 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
c150: 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
c160: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
c170: 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
c180: 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
c190: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
c1a0: 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
c1b0: 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
c1c0: 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
c1d0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
c1e0: 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
c1f0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
c200: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
c210: 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
c220: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
c230: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
c240: 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
c250: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
c260: 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
c270: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
c280: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
c290: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
c2a0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
c2b0: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
c2c0: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
c2d0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
c2e0: 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53  .  /* Compound S
c2f0: 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65  ELECTs that have
c300: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
c310: 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  use are handled 
c320: 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f  separately..  */
c330: 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
c340: 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  By ){.    return
c350: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
c360: 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  rBy(pParse, p, p
c370: 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Dest);.  }..  /*
c380: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
c390: 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
c3a0: 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
c3b0: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
c3c0: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
c3d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
c3e0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
c3f0: 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  dr = 0;.      as
c400: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
c410: 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70  Limit );.      p
c420: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
c430: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
c440: 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74   pPrior->pOffset
c450: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
c460: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c470: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
c480: 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a  pPrior, &dest);.
c490: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
c4a0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  = 0;.      p->pO
c4b0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
c4c0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
c4d0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c4e0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
c4f0: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
c500: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  r = 0;.      p->
c510: 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d  iLimit = pPrior-
c520: 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >iLimit;.      p
c530: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
c540: 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
c550: 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
c560: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72   ){.        addr
c570: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c580: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp1(v, OP_IfZer
c590: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20  o, p->iLimit);. 
c5a0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
c5b0: 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65  nt((v, "Jump ahe
c5c0: 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63  ad if LIMIT reac
c5d0: 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  hed"));.      }.
c5e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c5f0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
c600: 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20   p, &dest);.    
c610: 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
c620: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
c630: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
c640: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
c650: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
c660: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c670: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c680: 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20  ( addr ){.      
c690: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c6a0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
c6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
c6c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
c6d0: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20  ase TK_EXCEPT:. 
c6e0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
c6f0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e  : {.      int un
c700: 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75  ionTab;    /* Cu
c710: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
c720: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
c730: 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  le holding resul
c740: 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70  t */.      u8 op
c750: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f   = 0;       /* O
c760: 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f  ne of the SRT_ o
c770: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70  perations to app
c780: 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20  ly to self */.  
c790: 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
c7a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
c7b0: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
c7c0: 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
c7d0: 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  ects */.      Ex
c7e0: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
c7f0: 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76  fset; /* Saved v
c800: 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
c810: 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65  it and p->nOffse
c820: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
c830: 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  ddr;.      Selec
c840: 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b  tDest uniondest;
c850: 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20  ..      priorOp 
c860: 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
c870: 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
c880: 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 41 4c  t==priorOp && AL
c890: 57 41 59 53 28 21 70 2d 3e 70 4c 69 6d 69 74 20  WAYS(!p->pLimit 
c8a0: 26 26 21 70 2d 3e 70 4f 66 66 73 65 74 29 20 29  &&!p->pOffset) )
c8b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
c8c0: 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
c8d0: 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
c8e0: 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
c8f0: 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
c900: 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20   ** right..     
c910: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
c920: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d  sert( p->pRightm
c930: 6f 73 74 21 3d 70 20 29 3b 20 20 2f 2a 20 43 61  ost!=p );  /* Ca
c940: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f  n only happen fo
c950: 72 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  r leftward eleme
c960: 6e 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  nts.            
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61           ** of a
c990: 20 33 2d 77 61 79 20 6f 72 20 6d 6f 72 65 20 63   3-way or more c
c9a0: 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  ompound */.     
c9b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
c9c0: 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  imit==0 );      
c9d0: 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
c9e0: 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
c9f0: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
ca00: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
ca10: 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e  t==0 );     /* N
ca20: 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
ca30: 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
ca40: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
ca50: 54 61 62 20 3d 20 64 65 73 74 2e 69 50 61 72 6d  Tab = dest.iParm
ca60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ca70: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c         /* We wil
ca80: 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  l need to create
ca90: 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61   our own tempora
caa0: 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64  ry table to hold
cab0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
cac0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
cad0: 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ults..        */
cae0: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
caf0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
cb00: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
cb10: 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
cb20: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64  =0 );.        ad
cb30: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
cb40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
cb50: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
cb60: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
cb70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
cb80: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
cb90: 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  -1 );.        p-
cba0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
cbb0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
cbc0: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e   p->pRightmost->
cbd0: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
cbe0: 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
cbf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
cc00: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
cc10: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
cc20: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
cc30: 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
cc40: 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  eft.      */.   
cc50: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
cc60: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a  or->pOrderBy );.
cc70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
cc80: 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69  ectDestInit(&uni
cc90: 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c  ondest, priorOp,
cca0: 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20   unionTab);.    
ccb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
ccc0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
ccd0: 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
cce0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
ccf0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
cd00: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
cd10: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
cd20: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
cd30: 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
cd40: 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
cd50: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
cd60: 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20  K_EXCEPT ){.    
cd70: 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
cd80: 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ept;.      }else
cd90: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
cda0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
cdb0: 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  N );.        op 
cdc0: 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
cdd0: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
cde0: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
cdf0: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
ce00: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
ce10: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
ce20: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
ce30: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
ce40: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
ce50: 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74   uniondest.eDest
ce60: 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 72 63 20   = op;.      rc 
ce70: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
ce80: 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f  pParse, p, &unio
ce90: 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 2f 2a  ndest);.      /*
cea0: 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e   Query flattenin
ceb0: 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  g in sqlite3Sele
cec0: 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c  ct() might refil
ced0: 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20  l p->pOrderBy.. 
cee0: 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20       ** Be sure 
cef0: 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72  to delete p->pOr
cf00: 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65  derBy, therefore
cf10: 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d  , to avoid a mem
cf20: 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20  ory leak. */.   
cf30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
cf40: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
cf50: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
cf60: 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
cf70: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
cf80: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
cf90: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
cfa0: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  y = 0;.      sql
cfb0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
cfc0: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
cfd0: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
cfe0: 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
cff0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
d000: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  set;.      p->iL
d010: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
d020: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
d030: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
d040: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
d050: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d060: 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f       }...      /
d070: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61  * Convert the da
d080: 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ta in the tempor
d090: 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  ary table into w
d0a0: 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20  hatever form.   
d0b0: 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74     ** it is that
d0c0: 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65   we currently ne
d0d0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20  ed..      */    
d0e0: 20 20 0a 20 20 20 20 20 20 69 66 28 20 64 65 73    .      if( des
d0f0: 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
d100: 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 64 65   || unionTab!=de
d110: 73 74 2e 69 50 61 72 6d 20 29 7b 0a 20 20 20 20  st.iParm ){.    
d120: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
d130: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
d140: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d150: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
d160: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
d170: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
d180: 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
d190: 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
d1a0: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
d1b0: 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
d1c0: 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
d1d0: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
d1e0: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
d1f0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
d200: 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
d210: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
d220: 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
d230: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
d240: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
d250: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
d260: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
d270: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
d280: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
d290: 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
d2a0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
d2b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d2c0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
d2d0: 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20  nTab, iBreak);. 
d2e0: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
d2f0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d300: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
d310: 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
d320: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
d330: 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61  >pEList, unionTa
d340: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  b, p->pEList->nE
d350: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
d370: 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74  -1, &dest, iCont
d380: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
d390: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
d3a0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
d3b0: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
d3c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d3d0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
d3e0: 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20  nTab, iStart);. 
d3f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d400: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d410: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
d420: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d430: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
d440: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
d450: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
d460: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
d470: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
d480: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  : {.      int ta
d490: 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
d4a0: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
d4b0: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
d4c0: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
d4d0: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
d4e0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
d4f0: 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73  electDest inters
d500: 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69  ectdest;.      i
d510: 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a  nt r1;..      /*
d520: 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
d530: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
d540: 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
d550: 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
d560: 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
d570: 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
d580: 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
d590: 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
d5a0: 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
d5b0: 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
d5c0: 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
d5d0: 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
d5e0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
d5f0: 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
d600: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
d610: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
d620: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a  pOrderBy==0 );..
d630: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
d640: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d650: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
d660: 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
d670: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
d680: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
d690: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
d6a0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
d6b0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
d6c0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65  ->pRightmost->se
d6d0: 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
d6e0: 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
d6f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
d700: 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
d710: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
d720: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
d730: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
d740: 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
d750: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
d760: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
d770: 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
d780: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
d790: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d7a0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
d7b0: 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65  e, pPrior, &inte
d7c0: 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
d7d0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
d7e0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
d7f0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
d800: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
d810: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
d820: 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72  LECT into tempor
d830: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22  ary table "tab2"
d840: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
d850: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
d860: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
d870: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
d880: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b2, 0);.      as
d890: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
d8a0: 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29  nEphm[1] == -1 )
d8b0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
d8c0: 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64  penEphm[1] = add
d8d0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
d8e0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
d8f0: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
d900: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
d910: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
d920: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
d930: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
d940: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
d950: 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 50 61  ntersectdest.iPa
d960: 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20  rm = tab2;.     
d970: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
d980: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
d990: 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
d9a0: 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
d9b0: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
d9c0: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
d9d0: 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ior;.      sqlit
d9e0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
d9f0: 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
da00: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
da10: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
da20: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
da30: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  t;.      if( rc 
da40: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
da50: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
da60: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
da70: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
da80: 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
da90: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
daa0: 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
dab0: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
dac0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
dad0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
dae0: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t );.      if( d
daf0: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
db00: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
db10: 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
db20: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = p;.        whi
db30: 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
db40: 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
db50: 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
db60: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
db70: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
db80: 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
db90: 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
dba0: 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
dbb0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
dbc0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
dbd0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
dbe0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
dbf0: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
dc00: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
dc10: 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
dc20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dc30: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
dc40: 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
dc50: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
dc60: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
dc70: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53  Parse);.      iS
dc80: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
dc90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
dca0: 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29  owKey, tab1, r1)
dcb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
dcc0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
dcd0: 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
dce0: 69 43 6f 6e 74 2c 20 72 31 29 3b 0a 20 20 20 20  iCont, r1);.    
dcf0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
dd00: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
dd10: 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  r1);.      selec
dd20: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
dd30: 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
dd40: 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74   tab1, p->pEList
dd50: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
dd70: 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f  , -1, &dest, iCo
dd80: 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
dd90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
dda0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
ddb0: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
ddc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ddd0: 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20   OP_Next, tab1, 
dde0: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73  iStart);.      s
ddf0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
de00: 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
de10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
de20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
de30: 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
de40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
de50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
de60: 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b  Close, tab1, 0);
de70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
de80: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
de90: 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  mpute collating 
dea0: 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62  sequences used b
deb0: 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  y .  ** temporar
dec0: 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20  y tables needed 
ded0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
dee0: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
def0: 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68  ..  ** Attach th
df00: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
df10: 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f  ure to all tempo
df20: 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a  rary tables..  *
df30: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74  *.  ** This sect
df40: 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68  ion is run by th
df50: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
df60: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
df70: 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ly..  ** SELECT 
df80: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68  statements to th
df90: 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b  e left always sk
dfa0: 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54  ip this part.  T
dfb0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
dfc0: 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20  ** SELECT might 
dfd0: 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70  also skip this p
dfe0: 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f  art if it has no
dff0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e000: 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d   and.  ** no tem
e010: 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71  p tables are req
e020: 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  uired..  */.  if
e030: 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
e040: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
e050: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   ){.    int i;  
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e070: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
e080: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79  unter */.    Key
e090: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
e0a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
e0b0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
e0c0: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
e0d0: 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63  set */.    Selec
e0e0: 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  t *pLoop;       
e0f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
e100: 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
e110: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e120: 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  s */.    CollSeq
e130: 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20   **apColl;      
e140: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
e150: 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b  oping through pK
e160: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20  eyInfo->aColl[] 
e170: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e190: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e1a0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73  f columns in res
e1b0: 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20  ult set */..    
e1c0: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
e1d0: 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20  tmost==p );.    
e1e0: 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
e1f0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65  ->nExpr;.    pKe
e200: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  yInfo = sqlite3D
e210: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a  bMallocZero(db,.
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
e240: 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 28 73  KeyInfo)+nCol*(s
e250: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20  izeof(CollSeq*) 
e260: 2b 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 21  + 1));.    if( !
e270: 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
e280: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
e290: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
e2a0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
e2b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65  ;.    }..    pKe
e2c0: 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43  yInfo->enc = ENC
e2d0: 28 64 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e  (db);.    pKeyIn
e2e0: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31  fo->nField = (u1
e2f0: 36 29 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72  6)nCol;..    for
e300: 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65  (i=0, apColl=pKe
e310: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c  yInfo->aColl; i<
e320: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c  nCol; i++, apCol
e330: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43  l++){.      *apC
e340: 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
e350: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
e360: 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   p, i);.      if
e370: 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a  ( 0==*apColl ){.
e380: 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
e390: 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
e3a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e3b0: 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
e3c0: 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
e3d0: 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  oop->pPrior){.  
e3e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
e3f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e400: 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70  int addr = pLoop
e410: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
e420: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ];.        if( a
e430: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ddr<0 ){.       
e440: 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20     /* If [0] is 
e450: 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20  unused then [1] 
e460: 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20  is also unused. 
e470: 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20   So we can.     
e480: 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
e490: 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73  afely abort as s
e4a0: 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74  oon as the first
e4b0: 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20   unused slot is 
e4c0: 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
e4d0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
e4e0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
e4f0: 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ]<0 );.         
e500: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
e510: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
e520: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
e530: 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20   addr, nCol);.  
e540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e550: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
e560: 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  r, (char*)pKeyIn
e570: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
e580: 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
e590: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
e5a0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
e5b0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
e5c0: 62 46 72 65 65 28 64 62 2c 20 70 4b 65 79 49 6e  bFree(db, pKeyIn
e5d0: 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  fo);.  }..multi_
e5e0: 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44  select_end:.  pD
e5f0: 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 64 65 73 74  est->iMem = dest
e600: 2e 69 4d 65 6d 3b 0a 20 20 70 44 65 73 74 2d 3e  .iMem;.  pDest->
e610: 6e 4d 65 6d 20 3d 20 64 65 73 74 2e 6e 4d 65 6d  nMem = dest.nMem
e620: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
e630: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
e640: 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ete);.  return r
e650: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
e660: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
e670: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
e680: 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74  *.** Code an out
e690: 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66  put subroutine f
e6a0: 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69  or a coroutine i
e6b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
e6c0: 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
e6d0: 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tment..**.** The
e6e0: 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70   data to be outp
e6f0: 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ut is contained 
e700: 69 6e 20 70 49 6e 2d 3e 69 4d 65 6d 2e 20 20 54  in pIn->iMem.  T
e710: 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d  here are.** pIn-
e720: 3e 6e 4d 65 6d 20 63 6f 6c 75 6d 6e 73 20 74 6f  >nMem columns to
e730: 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65   be output.  pDe
e740: 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20  st is where the 
e750: 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a  output should.**
e760: 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   be sent..**.** 
e770: 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65  regReturn is the
e780: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
e790: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
e7a0: 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a  the subroutine.*
e7b0: 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  * return address
e7c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72  ..**.** If regPr
e7d0: 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20  ev>0 then it is 
e7e0: 61 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  a the first regi
e7f0: 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72  ster in a vector
e800: 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73   that.** records
e810: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75   the previous ou
e820: 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72  tput.  mem[regPr
e830: 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68  ev] is a flag th
e840: 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69  at is false.** i
e850: 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
e860: 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74   no previous out
e870: 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76  put.  If regPrev
e880: 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a  >0 then code is.
e890: 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  ** generated to 
e8a0: 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  suppress duplica
e8b0: 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69  tes.  pKeyInfo i
e8c0: 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61  s used for compa
e8d0: 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a  ring.** keys..**
e8e0: 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54  .** If the LIMIT
e8f0: 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69   found in p->iLi
e900: 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20  mit is reached, 
e910: 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
e920: 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a   to.** iBreak..*
e930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e  /.static int gen
e940: 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
e950: 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a  utine(.  Parse *
e960: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
e970: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
e980: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
e990: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
e9a0: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
e9b0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65  tatement */.  Se
e9c0: 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20  lectDest *pIn,  
e9d0: 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69        /* Corouti
e9e0: 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74  ne supplying dat
e9f0: 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
ea00: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
ea10: 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20  * Where to send 
ea20: 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  the data */.  in
ea30: 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20  t regReturn,    
ea40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
ea50: 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
ea60: 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
ea70: 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  gPrev,          
ea80: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65    /* Previous re
ea90: 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20  sult register.  
eaa0: 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66  No uniqueness if
eab0: 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20   0 */.  KeyInfo 
eac0: 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
ead0: 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67  /* For comparing
eae0: 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65   with previous e
eaf0: 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 34  ntry */.  int p4
eb00: 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
eb10: 20 20 2f 2a 20 54 68 65 20 70 34 20 74 79 70 65    /* The p4 type
eb20: 20 66 6f 72 20 70 4b 65 79 49 6e 66 6f 20 2a 2f   for pKeyInfo */
eb30: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
eb40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
eb50: 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69  mp here if we hi
eb60: 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29  t the LIMIT */.)
eb70: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
eb80: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
eb90: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  nt iContinue;.  
eba0: 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64  int addr;..  add
ebb0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
ebc0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
ebd0: 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
ebe0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
ebf0: 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  l(v);..  /* Supp
ec00: 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20  ress duplicates 
ec10: 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  for UNION, EXCEP
ec20: 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
ec30: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67   .  */.  if( reg
ec40: 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  Prev ){.    int 
ec50: 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d  j1, j2;.    j1 =
ec60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ec70: 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
ec80: 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 6a 32  regPrev);.    j2
ec90: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
eca0: 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
ecb0: 72 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72  re, pIn->iMem, r
ecc0: 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e  egPrev+1, pIn->n
ecd0: 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Mem,.           
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecf0: 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
ed00: 66 6f 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 20  fo, p4type);.   
ed10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ed20: 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
ed30: 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  2+2, iContinue, 
ed40: 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  j2+2);.    sqlit
ed50: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
ed60: 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , j1);.    sqlit
ed70: 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70  e3ExprCodeCopy(p
ed80: 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  Parse, pIn->iMem
ed90: 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
eda0: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c  ->nMem);.    sql
edb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
edc0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
edd0: 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20   regPrev);.  }. 
ede0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
edf0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
ee00: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
ee10: 53 75 70 70 72 65 73 73 20 74 68 65 20 74 68 65  Suppress the the
ee20: 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e   first OFFSET en
ee30: 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69  tries if there i
ee40: 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75  s an OFFSET clau
ee50: 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66  se.  */.  codeOf
ee60: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
ee70: 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68  inue);..  switch
ee80: 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29  ( pDest->eDest )
ee90: 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  {.    /* Store t
eea0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
eeb0: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
eec0: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
eed0: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
eee0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
eef0: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
ef00: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
ef10: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
ef20: 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32  e);.      int r2
ef30: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
ef40: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
ef50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ef60: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
ef70: 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d 65  Record, pIn->iMe
ef80: 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 20 72 31  m, pIn->nMem, r1
ef90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
efa0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
efb0: 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74  _NewRowid, pDest
efc0: 2d 3e 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  ->iParm, r2);.  
efd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
efe0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
eff0: 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  rt, pDest->iParm
f000: 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
f010: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
f020: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
f030: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
f040: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
f050: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
f060: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
f070: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
f080: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
f090: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
f0a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f0b0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
f0c0: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
f0d0: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
f0e0: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
f0f0: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
f100: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
f110: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
f120: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
f130: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
f140: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
f150: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
f160: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
f170: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
f180: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
f190: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
f1a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f1b0: 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20  In->nMem==1 );. 
f1c0: 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79       p->affinity
f1d0: 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c   = .         sql
f1e0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
f1f0: 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  ity(p->pEList->a
f200: 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74  [0].pExpr, pDest
f210: 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20  ->affinity);.   
f220: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
f230: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
f240: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f250: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
f260: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
f270: 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72 31 2c 20 26  ->iMem, 1, r1, &
f280: 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  p->affinity, 1);
f290: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f2a0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
f2b0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
f2c0: 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  n->iMem, 1);.   
f2d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f2e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
f2f0: 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61  sert, pDest->iPa
f300: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  rm, r1);.      s
f310: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
f320: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
f330: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f340: 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20     }..#if 0  /* 
f350: 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20  Never occurs on 
f360: 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65 72  an ORDER BY quer
f370: 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61  y */.    /* If a
f380: 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20  ny row exist in 
f390: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
f3a0: 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74  record that fact
f3b0: 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20   and abort..    
f3c0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
f3d0: 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20  Exists: {.      
f3e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f3f0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
f400: 20 31 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d   1, pDest->iParm
f410: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
f420: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
f430: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
f440: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
f450: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f460: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
f470: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
f480: 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
f490: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
f4a0: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
f4b0: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
f4c0: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
f4d0: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
f4e0: 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
f4f0: 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
f500: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
f510: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
f520: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
f530: 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65  assert( pIn->nMe
f540: 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  m==1 );.      sq
f550: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
f560: 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
f570: 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  Mem, pDest->iPar
f580: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
f590: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
f5a0: 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
f5b0: 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
f5c0: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
f5d0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
f5e0: 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
f5f0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
f600: 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  /..    /* The re
f610: 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
f620: 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
f630: 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
f640: 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
f650: 44 65 73 74 2d 3e 69 4d 65 6d 2e 20 20 54 68 65  Dest->iMem.  The
f660: 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
f670: 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   yields..    */.
f680: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
f690: 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
f6a0: 69 66 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d  if( pDest->iMem=
f6b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =0 ){.        pD
f6c0: 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c 69  est->iMem = sqli
f6d0: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
f6e0: 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d 65  pParse, pIn->nMe
f6f0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73  m);.        pDes
f700: 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e 6e  t->nMem = pIn->n
f710: 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Mem;.      }.   
f720: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f730: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
f740: 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d  In->iMem, pDest-
f750: 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 6e 4d  >iMem, pDest->nM
f760: 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
f770: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f780: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
f790: 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62  >iParm);.      b
f7a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
f7b0: 20 2f 2a 20 52 65 73 75 6c 74 73 20 61 72 65 20   /* Results are 
f7c0: 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
f7d0: 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
f7e0: 73 2e 20 20 54 68 65 6e 20 74 68 65 0a 20 20 20  s.  Then the.   
f7f0: 20 2a 2a 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77   ** OP_ResultRow
f800: 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
f810: 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33  to cause sqlite3
f820: 5f 73 74 65 70 28 29 20 74 6f 20 72 65 74 75 72  _step() to retur
f830: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 78  n.    ** the nex
f840: 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e  t row of result.
f850: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
f860: 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a 20   SRT_Output: {. 
f870: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f880: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
f890: 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d 65  ultRow, pIn->iMe
f8a0: 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20  m, pIn->nMem);. 
f8b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f8c0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
f8d0: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
f8e0: 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  >iMem, pIn->nMem
f8f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f900: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
f910: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f920: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
f930: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
f940: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
f950: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
f960: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
f970: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
f980: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
f990: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
f9a0: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
f9b0: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
f9c0: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
f9d0: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
f9e0: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
f9f0: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
fa00: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
fa10: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
fa20: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
fa30: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
fa40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
fa50: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
fa60: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
fa70: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
fa80: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
fa90: 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20   reached..  */. 
faa0: 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
fab0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
fac0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
fad0: 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  dImm, p->iLimit,
fae0: 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   -1);.    sqlite
faf0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fb00: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
fb10: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
fb20: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
fb30: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
fb40: 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
fb50: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
fb60: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
fb70: 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ue);.  sqlite3Vd
fb80: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
fb90: 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e  eturn, regReturn
fba0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64  );..  return add
fbb0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65  r;.}../*.** Alte
fbc0: 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64  rnative compound
fbd0: 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e   select code gen
fbe0: 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73  erator for cases
fbf0: 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69   when there.** i
fc00: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
fc10: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ause..**.** We a
fc20: 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66  ssume a query of
fc30: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
fc40: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
fc50: 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72  <selectA>  <oper
fc60: 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e  ator>  <selectB>
fc70: 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65    ORDER BY <orde
fc80: 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c  rbylist>.**.** <
fc90: 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65  operator> is one
fca0: 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55   of UNION ALL, U
fcb0: 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
fcc0: 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65   INTERSECT.  The
fcd0: 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63   idea.** is to c
fce0: 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74  ode both <select
fcf0: 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e  A> and <selectB>
fd00: 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
fd10: 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20  BY clause as.** 
fd20: 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68  co-routines.  Th
fd30: 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f  en run the co-ro
fd40: 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c  utines in parall
fd50: 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65  el and merge the
fd60: 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
fd70: 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e   the output.  In
fd80: 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
fd90: 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
fda0: 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20  (called selectA 
fdb0: 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20  and.** selectB) 
fdc0: 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72  there are 7 subr
fdd0: 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  outines:.**.**  
fde0: 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20    outA:    Move 
fdf0: 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
fe00: 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74  e selectA corout
fe10: 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
fe20: 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
fe30: 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
fe40: 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  nd query..**.** 
fe50: 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65     outB:    Move
fe60: 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
fe70: 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75  he selectB corou
fe80: 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
fe90: 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
fea0: 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
feb0: 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c  und query.  (Onl
fec0: 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  y generated for 
fed0: 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20  UNION and.**    
fee0: 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
fef0: 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20  LL.  EXCEPT and 
ff00: 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72  INSERTSECT never
ff10: 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68   output a row th
ff20: 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
ff30: 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69    appears only i
ff40: 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41  n B.).**.**    A
ff50: 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ltB:    Called w
ff60: 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
ff70: 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
ff80: 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a  utines and A<B..
ff90: 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20  **.**    AeqB:  
ffa0: 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
ffb0: 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
ffc0: 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
ffd0: 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a   and A==B..**.**
ffe0: 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c      AgtB:    Cal
fff0: 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
10000 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
10010 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
10020 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  A>B..**.**    Eo
10030 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fA:    Called wh
10040 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
10050 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
10060 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42  A..**.**    EofB
10070 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
10080 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
10090 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e  ed from selectB.
100a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
100b0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
100c0 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62   latter five sub
100d0 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20  routines depend 
100e0 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70  on which .** <op
100f0 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a  erator> is used:
10100 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  .**.**.**       
10110 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
10120 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20          UNION   
10130 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20           EXCEPT 
10140 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45           INTERSE
10150 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d  CT.**          -
10160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
10170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
10180 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
10190 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
101a0 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20  --.**   AltB:   
101b0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
101c0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
101d0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
101e0 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a         nextA.**.
101f0 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74  **   AeqB:   out
10200 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
10210 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20   nextA          
10220 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
10230 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a   outA, nextA.**.
10240 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74  **   AgtB:   out
10250 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
10260 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
10270 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20     nextB        
10280 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20      nextB.**.** 
10290 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20    EofA:   outB, 
102a0 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
102b0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
102c0 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  halt            
102d0 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f   halt.**.**   Eo
102e0 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  fB:   outA, next
102f0 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
10300 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
10310 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c  extA         hal
10320 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41  t.**.** In the A
10330 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41  ltB, AeqB, and A
10340 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c  gtB subroutines,
10350 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c   an EOF on A fol
10360 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20  lowing nextA.** 
10370 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69  causes an immedi
10380 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41  ate jump to EofA
10390 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42   and an EOF on B
103a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42   following nextB
103b0 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d   causes.** an im
103c0 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
103d0 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f  EofB.  Within Eo
103e0 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64  fA and EofB, and
103f0 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72   EOF on entry or
10400 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  .** following ne
10410 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d  xtX causes a jum
10420 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
10430 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65  the select proce
10440 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70  ssing..**.** Dup
10450 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69  licate removal i
10460 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43  n the UNION, EXC
10470 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
10480 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64  CT cases is hand
10490 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  led.** within th
104a0 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
104b0 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65  ine.  The regPre
104c0 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68  v register set h
104d0 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  olds the previou
104e0 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61  sly.** output va
104f0 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73  lue.  A comparis
10500 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e  on is made again
10510 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  st this value an
10520 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
10530 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
10540 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77  e next results w
10550 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65  ould be the same
10560 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
10570 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
10580 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20  ementation plan 
10590 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  is to implement 
105a0 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
105b0 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20  es and seven.** 
105c0 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73  subroutines firs
105d0 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20  t, then put the 
105e0 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74  control logic at
105f0 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69   the bottom.  Li
10600 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
10610 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69          goto Ini
10620 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f  t.**     coA: co
10630 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
10640 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20   query (A).**   
10650 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65    coB: coroutine
10660 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79   for right query
10670 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a   (B).**    outA:
10680 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
10690 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  of A.**    outB:
106a0 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
106b0 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20  of B (UNION and 
106c0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a  UNION ALL only).
106d0 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a  **    EofA: ....
106e0 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a  **    EofB: ....
106f0 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a  **    AltB: ....
10700 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a  **    AeqB: ....
10710 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a  **    AgtB: ....
10720 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74  **    Init: init
10730 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65  ialize coroutine
10740 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20   registers.**   
10750 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41         yield coA
10760 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
10770 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41  eof(A) goto EofA
10780 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
10790 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20  ld coB.**       
107a0 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74     if eof(B) got
107b0 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70  o EofB.**    Cmp
107c0 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a  r: Compare A, B.
107d0 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70  **          Jump
107e0 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
107f0 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e  B.**     End: ..
10800 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20  ..**.** We call 
10810 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
10820 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42  , EofA, and EofB
10830 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62   "subroutines" b
10840 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  ut they are not.
10850 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c  ** actually call
10860 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61  ed using Gosub a
10870 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52  nd they do not R
10880 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64  eturn.  EofA and
10890 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e   EofB loop.** un
108a0 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20  til all data is 
108b0 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a  exhausted then j
108c0 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22  ump to the "end"
108d0 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65   labe.  AltB, Ae
108e0 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20  qB,.** and AgtB 
108f0 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c  jump to either L
10900 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45  2 or to one of E
10910 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a  ofA or EofB..*/.
10920 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10930 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
10940 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  ECT.static int m
10950 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
10960 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
10970 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
10980 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
10990 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
109a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
109b0 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
109c0 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
109d0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
109e0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
109f0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
10a00 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
10a10 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
10a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10a30 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
10a40 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
10a50 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
10a60 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
10a70 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
10a80 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
10a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10aa0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
10ab0 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
10ac0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41  SelectDest destA
10ad0 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
10ae0 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
10af0 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ne A */.  Select
10b00 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20  Dest destB;     
10b10 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
10b20 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a  or coroutine B *
10b30 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41  /.  int regAddrA
10b40 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
10b50 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
10b60 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  r select-A corou
10b70 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
10b80 67 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 20  gEofA;          
10b90 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63  /* Flag to indic
10ba0 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d  ate when select-
10bb0 41 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f  A is complete */
10bc0 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
10bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
10be0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
10bf0 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
10c00 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
10c10 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 20 2f  EofB;          /
10c20 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61  * Flag to indica
10c30 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 42  te when select-B
10c40 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a   is complete */.
10c50 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
10c60 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  A;      /* Addre
10c70 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
10c80 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
10c90 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
10ca0 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  B;      /* Addre
10cb0 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
10cc0 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
10cd0 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20    int regOutA;  
10ce0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
10cf0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
10d00 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
10d10 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10d20 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20   regOutB;       
10d30 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
10d40 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
10d50 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
10d60 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
10d70 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  OutA;         /*
10d80 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
10d90 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
10da0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
10db0 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f  rOutB = 0;     /
10dc0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
10dd0 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
10de0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
10df0 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20  drEofA;         
10e00 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
10e10 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75  e select-A-exhau
10e20 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
10e30 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
10e40 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
10e50 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
10e60 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20  ect-B-exhausted 
10e70 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
10e80 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20  int addrAltB;   
10e90 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10ea0 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72   of the A<B subr
10eb0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10ec0 61 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20  addrAeqB;       
10ed0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10ee0 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74  the A==B subrout
10ef0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
10f00 72 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rAgtB;         /
10f10 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
10f20 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20   A>B subroutine 
10f30 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
10f40 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tA;        /* Li
10f50 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
10f60 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
10f70 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20  nt regLimitB;   
10f80 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
10f90 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
10fa0 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
10fb0 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f  Prev;          /
10fc0 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67  * A range of reg
10fd0 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70  isters to hold p
10fe0 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a  revious output *
10ff0 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d  /.  int savedLim
11000 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76  it;       /* Sav
11010 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  ed value of p->i
11020 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73  Limit */.  int s
11030 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20  avedOffset;     
11040 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
11050 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f  of p->iOffset */
11060 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72  .  int labelCmpr
11070 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65  ;        /* Labe
11080 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  l for the start 
11090 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67  of the merge alg
110a0 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20  orithm */.  int 
110b0 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20  labelEnd;       
110c0 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
110d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76  he end of the ov
110e0 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d  erall SELECT stm
110f0 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20  t */.  int j1;  
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11110 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  Jump instruction
11120 73 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72  s that get retar
11130 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  getted */.  int 
11140 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
11150 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41    /* One of TK_A
11160 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b  LL, TK_UNION, TK
11170 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45  _EXCEPT, TK_INTE
11180 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e  RSECT */.  KeyIn
11190 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b  fo *pKeyDup = 0;
111a0 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
111b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64  nformation for d
111c0 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
111d0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
111e0 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43  KeyMerge;   /* C
111f0 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
11200 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e  ation for mergin
11210 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69  g rows */.  sqli
11220 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
11230 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
11240 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
11250 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
11260 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
11270 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
11280 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  int nOrderBy;   
11290 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
112a0 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
112b0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
112c0 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75  */.  int *aPermu
112d0 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  te;        /* Ma
112e0 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52  pping from ORDER
112f0 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73   BY terms to res
11300 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20  ult set columns 
11310 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
11320 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a  >pOrderBy!=0 );.
11330 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75    assert( pKeyDu
11340 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61  p==0 ); /* "Mana
11350 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20  ged" code needs 
11360 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33  this.  Ticket #3
11370 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70  382. */.  db = p
11380 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
11390 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
113a0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
113b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
113c0 3b 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73  ;.  labelEnd = s
113d0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
113e0 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43  bel(v);.  labelC
113f0 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mpr = sqlite3Vdb
11400 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
11410 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74  .  /* Patch up t
11420 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11430 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  se.  */.  op = p
11440 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72  ->op;  .  pPrior
11450 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
11460 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
11470 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
11480 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
11490 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72  OrderBy;.  asser
114a0 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  t( pOrderBy );. 
114b0 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
114c0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  erBy->nExpr;..  
114d0 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73  /* For operators
114e0 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
114f0 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f  N ALL we have to
11500 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a   make sure that.
11510 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
11520 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20  Y clause covers 
11530 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
11540 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41  e result set.  A
11550 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f  dd.  ** terms to
11560 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
11570 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72  ause as necessar
11580 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  y..  */.  if( op
11590 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
115a0 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c  for(i=1; db->mal
115b0 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20  locFailed==0 && 
115c0 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  i<=p->pEList->nE
115d0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
115e0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
115f0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
11600 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
11610 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
11620 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c  j<nOrderBy; j++,
11630 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
11640 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
11650 2d 3e 69 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  ->iCol>0 );.    
11660 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
11670 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a  Col==i ) break;.
11680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11690 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b  ( j==nOrderBy ){
116a0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
116b0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78  New = sqlite3PEx
116c0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
116d0 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 30 29 3b  TEGER, 0, 0, 0);
116e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
116f0 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
11700 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
11710 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
11720 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
11730 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 54          pNew->iT
11740 61 62 6c 65 20 3d 20 69 3b 0a 20 20 20 20 20 20  able = i;.      
11750 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c    pOrderBy = sql
11760 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
11770 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
11780 72 42 79 2c 20 70 4e 65 77 2c 20 30 29 3b 0a 20  rBy, pNew, 0);. 
11790 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
117a0 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 69  >a[nOrderBy++].i
117b0 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
117c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
117d0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
117e0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
117f0 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
11800 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
11810 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
11820 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
11830 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
11840 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
11850 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
11860 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
11870 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
11880 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
11890 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
118a0 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
118b0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
118c0 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
118d0 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
118e0 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
118f0 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
11900 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
11910 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
11920 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
11930 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
11940 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
11950 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
11960 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  *nOrderBy);.  if
11970 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20  ( aPermute ){.  
11980 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
11990 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
119a0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
119b0 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
119c0 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20  <nOrderBy; i++, 
119d0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
119e0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69  assert( pItem->i
119f0 43 6f 6c 3e 30 20 20 26 26 20 70 49 74 65 6d 2d  Col>0  && pItem-
11a00 3e 69 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74  >iCol<=p->pEList
11a10 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
11a20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70   aPermute[i] = p
11a30 49 74 65 6d 2d 3e 69 43 6f 6c 20 2d 20 31 3b 0a  Item->iCol - 1;.
11a40 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65      }.    pKeyMe
11a50 72 67 65 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  rge =.      sqli
11a60 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
11a70 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 4d  b, sizeof(*pKeyM
11a80 65 72 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a 28  erge)+nOrderBy*(
11a90 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
11aa0 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  +1));.    if( pK
11ab0 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20  eyMerge ){.     
11ac0 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72   pKeyMerge->aSor
11ad0 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
11ae0 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b  KeyMerge->aColl[
11af0 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 20  nOrderBy];.     
11b00 20 70 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69 65   pKeyMerge->nFie
11b10 6c 64 20 3d 20 28 75 31 36 29 6e 4f 72 64 65 72  ld = (u16)nOrder
11b20 42 79 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65  By;.      pKeyMe
11b30 72 67 65 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64  rge->enc = ENC(d
11b40 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  b);.      for(i=
11b50 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
11b60 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
11b70 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
11b80 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d       Expr *pTerm
11b90 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
11ba0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
11bb0 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67   if( pTerm->flag
11bc0 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
11bd0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
11be0 43 6f 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 43  Coll = pTerm->pC
11bf0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  oll;.        }el
11c00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43  se{.          pC
11c10 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
11c20 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
11c30 20 70 2c 20 61 50 65 72 6d 75 74 65 5b 69 5d 29   p, aPermute[i])
11c40 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  ;.          pTer
11c50 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45  m->flags |= EP_E
11c60 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20  xpCollate;.     
11c70 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 43 6f 6c       pTerm->pCol
11c80 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  l = pColl;.     
11c90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4b 65     }.        pKe
11ca0 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d  yMerge->aColl[i]
11cb0 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
11cc0 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f    pKeyMerge->aSo
11cd0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72  rtOrder[i] = pOr
11ce0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
11cf0 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20  Order;.      }. 
11d00 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
11d10 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b    pKeyMerge = 0;
11d20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74  .  }..  /* Reatt
11d30 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
11d40 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71   clause to the q
11d50 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  uery..  */.  p->
11d60 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
11d70 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  rBy;.  pPrior->p
11d80 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
11d90 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
11da0 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
11db0 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  y, 0);..  /* All
11dc0 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66  ocate a range of
11dd0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
11de0 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79  ters and the Key
11df0 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a  Info needed.  **
11e00 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74   for the logic t
11e10 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c  hat removes dupl
11e20 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77  icate result row
11e30 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  s when the.  ** 
11e40 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
11e50 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
11e60 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74  TERSECT (but not
11e70 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a   UNION ALL)..  *
11e80 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
11e90 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65  LL ){.    regPre
11ea0 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
11eb0 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
11ec0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
11ed0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f  ;.    assert( nO
11ee0 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c  rderBy>=nExpr ||
11ef0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11f00 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76  d );.    regPrev
11f10 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
11f20 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
11f30 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 73 71 6c  Expr+1);.    sql
11f40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11f50 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
11f60 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70   regPrev);.    p
11f70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33  KeyDup = sqlite3
11f80 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
11f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11fa0 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 44     sizeof(*pKeyD
11fb0 75 70 29 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a  up) + nExpr*(siz
11fc0 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
11fd0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79   );.    if( pKey
11fe0 44 75 70 20 29 7b 0a 20 20 20 20 20 20 70 4b 65  Dup ){.      pKe
11ff0 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  yDup->aSortOrder
12000 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 44 75 70   = (u8*)&pKeyDup
12010 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a  ->aColl[nExpr];.
12020 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 6e        pKeyDup->n
12030 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 45 78  Field = (u16)nEx
12040 70 72 3b 0a 20 20 20 20 20 20 70 4b 65 79 44 75  pr;.      pKeyDu
12050 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  p->enc = ENC(db)
12060 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
12070 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a   i<nExpr; i++){.
12080 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
12090 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74  >aColl[i] = mult
120a0 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
120b0 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
120c0 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
120d0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30  SortOrder[i] = 0
120e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
120f0 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72    }. .  /* Separ
12100 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64  ate the left and
12110 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72 79   the right query
12120 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65   from one anothe
12130 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69  r.  */.  p->pPri
12140 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72  or = 0;.  pPrior
12150 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30  ->pRightmost = 0
12160 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
12170 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
12180 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
12190 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
121a0 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
121b0 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
121c0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
121d0 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
121e0 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
121f0 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
12200 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
12210 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
12220 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
12230 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
12240 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
12250 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
12260 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
12270 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
12280 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
12290 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
122a0 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
122b0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
122c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
122d0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
122e0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
122f0 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
12300 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
12330 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
12340 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12350 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
12360 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
12370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
12380 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
12390 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
123a0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
123b0 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
123c0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
123d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
123e0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  ete(db, p->pOffs
123f0 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  et);.  p->pOffse
12400 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64  t = 0;..  regAdd
12410 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rA = ++pParse->n
12420 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d  Mem;.  regEofA =
12430 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
12440 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b  .  regAddrB = ++
12450 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12460 72 65 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72  regEofB = ++pPar
12470 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
12480 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utA = ++pParse->
12490 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20  nMem;.  regOutB 
124a0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
124b0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
124c0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41  tDestInit(&destA
124d0 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
124e0 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
124f0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
12500 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f  nit(&destB, SRT_
12510 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
12520 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  drB);..  /* Jump
12530 20 70 61 73 74 20 74 68 65 20 76 61 72 69 6f 75   past the variou
12540 73 20 73 75 62 72 6f 75 74 69 6e 65 73 20 61 6e  s subroutines an
12550 64 20 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20  d coroutines to 
12560 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65  the main.  ** me
12570 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
12580 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
12590 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
125a0 6f 29 3b 0a 20 20 61 64 64 72 53 65 6c 65 63 74  o);.  addrSelect
125b0 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  A = sqlite3VdbeC
125c0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
125d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
125e0 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
125f0 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
12600 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74  T statement to t
12610 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20  he.  ** left of 
12620 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  the compound ope
12630 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20  rator - the "A" 
12640 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56  select..  */.  V
12650 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
12660 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74  v, "Begin corout
12670 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c  ine for left SEL
12680 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72  ECT"));.  pPrior
12690 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
126a0 6d 69 74 41 3b 0a 20 20 73 71 6c 69 74 65 33 53  mitA;.  sqlite3S
126b0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
126c0 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20  rior, &destA);. 
126d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
126e0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
126f0 2c 20 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20  , 1, regEofA);. 
12700 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12710 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
12720 72 65 67 41 64 64 72 41 29 3b 0a 20 20 56 64 62  regAddrA);.  Vdb
12730 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
12740 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20   "End coroutine 
12750 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22  for left SELECT"
12760 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ));..  /* Genera
12770 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
12780 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
12790 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
127a0 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67  on .  ** the rig
127b0 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c  ht - the "B" sel
127c0 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ect.  */.  addrS
127d0 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33  electB = sqlite3
127e0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
127f0 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f  v);.  VdbeNoopCo
12800 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
12810 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
12820 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
12830 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70    savedLimit = p
12840 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65  ->iLimit;.  save
12850 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  dOffset = p->iOf
12860 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  fset;.  p->iLimi
12870 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20  t = regLimitB;. 
12880 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
12890 20 20 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65    .  sqlite3Sele
128a0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
128b0 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d  estB);.  p->iLim
128c0 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b  it = savedLimit;
128d0 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
128e0 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73  savedOffset;.  s
128f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12900 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
12910 31 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73  1, regEofB);.  s
12920 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12930 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
12940 67 41 64 64 72 42 29 3b 0a 20 20 56 64 62 65 4e  gAddrB);.  VdbeN
12950 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
12960 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  End coroutine fo
12970 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29  r right SELECT")
12980 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
12990 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
129a0 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
129b0 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
129c0 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he A.  ** select
129d0 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
129e0 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
129f0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
12a00 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
12a10 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
12a20 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41  ut routine for A
12a30 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20  "));.  addrOutA 
12a40 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
12a50 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
12a60 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
12a70 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70      p, &destA, p
12a80 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20  Dest, regOutA,. 
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12aa0 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
12ab0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
12ac0 44 4f 46 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  DOFF, labelEnd);
12ad0 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  .  .  /* Generat
12ae0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
12af0 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
12b00 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
12b10 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he B.  ** select
12b20 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
12b30 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
12b40 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
12b50 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
12b60 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
12b70 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62  UNION ){.    Vdb
12b80 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
12b90 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
12ba0 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61   for B"));.    a
12bb0 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61  ddrOutB = genera
12bc0 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
12bd0 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
12be0 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
12bf0 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65  destB, pDest, re
12c00 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20  gOutB,.         
12c10 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
12c20 20 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59   pKeyDup, P4_KEY
12c30 49 4e 46 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62  INFO_STATIC, lab
12c40 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f  elEnd);.  }..  /
12c50 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
12c60 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
12c70 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
12c80 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20  from select A.  
12c90 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
12ca0 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
12cb0 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69  n select B remai
12cc0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ns..  */.  VdbeN
12cd0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
12ce0 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  eof-A subroutine
12cf0 22 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  "));.  if( op==T
12d00 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
12d10 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
12d20 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73      addrEofA = s
12d30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12d40 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
12d50 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c  labelEnd);.  }el
12d60 73 65 7b 20 20 0a 20 20 20 20 61 64 64 72 45 6f  se{  .    addrEo
12d70 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
12d80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
12d90 20 72 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45   regEofB, labelE
12da0 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nd);.    sqlite3
12db0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12dc0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
12dd0 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20   addrOutB);.    
12de0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12df0 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
12e00 65 67 41 64 64 72 42 29 3b 0a 20 20 20 20 73 71  egAddrB);.    sq
12e10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12e20 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
12e30 64 64 72 45 6f 66 41 29 3b 0a 20 20 7d 0a 0a 20  ddrEofA);.  }.. 
12e40 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
12e50 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
12e60 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
12e70 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a  s from select B.
12e80 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
12e90 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
12ea0 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d   in select A rem
12eb0 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
12ec0 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
12ed0 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
12ee0 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20  B = addrEofA;.  
12ef0 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
12f00 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
12f10 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69   "eof-B subrouti
12f20 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
12f30 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofB = sqlite3Vdb
12f40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
12f50 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c  , regEofA, label
12f60 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  End);.    sqlite
12f70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12f80 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
12f90 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
12fa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12fb0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
12fc0 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73  regAddrA);.    s
12fd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12fe0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
12ff0 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a  addrEofB);.  }..
13000 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
13010 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
13020 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
13030 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
13040 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
13050 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
13060 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
13070 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13080 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
13090 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
130a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
130b0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
130c0 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
130d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
130e0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
130f0 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73  , addrEofA);.  s
13100 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13110 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
13120 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
13130 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13140 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
13150 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
13160 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
13170 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
13180 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
13190 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
131a0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
131b0 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
131c0 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
131d0 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
131e0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
131f0 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
13200 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
13210 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
13220 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13230 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
13240 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73  regAddrA);.    s
13250 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13260 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
13270 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  fA, addrEofA);. 
13280 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13290 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
132a0 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
132b0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
132c0 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
132d0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e  e the case of A>
132e0 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
132f0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
13300 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  gt-B subroutine"
13310 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d  ));.  addrAgtB =
13320 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
13330 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
13340 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
13350 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
13360 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13370 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
13380 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
13390 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  OutB);.  }.  sql
133a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
133b0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
133c0 64 64 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrB);.  sqlite3
133d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
133e0 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64  _If, regEofB, ad
133f0 64 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74  drEofB);.  sqlit
13400 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13410 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
13420 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  lCmpr);..  /* Th
13430 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63  is code runs onc
13440 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
13450 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  everything..  */
13460 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
13470 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
13480 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13490 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
134a0 2c 20 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20  , 0, regEofA);. 
134b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
134c0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
134d0 2c 20 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20  , 0, regEofB);. 
134e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
134f0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
13500 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 53 65  regAddrA, addrSe
13510 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  lectA);.  sqlite
13520 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13530 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72  P_Gosub, regAddr
13540 42 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b  B, addrSelectB);
13550 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13560 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
13570 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41  egEofA, addrEofA
13580 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13590 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
135a0 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f   regEofB, addrEo
135b0 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65  fB);..  /* Imple
135c0 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65  ment the main me
135d0 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
135e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
135f0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
13600 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cmpr);.  sqlite3
13610 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13620 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c  _Permutation, 0,
13630 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50   0, 0, (char*)aP
13640 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52  ermute, P4_INTAR
13650 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  RAY);.  sqlite3V
13660 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13670 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69  Compare, destA.i
13680 4d 65 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c  Mem, destB.iMem,
13690 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136b0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
136c0 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
136d0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c  _HANDOFF);.  sql
136e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
136f0 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41  , OP_Jump, addrA
13700 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61  ltB, addrAeqB, a
13710 64 64 72 41 67 74 42 29 3b 0a 0a 20 20 2f 2a 20  ddrAgtB);..  /* 
13720 52 65 6c 65 61 73 65 20 74 65 6d 70 6f 72 61 72  Release temporar
13730 79 20 72 65 67 69 73 74 65 72 73 0a 20 20 2a 2f  y registers.  */
13740 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29  .  if( regPrev )
13750 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  {.    sqlite3Rel
13760 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
13770 61 72 73 65 2c 20 72 65 67 50 72 65 76 2c 20 6e  arse, regPrev, n
13780 4f 72 64 65 72 42 79 2b 31 29 3b 0a 20 20 7d 0a  OrderBy+1);.  }.
13790 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
137a0 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  e this point in 
137b0 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61  order to termina
137c0 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  te the query..  
137d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
137e0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
137f0 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a  labelEnd);..  /*
13800 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
13810 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  of output column
13820 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  s.  */.  if( pDe
13830 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
13840 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c  utput ){.    Sel
13850 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50  ect *pFirst = pP
13860 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  rior;.    while(
13870 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
13880 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
13890 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67  t->pPrior;.    g
138a0 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
138b0 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
138c0 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
138d0 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d   }..  /* Reassem
138e0 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  bly the compound
138f0 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69   query so that i
13900 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
13910 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62  correctly.  ** b
13920 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
13930 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20  nction */.  if( 
13940 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
13950 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
13960 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69  lete(db, p->pPri
13970 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50  or);.  }.  p->pP
13980 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a  rior = pPrior;..
13990 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73    /*** TBD:  Ins
139a0 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ert subroutine c
139b0 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75  alls to close cu
139c0 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c  rsors on incompl
139d0 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75  ete.  **** subqu
139e0 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 72 65  eries ****/.  re
139f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13a00 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
13a10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
13a20 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
13a30 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13a40 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f  OMIT_VIEW)./* Fo
13a50 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f  rward Declaratio
13a60 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns */.static voi
13a70 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
13a80 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69  sqlite3*, ExprLi
13a90 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  st*, int, ExprLi
13aa0 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
13ab0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71  d substSelect(sq
13ac0 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a  lite3*, Select *
13ad0 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20  , int, ExprList 
13ae0 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  *);../*.** Scan 
13af0 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
13b00 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
13b10 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
13b20 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
13b30 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
13b40 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
13b50 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
13b60 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
13b70 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
13b80 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
13b90 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
13ba0 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
13bb0 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
13bc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
13bd0 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
13be0 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
13bf0 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
13c00 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
13c10 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
13c20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
13c30 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
13c40 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
13c50 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
13c60 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
13c70 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
13c80 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
13c90 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
13ca0 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
13cb0 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
13cc0 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
13cd0 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
13ce0 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
13cf0 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
13d00 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
13d10 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
13d20 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
13d30 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
13d40 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
13d50 69 64 20 73 75 62 73 74 45 78 70 72 28 0a 20 20  id substExpr(.  
13d60 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
13d70 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
13d80 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74  lloc errors to t
13d90 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  his connection *
13da0 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
13db0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20          /* Expr 
13dc0 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74  in which substit
13dd0 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a  ution occurs */.
13de0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
13df0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
13e00 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
13e10 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
13e20 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62  pEList    /* Sub
13e30 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69  stitute expressi
13e40 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ons */.){.  if( 
13e50 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
13e60 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
13e70 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
13e80 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
13e90 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66  iTable ){.    if
13ea0 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
13eb0 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  <0 ){.      pExp
13ec0 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
13ed0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13ee0 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
13ef0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
13f00 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  st!=0 && pExpr->
13f10 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e  iColumn<pEList->
13f20 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
13f30 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
13f40 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
13f50 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
13f60 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73      pNew = pELis
13f70 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
13f80 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  umn].pExpr;.    
13f90 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d    assert( pNew!=
13fa0 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
13fb0 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b  ->op = pNew->op;
13fc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13fd0 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29  Expr->pLeft==0 )
13fe0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
13ff0 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
14000 70 72 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e  prDup(db, pNew->
14010 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
14020 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
14030 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
14040 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
14050 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
14060 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69 67  p(db, pNew->pRig
14070 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 45  ht, 0);.      pE
14080 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e  xpr->iTable = pN
14090 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ew->iTable;.    
140a0 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20    pExpr->pTab = 
140b0 70 4e 65 77 2d 3e 70 54 61 62 3b 0a 20 20 20 20  pNew->pTab;.    
140c0 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
140d0 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e   = pNew->iColumn
140e0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
140f0 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67  Agg = pNew->iAgg
14100 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
14110 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45  okenCopy(db, &pE
14120 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65  xpr->token, &pNe
14130 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  w->token);.     
14140 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
14150 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 73 70  y(db, &pExpr->sp
14160 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29  an, &pNew->span)
14170 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14180 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3d 3d  pExpr->x.pList==
14190 30 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 53  0 && pExpr->x.pS
141a0 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  elect==0 );.    
141b0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
141c0 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
141d0 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
141e0 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53       pExpr->x.pS
141f0 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
14200 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4e 65  electDup(db, pNe
14210 77 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 30 29  w->x.pSelect, 0)
14220 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14230 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e         pExpr->x.
14240 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
14250 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
14260 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 29  New->x.pList, 0)
14270 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14280 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70  pExpr->flags = p
14290 4e 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  New->flags;.    
142a0 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
142b0 6f 20 3d 20 70 4e 65 77 2d 3e 70 41 67 67 49 6e  o = pNew->pAggIn
142c0 66 6f 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  fo;.      pNew->
142d0 70 41 67 67 49 6e 66 6f 20 3d 20 30 3b 0a 20 20  pAggInfo = 0;.  
142e0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
142f0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
14300 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61  Expr->pLeft, iTa
14310 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
14320 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
14330 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
14340 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
14350 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
14360 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
14370 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
14380 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
14390 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(db, pExpr->x.p
143a0 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
143b0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c  pEList);.    }el
143c0 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45  se{.      substE
143d0 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70  xprList(db, pExp
143e0 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62  r->x.pList, iTab
143f0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
14400 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
14410 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
14420 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st(.  sqlite3 *d
14430 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
14440 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
14450 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70  rs here */.  Exp
14460 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
14470 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61    /* List to sca
14480 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74  n and in which t
14490 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
144a0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  es */.  int iTab
144b0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
144c0 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
144d0 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
144e0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
144f0 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
14500 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  values */.){.  i
14510 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
14520 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
14530 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
14540 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
14550 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62      substExpr(db
14560 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
14570 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  xpr, iTable, pEL
14580 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  ist);.  }.}.stat
14590 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
145a0 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
145b0 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
145c0 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
145d0 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65  ors here */.  Se
145e0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
145f0 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
14600 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20  tement in which 
14610 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
14620 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tions */.  int i
14630 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
14640 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72  /* Table to be r
14650 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70  eplaced */.  Exp
14660 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
14670 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
14680 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53  values */.){.  S
14690 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
146a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
146b0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
146c0 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20  t i;.  if( !p ) 
146d0 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45  return;.  substE
146e0 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
146f0 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  EList, iTable, p
14700 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
14710 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
14720 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c  GroupBy, iTable,
14730 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
14740 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
14750 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c  >pOrderBy, iTabl
14760 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
14770 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
14780 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20  Having, iTable, 
14790 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
147a0 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65  Expr(db, p->pWhe
147b0 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  re, iTable, pELi
147c0 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65  st);.  substSele
147d0 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  ct(db, p->pPrior
147e0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
147f0 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  );.  pSrc = p->p
14800 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
14810 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20  Src );  /* Even 
14820 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20 77  for (SELECT 1) w
14830 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20  e have: pSrc!=0 
14840 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d  but pSrc->nSrc==
14850 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59  0 */.  if( ALWAY
14860 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66  S(pSrc) ){.    f
14870 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c  or(i=pSrc->nSrc,
14880 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20   pItem=pSrc->a; 
14890 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
148a0 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53  +){.      substS
148b0 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d  elect(db, pItem-
148c0 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  >pSelect, iTable
148d0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
148e0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
148f0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14900 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
14910 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
14920 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
14930 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
14940 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
14950 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
14960 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
14970 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  W)./*.** This ro
14980 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
14990 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65  o flatten subque
149a0 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  ries in order to
149b0 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74   speed.** execut
149c0 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ion.  It returns
149d0 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
149e0 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
149f0 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a  no flattening.**
14a00 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
14a10 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
14a20 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
14a30 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
14a40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
14a50 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
14a60 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
14a70 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
14a80 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
14a90 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
14aa0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
14ab0 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
14ac0 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
14ad0 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
14ae0 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
14af0 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
14b00 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
14b10 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14b20 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
14b30 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
14b40 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
14b50 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
14b60 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
14b70 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
14b80 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
14b90 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
14ba0 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
14bb0 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
14bc0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
14bd0 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
14be0 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
14bf0 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
14c00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
14c10 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
14c20 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
14c30 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
14c40 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
14c50 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
14c60 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
14c70 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
14c80 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
14c90 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
14ca0 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
14cb0 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
14cc0 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  mpification give
14cd0 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
14ce0 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
14cf0 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
14d00 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
14d10 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
14d20 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
14d30 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
14d40 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
14d50 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
14d60 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
14d70 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
14d80 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
14d90 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
14da0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
14db0 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
14dc0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
14dd0 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
14de0 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
14df0 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  se aggregates..*
14e00 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20  *.**   (2)  The 
14e10 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
14e20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
14e30 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
14e40 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
14e50 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20  *.**   (3)  The 
14e60 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
14e70 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
14e80 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65  d of a left oute
14e90 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20  r join.**       
14ea0 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63   (Originally tic
14eb0 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e  ket #306.  Stren
14ec0 67 68 74 65 6e 65 64 20 62 79 20 74 69 63 6b 65  ghtened by ticke
14ed0 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20  t #3300).**.**  
14ee0 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
14ef0 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
14f00 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
14f10 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
14f20 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  oin..**.**   (5)
14f30 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
14f40 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
14f50 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
14f60 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
14f70 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
14f80 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29  tes..**.**   (6)
14f90 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
14fa0 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
14fb0 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
14fc0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
14fd0 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
14fe0 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
14ff0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68    The subquery h
15000 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  as a FROM clause
15010 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54  ..**.**   (8)  T
15020 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
15030 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
15040 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
15050 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
15060 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68  .**.**   (9)  Th
15070 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
15080 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
15090 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
150a0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
150b0 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
150c0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20  es..**.**  (10) 
150d0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
150e0 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
150f0 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
15100 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
15110 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20  t.**        use 
15120 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
15130 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
15140 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
15150 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
15160 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
15170 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
15180 31 32 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65  12)  Not impleme
15190 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20  nted.  Subsumed 
151a0 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  into restriction
151b0 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69   (3).  Was previ
151c0 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ously.**        
151d0 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72  a separate restr
151e0 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20  iction deriving 
151f0 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30  from ticket #350
15200 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54  ..**.**  (13)  T
15210 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
15220 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
15230 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
15240 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54  T.**.**  (14)  T
15250 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
15260 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 0a   not use OFFSET.
15270 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65  **.**  (15)  The
15280 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
15290 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  not part of a co
152a0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72  mpound select or
152b0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
152c0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
152d0 20 68 61 76 65 20 62 6f 74 68 20 61 6e 20 4f 52   have both an OR
152e0 44 45 52 20 42 59 20 61 6e 64 20 61 20 4c 49 4d  DER BY and a LIM
152f0 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20  IT clause..**   
15300 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
15310 20 23 32 33 33 39 29 0a 2a 2a 0a 2a 2a 20 20 28   #2339).**.**  (
15320 31 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  16)  The outer q
15330 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
15340 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
15350 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a  subquery does.**
15360 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74          not cont
15370 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28  ain ORDER BY.  (
15380 54 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54  Ticket #2942)  T
15390 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20  his used to not 
153a0 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  matter.**       
153b0 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64   until we introd
153c0 75 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63  uced the group_c
153d0 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e  oncat() function
153e0 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20  .  .**.**  (17) 
153f0 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   The sub-query i
15400 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64  s not a compound
15410 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69   select, or it i
15420 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a  s a UNION ALL .*
15430 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e  *        compoun
15440 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70  d clause made up
15450 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e   entirely of non
15460 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
15470 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20  es, and .**     
15480 20 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75     the parent qu
15490 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ery:.**.**      
154a0 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73      * is not its
154b0 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f  elf part of a co
154c0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a  mpound select,.*
154d0 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
154e0 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
154f0 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65   or DISTINCT que
15500 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ry, and.**      
15510 20 20 20 20 2a 20 68 61 73 20 6e 6f 20 6f 74 68      * has no oth
15520 65 72 20 74 61 62 6c 65 73 20 6f 72 20 73 75 62  er tables or sub
15530 2d 73 65 6c 65 63 74 73 20 69 6e 20 74 68 65 20  -selects in the 
15540 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
15550 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61  **        The pa
15560 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65  rent and sub-que
15570 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57  ry may contain W
15580 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75  HERE clauses. Su
15590 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20  bject to.**     
155a0 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28     rules (11), (
155b0 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68  13) and (14), th
155c0 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  ey may also cont
155d0 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a  ain ORDER BY,.**
155e0 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e          LIMIT an
155f0 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
15600 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49  ..**.**  (18)  I
15610 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
15620 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
15630 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74  lect, then all t
15640 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20  erms of the.**  
15650 20 20 20 20 20 20 4f 52 44 45 52 20 62 79 20 63        ORDER by c
15660 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72  lause of the par
15670 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70  ent must be simp
15680 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  le references to
15690 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75   .**        colu
156a0 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71  mns of the sub-q
156b0 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39  uery..**.**  (19
156c0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
156d0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
156e0 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
156f0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a  query does not.*
15700 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20  *        have a 
15710 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
15720 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68  .**  (20)  If th
15730 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
15740 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
15750 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e  , then it must n
15760 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
15770 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
15780 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37  use.  Ticket #37
15790 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65  73.  We could re
157a0 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61  lax this constra
157b0 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f  int.**        so
157c0 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67  mewhat by saying
157d0 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20   that the terms 
157e0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
157f0 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20  clause must.**  
15800 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20        appear as 
15810 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c  unmodified resul
15820 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
15830 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
15840 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  ut.**        hav
15850 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61  e other optimiza
15860 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f  tions in mind to
15870 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20   deal with that 
15880 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  case..**.** In t
15890 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
158a0 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
158b0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
158c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
158d0 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
158e0 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
158f0 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
15900 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
15910 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
15920 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
15930 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
15940 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
15950 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
15960 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
15970 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
15980 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
15990 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
159a0 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
159b0 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
159c0 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
159d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
159e0 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
159f0 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
15a00 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
15a10 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
15a20 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
15a30 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
15a40 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
15a50 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
15a60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
15a70 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
15a80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
15a90 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
15aa0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
15ab0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
15ac0 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
15ad0 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
15ae0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
15af0 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
15b00 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
15b10 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
15b20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
15b30 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
15b40 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
15b50 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
15b60 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
15b70 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
15b80 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
15b90 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
15ba0 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
15bb0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
15bc0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
15bd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
15be0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
15bf0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
15c00 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20  ntext;.  Select 
15c10 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65  *pParent;.  Sele
15c20 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20  ct *pSub;       
15c30 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  /* The inner que
15c40 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22  ry or "subquery"
15c50 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
15c60 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69  ub1;      /* Poi
15c70 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
15c80 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20  tmost select in 
15c90 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53  sub-query */.  S
15ca0 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
15cb0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
15cc0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
15cd0 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
15ce0 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
15cf0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
15d00 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
15d10 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
15d20 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
15d30 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
15d40 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
15d50 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
15d60 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
15d70 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
15d80 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
15d90 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
15da0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15dc0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
15dd0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15df0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
15e00 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
15e10 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
15e20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
15e30 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
15e40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15e50 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
15e60 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
15e70 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
15e80 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
15e90 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
15ea0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
15eb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
15ec0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f  >pPrior==0 );  /
15ed0 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74  * Unable to flat
15ee0 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  ten compound que
15ef0 72 69 65 73 20 2a 2f 0a 20 20 70 53 72 63 20 3d  ries */.  pSrc =
15f00 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
15f10 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
15f20 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
15f30 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
15f40 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
15f50 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72  a[iFrom];.  iPar
15f60 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
15f70 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20  iCursor;.  pSub 
15f80 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
15f90 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
15fa0 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Sub!=0 );.  if( 
15fb0 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72  isAgg && subquer
15fc0 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
15fd0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
15fe0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
15ff0 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (1)  */.  if( 
16000 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26  subqueryIsAgg &&
16010 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
16020 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
16030 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
16040 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62  n (2)  */.  pSub
16050 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
16060 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
16070 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
16080 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
16090 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
160a0 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
160b0 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
160c0 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
160d0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
160e0 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65  sions, we allowe
160f0 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67  d some combining
16100 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   of LIMIT and OF
16110 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73  FSET.  ** becaus
16120 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20  e they could be 
16130 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70  computed at comp
16140 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77  ile-time.  But w
16150 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
16160 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65  FSET.  ** became
16170 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
16180 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20  ssions, we were 
16190 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65  forced to add re
161a0 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a  strictions (13).
161b0 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a    ** and (14). *
161c0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
161d0 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69  imit && p->pLimi
161e0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
161f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
16200 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a  striction (13) *
16210 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f  /.  if( pSub->pO
16220 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30  ffset ) return 0
16230 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
16250 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a  striction (14) *
16260 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68  /.  if( p->pRigh
16270 74 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70  tmost && pSub->p
16280 4c 69 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70  Limit && pSub->p
16290 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72  OrderBy ){.    r
162a0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162d0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
162e0 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20  on (15) */.  }. 
162f0 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
16300 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
16310 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16320 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
16330 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20  iction (7)  */. 
16340 20 69 66 28 20 28 28 70 53 75 62 2d 3e 73 65 6c   if( ((pSub->sel
16350 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
16360 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 75 62 2d  nct)!=0 || pSub-
16370 3e 70 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20  >pLimit) .      
16380 20 20 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72     && (pSrc->nSr
16390 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
163a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
163b0 74 72 69 63 74 69 6f 6e 73 20 28 34 29 28 35 29  trictions (4)(5)
163c0 28 38 29 28 39 29 20 2a 2f 0a 20 20 20 20 20 72  (8)(9) */.     r
163d0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 0a  eturn 0;       .
163e0 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65    }.  if( (p->se
163f0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
16400 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71  inct)!=0 && subq
16410 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
16420 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
16430 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
16440 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20  on (6)  */.  }. 
16450 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
16460 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
16470 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  By ){.     retur
16480 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
164b0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
164c0 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  1) */.  }.  if( 
164d0 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70  isAgg && pSub->p
164e0 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e  OrderBy ) return
164f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
16500 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
16510 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20  n (16) */.  if( 
16520 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
16530 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
16540 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
16550 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
16560 6e 20 28 31 39 29 20 2a 2f 0a 0a 20 20 2f 2a 20  n (19) */..  /* 
16570 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
16580 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63   1:.  ** Restric
16590 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20  tion 3:  If the 
165a0 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f  subquery is a jo
165b0 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
165c0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20  e subquery is . 
165d0 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20   ** not used as 
165e0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
165f0 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f  d of an outer jo
16600 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66  in.  Examples of
16610 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69   why this.  ** i
16620 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
16630 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
16640 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
16650 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
16660 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
16670 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
16680 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
16690 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
166a0 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
166b0 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
166c0 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
166d0 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
166e0 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
166f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c  .  **.  ** OBSOL
16700 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20  ETE COMMENT 2:. 
16710 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   ** Restriction 
16720 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71  12:  If the subq
16730 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
16740 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
16750 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a  eft outer.  ** j
16760 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
16770 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
16780 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
16790 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65  .  ** An example
167a0 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  s of why this is
167b0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
167c0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
167d0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
167e0 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
167f0 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e  M t2 WHERE t2.x>
16800 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  0).  **.  ** If 
16810 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
16820 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
16830 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
16840 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
16850 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45  TER JOIN t2) WHE
16860 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20  RE t2.x>0.  **. 
16870 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78   ** But the t2.x
16880 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77  >0 test will alw
16890 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55  ays fail on a NU
168a0 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68  LL row of t2, wh
168b0 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  ich.  ** effecti
168c0 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68  vely converts th
168d0 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74  e OUTER JOIN int
168e0 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e  o an INNER JOIN.
168f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20  .  **.  ** THIS 
16900 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45  OVERRIDES OBSOLE
16910 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e  TE COMMENTS 1 AN
16920 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20  D 2 ABOVE:.  ** 
16930 54 69 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f  Ticket #3300 sho
16940 77 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69  ws that flatteni
16950 6e 67 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ng the right ter
16960 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
16970 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74  .  ** is fraught
16980 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42   with danger.  B
16990 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65  est to avoid the
169a0 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49   whole thing.  I
169b0 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  f the.  ** subqu
169c0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
169d0 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
169e0 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  JOIN, then do no
169f0 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a  t flatten..  */.
16a00 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d    if( (pSubitem-
16a10 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  >jointype & JT_O
16a20 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
16a30 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
16a40 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
16a50 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  17: If the sub-q
16a60 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
16a70 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
16a80 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
16a90 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
16aa0 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
16ab0 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
16ac0 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
16ad0 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
16ae0 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
16af0 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
16b00 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
16b10 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
16b20 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
16b30 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
16b40 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
16b50 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
16b60 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
16b70 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63  n 0;  /* Restric
16b80 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d  tion 20 */.    }
16b90 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
16ba0 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
16bb0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
16bc0 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
16bd0 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
16be0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  n 0;.    }.    f
16bf0 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
16c00 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
16c10 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
16c20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65    if( (pSub1->se
16c30 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
16c40 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
16c50 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c  te))!=0.       |
16c60 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  | (pSub1->pPrior
16c70 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54   && pSub1->op!=T
16c80 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c  K_ALL) .       |
16c90 7c 20 21 70 53 75 62 31 2d 3e 70 53 72 63 20 7c  | !pSub1->pSrc |
16ca0 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  | pSub1->pSrc->n
16cb0 53 72 63 21 3d 31 0a 20 20 20 20 20 20 29 7b 0a  Src!=1.      ){.
16cc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
16cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16ce0 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74  .    /* Restrict
16cf0 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69  ion 18. */.    i
16d00 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
16d10 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a  {.      int ii;.
16d20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
16d30 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  ii<p->pOrderBy->
16d40 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
16d50 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
16d60 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 69 43 6f  derBy->a[ii].iCo
16d70 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
16d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16d90 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20   }..  /***** If 
16da0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
16db0 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20  int, flattening 
16dc0 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a  is permitted. **
16dd0 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f  ***/..  /* Autho
16de0 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72  rize the subquer
16df0 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a  y */.  pParse->z
16e00 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53  AuthContext = pS
16e10 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  ubitem->zName;. 
16e20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
16e30 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
16e40 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
16e50 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  );.  pParse->zAu
16e60 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
16e70 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  edAuthContext;..
16e80 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
16e90 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
16ea0 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
16eb0 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72  ment, then (by r
16ec0 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a  estrictions.  **
16ed0 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65   17 and 18 above
16ee0 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55  ) it must be a U
16ef0 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65  NION ALL and the
16f00 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75   parent query mu
16f10 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74  st .  ** be of t
16f20 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
16f30 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65  **     SELECT <e
16f40 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28  xpr-list> FROM (
16f50 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68  <sub-query>) <wh
16f60 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a  ere-clause> .  *
16f70 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  *.  ** followed 
16f80 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  by any ORDER BY,
16f90 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46   LIMIT and/or OF
16fa0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
16fb0 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72  is block.  ** cr
16fc0 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73  eates N-1 copies
16fd0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71   of the parent q
16fe0 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79  uery without any
16ff0 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
17000 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54   or .  ** OFFSET
17010 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69   clauses and joi
17020 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c  ns them to the l
17030 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  eft-hand-side of
17040 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
17050 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41  ** using UNION A
17060 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e  LL operators. In
17070 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20   this case N is 
17080 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  the number of si
17090 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74  mple.  ** select
170a0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
170b0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
170c0 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  query..  **.  **
170d0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
170e0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
170f0 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20  +1 FROM (.  **  
17100 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46        SELECT x F
17110 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
17120 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
17130 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
17140 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   y FROM tab.  **
17150 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
17160 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
17170 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52  LECT abs(z*2) FR
17180 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20  OM tab2.  **    
17190 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52   ) WHERE a!=5 OR
171a0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
171b0 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
171c0 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
171d0 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52     SELECT x+1 FR
171e0 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31  OM tab WHERE x+1
171f0 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
17200 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
17210 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20  SELECT y+1 FROM 
17220 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35  tab WHERE y+1!=5
17230 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
17240 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
17250 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46  ECT abs(z*2)+1 F
17260 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61  ROM tab2 WHERE a
17270 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a  bs(z*2)+1!=5.  *
17280 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31  *     ORDER BY 1
17290 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61  .  **.  ** We ca
172a0 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d  ll this the "com
172b0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
172c0 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f  lattening"..  */
172d0 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62  .  for(pSub=pSub
172e0 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20  ->pPrior; pSub; 
172f0 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
17300 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
17310 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69  pNew;.    ExprLi
17320 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
17330 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
17340 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70  Expr *pLimit = p
17350 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65  ->pLimit;.    Se
17360 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
17370 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
17380 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
17390 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
173a0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
173b0 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  0;.    p->pLimit
173c0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d   = 0;.    pNew =
173d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
173e0 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20  p(db, p, 0);.   
173f0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
17400 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  mit;.    p->pOrd
17410 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
17420 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  .    p->pSrc = p
17430 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  Src;.    p->op =
17440 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e   TK_ALL;.    p->
17450 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
17460 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
17470 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
17480 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73  pPrior;.    }els
17490 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  e{.      pNew->p
174a0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
174b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67        pNew->pRig
174c0 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20  htmost = 0;.    
174d0 7d 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  }.    p->pPrior 
174e0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20  = pNew;.    if( 
174f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17500 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
17510 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61  ..  /* Begin fla
17520 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f  ttening the iFro
17530 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
17540 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20  e FROM clause . 
17550 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72   ** in the outer
17560 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
17570 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53  Sub = pSub1 = pS
17580 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
17590 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
175a0 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  e transient tabl
175b0 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f  e structure asso
175c0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
175d0 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20    ** subquery.  
175e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
175f0 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
17600 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73  >zDatabase);.  s
17610 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
17620 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
17630 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
17640 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
17650 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62  >zAlias);.  pSub
17660 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  item->zDatabase 
17670 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
17680 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53  >zName = 0;.  pS
17690 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ubitem->zAlias =
176a0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
176b0 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20  pSelect = 0;..  
176c0 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e  /* Defer deletin
176d0 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  g the Table obje
176e0 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
176f0 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
17700 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20  uery until code 
17710 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20  generation is.  
17720 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e  ** complete, sin
17730 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69  ce there may sti
17740 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54  ll exist Expr.pT
17750 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a  ab entries that.
17760 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68    ** refer to th
17770 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20  e subquery even 
17780 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  after flattening
17790 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e  .  Ticket #3346.
177a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
177b0 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b  item->pTab!=0 ){
177c0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
177d0 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d  ToDel = pSubitem
177e0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
177f0 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d  pTabToDel->nRef=
17800 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  =1 ){.      pTab
17810 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62  ToDel->pNextZomb
17820 69 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 5a 6f  ie = pParse->pZo
17830 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70  mbieTab;.      p
17840 50 61 72 73 65 2d 3e 70 5a 6f 6d 62 69 65 54 61  Parse->pZombieTa
17850 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20  b = pTabToDel;. 
17860 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17870 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d  pTabToDel->nRef-
17880 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75  -;.    }.    pSu
17890 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  bitem->pTab = 0;
178a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
178b0 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75  ollowing loop ru
178c0 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
178d0 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f   term in a compo
178e0 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a  und-subquery.  *
178f0 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73  * flattening (as
17900 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
17910 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f  ).  If we are do
17920 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20  ing a different 
17930 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61  kind.  ** of fla
17940 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74  ttening - a flat
17950 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61  tening other tha
17960 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
17970 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
17980 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69   -.  ** then thi
17990 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73  s loop only runs
179a0 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   once..  **.  **
179b0 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73   This loop moves
179c0 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d   all of the FROM
179d0 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
179e0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
179f0 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  he.  ** the FROM
17a00 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
17a10 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66  uter query.  Bef
17a20 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20  ore doing this, 
17a30 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68  remember.  ** th
17a40 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
17a50 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  for the original
17a60 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f   outer query FRO
17a70 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a  M element in.  *
17a80 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20  * iParent.  The 
17a90 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77  iParent cursor w
17aa0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
17ab0 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63  d.  Subsequent c
17ac0 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63  ode.  ** will sc
17ad0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c  an expressions l
17ae0 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65  ooking for iPare
17af0 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  nt references an
17b00 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74  d replace.  ** t
17b10 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20  hose references 
17b20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73  with expressions
17b30 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f   that resolve to
17b40 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52   the subquery FR
17b50 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73  OM.  ** elements
17b60 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79   we are now copy
17b70 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66  ing in..  */.  f
17b80 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50  or(pParent=p; pP
17b90 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70  arent; pParent=p
17ba0 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20  Parent->pPrior, 
17bb0 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
17bc0 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62  r){.    int nSub
17bd0 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e  Src;.    u8 join
17be0 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53  type = 0;.    pS
17bf0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
17c00 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
17c10 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
17c20 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72  ry */.    nSubSr
17c30 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
17c40 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  c;  /* Number of
17c50 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65   terms in subque
17c60 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  ry FROM clause *
17c70 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61  /.    pSrc = pPa
17c80 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20  rent->pSrc;     
17c90 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
17ca0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
17cb0 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53  y */..    if( pS
17cc0 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  rc ){.      asse
17cd0 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29  rt( pParent==p )
17ce0 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65  ;  /* First time
17cf0 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
17d00 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74  p */.      joint
17d10 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ype = pSubitem->
17d20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65  jointype;.    }e
17d30 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
17d40 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b  t( pParent!=p );
17d50 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62    /* 2nd and sub
17d60 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68  sequent times th
17d70 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
17d80 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  /.      pSrc = p
17d90 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73  Parent->pSrc = s
17da0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
17db0 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29  end(db, 0, 0, 0)
17dc0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  ;.      if( pSrc
17dd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
17de0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
17df0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
17e00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17e10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
17e20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  The subquery use
17e30 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20  s a single slot 
17e40 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
17e50 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a  se of the outer.
17e60 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49      ** query.  I
17e70 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  f the subquery h
17e80 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
17e90 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20   element in its 
17ea0 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20  FROM clause,.   
17eb0 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20   ** then expand 
17ec0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17ed0 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f  to make space fo
17ee0 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  r it to hold all
17ef0 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a   elements.    **
17f00 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
17f10 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
17f20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
17f30 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54      **    SELECT
17f40 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53   * FROM tabA, (S
17f50 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62  ELECT * FROM sub
17f60 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a  1, sub2), tabB;.
17f70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
17f80 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61  e outer query ha
17f90 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73  s 3 slots in its
17fa0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f   FROM clause.  O
17fb0 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20  ne slot of the. 
17fc0 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
17fd0 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c  y (the middle sl
17fe0 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74  ot) is used by t
17ff0 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68  he subquery.  Th
18000 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c  e next.    ** bl
18010 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c  ock of code will
18020 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20   expand the out 
18030 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73  query to 4 slots
18040 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20  .  The middle.  
18050 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70    ** slot is exp
18060 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f  anded to two slo
18070 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ts in order to m
18080 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ake space for th
18090 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65  e.    ** two ele
180a0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f  ments in the FRO
180b0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
180c0 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  subquery..    */
180d0 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63  .    if( nSubSrc
180e0 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  >1 ){.      pPar
180f0 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  ent->pSrc = pSrc
18100 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
18110 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72  tEnlarge(db, pSr
18120 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72  c, nSubSrc-1,iFr
18130 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  om+1);.      if(
18140 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
18150 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  d ){.        bre
18160 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
18170 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66  }..    /* Transf
18180 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  er the FROM clau
18190 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  se terms from th
181a0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
181b0 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
181c0 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20   query..    */. 
181d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
181e0 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
181f0 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72     pSrc->a[i+iFr
18200 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  om] = pSubSrc->a
18210 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  [i];.      memse
18220 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  t(&pSubSrc->a[i]
18230 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62  , 0, sizeof(pSub
18240 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20  Src->a[i]));.   
18250 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69   }.    pSrc->a[i
18260 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  From].jointype =
18270 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20   jointype;.  .  
18280 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
18290 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
182a0 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
182b0 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
182c0 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
182d0 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
182e0 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
182f0 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  uery..    ** .  
18300 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
18310 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
18320 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46  LECT a+5, b*10 F
18330 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20  ROM (SELECT x*3 
18340 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20  AS a, y+10 AS b 
18350 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61  FROM t1) WHERE a
18360 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20  >b;.    **   \  
18370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18380 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
18390 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
183a0 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
183b0 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f  /.    **    \___
183c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
183d0 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
183e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
183f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
18400 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20     **.    ** We 
18410 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
18420 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
18430 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
18440 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
18450 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65  ee.    ** "a" we
18460 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33   substitute "x*3
18470 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  " and every plac
18480 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20  e we see "b" we 
18490 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30  substitute "y+10
184a0 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c  "..    */.    pL
184b0 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  ist = pParent->p
184c0 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69  EList;.    for(i
184d0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
184e0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
184f0 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20  Expr *pExpr;.   
18500 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
18510 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28  i].zName==0 && (
18520 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
18530 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e  [i].pExpr)->span
18540 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  .z!=0 ){.       
18550 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
18560 6d 65 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  me = .          
18570 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74       sqlite3DbSt
18580 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
18590 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20  )pExpr->span.z, 
185a0 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  pExpr->span.n);.
185b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
185c0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
185d0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c  db, pParent->pEL
185e0 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ist, iParent, pS
185f0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
18600 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
18610 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
18620 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
18630 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
18640 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
18650 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
18660 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
18670 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
18680 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
18690 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
186a0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
186b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
186c0 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rent->pOrderBy==
186d0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
186e0 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  nt->pOrderBy = p
186f0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
18700 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65       pSub->pOrde
18710 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rBy = 0;.    }el
18720 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  se if( pParent->
18730 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
18740 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
18750 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  db, pParent->pOr
18760 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  derBy, iParent, 
18770 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
18780 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
18790 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  b->pWhere ){.   
187a0 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
187b0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
187c0 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b  Sub->pWhere, 0);
187d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
187e0 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
187f0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71    }.    if( subq
18800 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
18810 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
18820 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29  nt->pHaving==0 )
18830 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
18840 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65  >pHaving = pPare
18850 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20  nt->pWhere;.    
18860 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
18870 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20  e = pWhere;.    
18880 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
18890 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
188a0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
188b0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
188c0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
188d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
188e0 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  d(db, pParent->p
188f0 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20  Having, .       
18900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18910 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
18920 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
18930 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 29  ub->pHaving, 0))
18940 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18950 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
18960 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  y==0 );.      pP
18970 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20  arent->pGroupBy 
18980 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
18990 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  tDup(db, pSub->p
189a0 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20  GroupBy, 0);.   
189b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75   }else{.      su
189c0 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
189d0 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69 50 61  ent->pWhere, iPa
189e0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
189f0 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
18a00 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  nt->pWhere = sql
18a10 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
18a20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c  pParent->pWhere,
18a30 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a   pWhere);.    }.
18a40 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c    .    /* The fl
18a50 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
18a60 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
18a70 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
18a80 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
18a90 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
18aa0 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nct. .    */.   
18ab0 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61   pParent->selFla
18ac0 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46  gs |= pSub->selF
18ad0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
18ae0 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20  ct;.  .    /*.  
18af0 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20    ** SELECT ... 
18b00 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
18b10 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20   LIMIT a OFFSET 
18b20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45  b) LIMIT x OFFSE
18b30 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  T y;.    **.    
18b40 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65  ** One is tempte
18b50 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20  d to try to add 
18b60 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69  a and b to combi
18b70 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20  ne the limits.  
18b80 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  But this.    ** 
18b90 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
18ba0 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
18bb0 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a   negative..    *
18bc0 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
18bd0 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
18be0 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20  pParent->pLimit 
18bf0 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a  = pSub->pLimit;.
18c00 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d        pSub->pLim
18c10 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  it = 0;.    }.  
18c20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  }..  /* Finially
18c30 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
18c40 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
18c50 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
18c60 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
18c70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   */.  sqlite3Sel
18c80 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
18c90 75 62 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ub1);..  return 
18ca0 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  1;.}.#endif /* !
18cb0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
18cc0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
18cd0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
18ce0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
18cf0 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
18d00 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
18d10 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
18d20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20  argument to see 
18d30 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69  if it.** is a mi
18d40 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
18d50 72 79 2e 20 52 65 74 75 72 6e 20 57 48 45 52 45  ry. Return WHERE
18d60 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
18d70 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
18d80 58 20 69 66 20 0a 2a 2a 20 69 74 20 69 73 2c 20  X if .** it is, 
18d90 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20  or 0 otherwise. 
18da0 41 74 20 70 72 65 73 65 6e 74 2c 20 61 20 71 75  At present, a qu
18db0 65 72 79 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ery is considere
18dc0 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d 69 6e  d to be.** a min
18dd0 28 29 2f 6d 61 78 28 29 20 71 75 65 72 79 20 69  ()/max() query i
18de0 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68  f:.**.**   1. Th
18df0 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ere is a single 
18e00 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 46 52  object in the FR
18e10 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
18e20 20 20 20 32 2e 20 54 68 65 72 65 20 69 73 20 61     2. There is a
18e30 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73 69   single expressi
18e40 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  on in the result
18e50 20 73 65 74 2c 20 61 6e 64 20 69 74 20 69 73 0a   set, and it is.
18e60 2a 2a 20 20 20 20 20 20 65 69 74 68 65 72 20 6d  **      either m
18e70 69 6e 28 78 29 20 6f 72 20 6d 61 78 28 78 29 2c  in(x) or max(x),
18e80 20 77 68 65 72 65 20 78 20 69 73 20 61 20 63 6f   where x is a co
18e90 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 2e 0a  lumn reference..
18ea0 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e  */.static u8 min
18eb0 4d 61 78 51 75 65 72 79 28 53 65 6c 65 63 74 20  MaxQuery(Select 
18ec0 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78  *p){.  Expr *pEx
18ed0 70 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  pr;.  ExprList *
18ee0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
18ef0 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c 69 73  st;..  if( pELis
18f00 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
18f10 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
18f20 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45 78  BY_NORMAL;.  pEx
18f30 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30  pr = pEList->a[0
18f40 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 45  ].pExpr;.  if( E
18f50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
18f60 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
18f70 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ct) ) return 0;.
18f80 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
18f90 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28  ->x.pList;.  if(
18fa0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
18fb0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 70  GG_FUNCTION || p
18fc0 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69  EList==0 || pELi
18fd0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
18fe0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
18ff0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
19000 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  r->op!=TK_AGG_CO
19010 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 57 48  LUMN ) return WH
19020 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
19030 41 4c 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  AL;.  if( pExpr-
19040 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65  >token.n!=3 ) re
19050 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
19060 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66 28  BY_NORMAL;.  if(
19070 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
19080 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74  ((char*)pExpr->t
19090 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d  oken.z,"min",3)=
190a0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
190b0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
190c0 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  IN;.  }else if( 
190d0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
190e0 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
190f0 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d  ken.z,"max",3)==
19100 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
19110 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
19120 58 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  X;.  }.  return 
19130 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
19140 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  RMAL;.}../*.** T
19150 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
19160 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
19170 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
19180 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
19190 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
191a0 65 63 6f 6e 64 20 61 72 67 6d 65 6e 74 20 69 73  econd argment is
191b0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
191c0 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f  aggregate-info o
191d0 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20  bject. This .** 
191e0 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
191f0 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
19200 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
19210 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
19220 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
19230 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c  **.** where tabl
19240 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  e is a database 
19250 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62  table, not a sub
19260 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
19270 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a   If the query.**
19280 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73   does match this
19290 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61   pattern, then a
192a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
192b0 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70  Table object rep
192c0 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62  resenting.** <tb
192d0 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  l> is returned. 
192e0 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
192f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
19300 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d  tic Table *isSim
19310 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20  pleCount(Select 
19320 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  *p, AggInfo *pAg
19330 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20  gInfo){.  Table 
19340 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70  *pTab;.  Expr *p
19350 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Expr;..  assert(
19360 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b   !p->pGroupBy );
19370 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  ..  if( p->pWher
19380 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  e || p->pEList->
19390 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20  nExpr!=1 .   || 
193a0 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
193b0 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30   || p->pSrc->a[0
193c0 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20  ].pSelect.  ){. 
193d0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
193e0 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  .  pTab = p->pSr
193f0 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
19400 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
19410 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
19420 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
19430 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20   !pTab->pSelect 
19440 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69  && pExpr );..  i
19450 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
19460 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
19470 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
19480 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
19490 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
194a0 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  ( (pAggInfo->aFu
194b0 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 6c 61  nc[0].pFunc->fla
194c0 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  gs&SQLITE_FUNC_C
194d0 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72  OUNT)==0 ) retur
194e0 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
194f0 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69  ->flags&EP_Disti
19500 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nct ) return 0;.
19510 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
19520 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
19530 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
19540 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
19550 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
19560 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
19570 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
19580 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
19590 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
195a0 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
195b0 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
195c0 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
195d0 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
195e0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
195f0 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
19600 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
19610 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
19620 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
19630 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
19640 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
19650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
19660 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
19670 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
19680 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
19690 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
196a0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
196b0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
196c0 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a  From->zIndex ){.
196d0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
196e0 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
196f0 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20     char *zIndex 
19700 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b  = pFrom->zIndex;
19710 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
19720 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
19730 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20  Tab->pIndex; .  
19740 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71        pIdx && sq
19750 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64  lite3StrICmp(pId
19760 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78  x->zName, zIndex
19770 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  ); .        pIdx
19780 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20  =pIdx->pNext.   
19790 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64   );.    if( !pId
197a0 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
197b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
197c0 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
197d0 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20  x: %s", zIndex, 
197e0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
197f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
19800 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e     }.    pFrom->
19810 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
19820 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
19830 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19840 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
19850 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  a Walker callbac
19860 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67  k for "expanding
19870 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
19880 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64  ment..** "Expand
19890 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f  ing" means to do
198a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
198b0 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
198c0 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
198d0 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
198e0 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
198f0 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
19900 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
19910 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
19920 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
19930 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
19940 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
19950 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
19960 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
19970 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
19980 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
19990 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
199a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
199b0 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
199c0 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
199d0 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
199e0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
199f0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
19a00 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
19a10 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
19a20 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
19a30 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
19a40 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
19a50 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
19a60 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
19a70 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
19a80 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
19a90 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
19aa0 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
19ab0 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
19ac0 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  resistent repres
19ad0 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
19ae0 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
19af0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
19b00 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
19b10 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
19b20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e  accomodate the N
19b30 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
19b40 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
19b50 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
19b60 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
19b70 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
19b80 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20    (4)  Scan the 
19b90 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
19ba0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
19bb0 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
19bc0 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
19bd0 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
19be0 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
19bf0 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
19c00 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
19c10 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
19c20 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
19c30 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
19c40 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
19c50 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
19c60 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
19c70 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
19c80 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  LE..**.*/.static
19c90 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e   int selectExpan
19ca0 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  der(Walker *pWal
19cb0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
19cc0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
19cd0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
19ce0 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  se;.  int i, j, 
19cf0 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  k;.  SrcList *pT
19d00 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
19d10 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74  st *pEList;.  st
19d20 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
19d30 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69  m *pFrom;.  sqli
19d40 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
19d50 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d  ->db;..  if( db-
19d60 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29  >mallocFailed  )
19d70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
19d80 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66  _Abort;.  }.  if
19d90 28 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20  ( p->pSrc==0 || 
19da0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
19db0 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29  F_Expanded)!=0 )
19dc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
19dd0 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 2d  _Prune;.  }.  p-
19de0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
19df0 45 78 70 61 6e 64 65 64 3b 0a 20 20 70 54 61 62  Expanded;.  pTab
19e00 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
19e10 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
19e20 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  List;..  /* Make
19e30 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
19e40 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
19e50 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
19e60 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
19e70 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
19e80 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
19e90 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
19ea0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
19eb0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
19ec0 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
19ed0 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
19ee0 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
19ef0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19f00 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
19f10 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
19f20 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
19f30 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
19f40 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
19f50 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
19f60 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
19f70 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
19f80 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
19f90 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
19fa0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
19fb0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
19fc0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
19fd0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
19fe0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
19ff0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69  ble *pTab;.    i
1a000 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
1a010 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
1a020 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
1a030 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
1a040 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
1a050 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
1a060 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
1a070 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1a080 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( i==0 );.     
1a090 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
1a0a0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
1a0b0 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
1a0c0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
1a0d0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1a0e0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
1a0f0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
1a100 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41  lect;.      /* A
1a110 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
1a120 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1a130 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
1a140 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21     assert( pSel!
1a150 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1a160 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
1a170 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1a180 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
1a190 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20  alker, pSel);.  
1a1a0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
1a1b0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
1a1c0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1a1d0 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
1a1e0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1a1f0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1a200 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
1a210 62 2d 3e 64 62 4d 65 6d 20 3d 20 64 62 2d 3e 6c  b->dbMem = db->l
1a220 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
1a230 64 20 3f 20 64 62 20 3a 20 30 3b 0a 20 20 20 20  d ? db : 0;.    
1a240 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
1a250 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e  ;.      pTab->zN
1a260 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
1a270 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
1a280 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20  _subquery_%p_", 
1a290 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20  (void*)pTab);.  
1a2a0 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
1a2b0 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20  >pPrior ){ pSel 
1a2c0 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20  = pSel->pPrior; 
1a2d0 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 43 6f  }.      selectCo
1a2e0 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
1a2f0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  t(pParse, pSel->
1a300 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
1a310 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
1a320 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69  );.      pTab->i
1a330 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20  PKey = -1;.     
1a340 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
1a350 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b  |= TF_Ephemeral;
1a360 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
1a370 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
1a380 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
1a390 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
1a3a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
1a3b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a3c0 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
1a3d0 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
1a3e0 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
1a3f0 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
1a400 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 30  teTable(pParse,0
1a410 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46  ,pFrom->zName,pF
1a420 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  rom->zDatabase);
1a430 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1a440 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1a450 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
1a460 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21  b->nRef++;.#if !
1a470 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1a480 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
1a490 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
1a4a0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
1a4b0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
1a4c0 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69  >pSelect || IsVi
1a4d0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
1a4e0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
1a4f0 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
1a500 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
1a510 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
1a520 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1a530 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
1a540 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
1a550 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
1a560 43 5f 41 62 6f 72 74 3b 0a 0a 20 20 20 20 20 20  C_Abort;..      
1a570 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70    /* If pFrom->p
1a580 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61  Select!=0 it mea
1a590 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
1a5a0 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20  g with a.       
1a5b0 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20   ** view within 
1a5c0 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c  a view.  The SEL
1a5d0 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61  ECT structure ha
1a5e0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  s already been. 
1a5f0 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64         ** copied
1a600 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69   by the outer vi
1a610 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69  ew so we can ski
1a620 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20  p the copy step 
1a630 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
1a640 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65  in the inner vie
1a650 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
1a660 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
1a670 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
1a680 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e           pFrom->
1a690 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
1a6a0 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
1a6b0 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Tab->pSelect, 0)
1a6c0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1a6d0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
1a6e0 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53  alker, pFrom->pS
1a6f0 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
1a700 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
1a710 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
1a720 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
1a730 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44  named by the IND
1a740 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
1a750 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
1a760 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  f( sqlite3Indexe
1a770 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  dByLookup(pParse
1a780 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
1a790 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
1a7a0 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rt;.    }.  }.. 
1a7b0 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
1a7c0 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
1a7d0 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
1a7e0 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
1a7f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
1a800 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
1a810 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
1a820 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  n(pParse, p) ){.
1a830 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
1a840 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  bort;.  }..  /* 
1a850 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
1a860 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
1a870 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
1a880 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
1a890 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
1a8a0 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
1a8b0 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
1a8c0 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
1a8d0 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
1a8e0 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
1a8f0 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
1a900 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
1a910 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
1a920 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
1a930 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  TK_ALL operator 
1a940 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
1a950 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
1a960 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20  e column list.. 
1a970 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
1a980 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
1a990 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
1a9a0 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73  _ALL expressions
1a9b0 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a   and expand.  **
1a9c0 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
1a9d0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
1a9e0 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
1a9f0 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
1aa00 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
1aa10 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
1aa20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
1aa30 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
1aa40 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
1aa50 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
1aa60 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
1aa70 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
1aa80 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
1aa90 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70  EList->a[k].pExp
1aaa0 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  r;.    if( pE->o
1aab0 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61  p==TK_ALL ) brea
1aac0 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  k;.    if( pE->o
1aad0 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
1aae0 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70  >pRight && pE->p
1aaf0 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  Right->op==TK_AL
1ab00 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 45  L.         && pE
1ab10 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70  ->pLeft && pE->p
1ab20 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Left->op==TK_ID 
1ab30 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
1ab40 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
1ab50 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
1ab60 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
1ab70 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
1ab80 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
1ab90 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
1aba0 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
1abb0 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
1abc0 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
1abd0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
1abe0 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
1abf0 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
1ac00 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
1ac10 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
1ac20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
1ac30 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1ac40 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
1ac50 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
1ac60 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
1ac70 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
1ac80 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
1ac90 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
1aca0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1acb0 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
1acc0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
1acd0 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67          && (flag
1ace0 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
1acf0 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
1ad00 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
1ad10 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
1ad20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1ad30 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
1ad40 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
1ad50 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20  !=TK_ALL &&.    
1ad60 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d         (pE->op!=
1ad70 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
1ad80 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  ight==0 || pE->p
1ad90 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  Right->op!=TK_AL
1ada0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  L) ){.        /*
1adb0 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
1adc0 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
1add0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
1ade0 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
1adf0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
1ae00 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
1ae10 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1ae20 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  , pNew, a[k].pEx
1ae30 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
1ae40 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
1ae50 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
1ae60 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
1ae70 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
1ae80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ae90 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
1aea0 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  0;.        a[k].
1aeb0 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
1aec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1aed0 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
1aee0 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
1aef0 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
1af00 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
1af10 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
1af20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
1af30 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
1af40 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
1af50 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
1af60 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
1af70 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20  r *zTName;      
1af80 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
1af90 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
1afa0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
1afb0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
1afc0 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pE->pLeft ){.   
1afd0 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
1afe0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1aff0 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e 70 4c  oken(db, &pE->pL
1b000 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  eft->token);.   
1b010 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b020 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30        zTName = 0
1b030 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b040 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
1b050 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
1b060 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
1b070 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
1b080 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
1b090 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
1b0a0 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
1b0b0 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
1b0c0 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pFrom->zAlias;.
1b0d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
1b0e0 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61  abName==0 || zTa
1b0f0 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a  bName[0]==0 ){ .
1b100 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
1b110 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
1b120 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
1b130 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
1b140 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1b150 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1b160 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
1b170 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1b180 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
1b190 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1b1a0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1b1b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b1c0 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
1b1d0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1b1e0 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
1b1f0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
1b200 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
1b210 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20  , *pRight;.     
1b220 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
1b230 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
1b240 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20  j].zName;..     
1b250 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
1b260 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
1b270 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72  as 'hidden' (cur
1b280 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73  rently only poss
1b290 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  ible.           
1b2a0 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20   ** for virtual 
1b2b0 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20  tables), do not 
1b2c0 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68  include it in th
1b2d0 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
1b2e0 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
1b2f0 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20  -set list..     
1b300 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1b310 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
1b320 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
1b330 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  aCol[j]) ){.    
1b340 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1b350 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  (IsVirtual(pTab)
1b360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1b370 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1b380 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1b390 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
1b3a0 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   zTName==0 ){.  
1b3b0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
1b3c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1b3d0 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69  *pLeft = &pTabLi
1b3e0 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20  st->a[i-1];.    
1b3f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
1b400 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65  Left[1].jointype
1b410 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
1b420 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
1b430 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
1b440 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e  umnIndex(pLeft->
1b450 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  pTab, zName)>=0 
1b460 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1b470 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
1b480 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
1b490 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
1b4a0 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
1b4b0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
1b4c0 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  e on the right *
1b4d0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1b4e0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1b4f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b500 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
1b510 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
1b520 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e 67  (pLeft[1].pUsing
1b530 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
1b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b550 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
1b560 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
1b570 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
1b580 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
1b590 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
1b5a0 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
1b5b0 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
1b5c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
1b5d0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1b5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1b5f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1b600 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
1b610 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1b620 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c  Parse, TK_ID, 0,
1b630 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
1b640 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d 3d      if( pRight==
1b650 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
1b660 20 20 20 20 20 20 20 73 65 74 51 75 6f 74 65 64         setQuoted
1b670 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70  Token(pParse, &p
1b680 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e  Right->token, zN
1b690 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1b6a0 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
1b6b0 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  || pTabList->nSr
1b6c0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>1 ){.         
1b6d0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
1b6e0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1b6f0 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30  pParse, TK_ID, 0
1b700 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
1b710 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
1b720 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1b730 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
1b740 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1b760 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61   pExpr==0 ) brea
1b770 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
1b780 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28   setQuotedToken(
1b790 70 50 61 72 73 65 2c 20 26 70 4c 65 66 74 2d 3e  pParse, &pLeft->
1b7a0 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29  token, zTabName)
1b7b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b7c0 73 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d  setToken(&pExpr-
1b7d0 3e 73 70 61 6e 2c 20 0a 20 20 20 20 20 20 20 20  >span, .        
1b7e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b7f0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
1b800 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
1b810 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
1b820 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70         pExpr->sp
1b830 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20  an.dyn = 1;.    
1b840 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1b850 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20  >token.z = 0;.  
1b860 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1b870 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a  r->token.n = 0;.
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1b890 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d  xpr->token.dyn =
1b8a0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1b8b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1b8c0 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69       pExpr = pRi
1b8d0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
1b8e0 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d     pExpr->span =
1b8f0 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20   pExpr->token;. 
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1b910 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 30  pr->span.dyn = 0
1b920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1b930 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b940 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
1b950 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
1b960 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1b970 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1b980 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45  pNew, pExpr, &pE
1b990 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
1b9a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
1b9c0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
1b9d0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1b9e0 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26  , pNew, pExpr, &
1b9f0 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a  pRight->token);.
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1ba10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ba20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1ba30 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20  !tableSeen ){.  
1ba40 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
1ba50 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
1ba60 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1ba70 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
1ba80 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a  ch table: %s", z
1ba90 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  TName);.        
1baa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1bab0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1bac0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
1bad0 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
1bae0 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  d");.          }
1baf0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bb00 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1bb10 28 64 62 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  (db, zTName);.  
1bb20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1bb30 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1bb40 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74  elete(db, pEList
1bb50 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
1bb60 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66   = pNew;.  }.#if
1bb70 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
1bb80 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  MN.  if( p->pELi
1bb90 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d  st && p->pEList-
1bba0 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69  >nExpr>db->aLimi
1bbb0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
1bbc0 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
1bbd0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1bbe0 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
1bbf0 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
1bc00 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e  t set");.  }.#en
1bc10 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43  dif.  return WRC
1bc20 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
1bc30 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e  .** No-op routin
1bc40 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d  e for the parse-
1bc50 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a  tree walker..**.
1bc60 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
1bc70 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b  tine is the Walk
1bc80 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
1bc90 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e   then expression
1bca0 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61   trees.** are wa
1bcb0 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79  lked without any
1bcc0 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74   actions being t
1bcd0 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64  aken at each nod
1bce0 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a  e.  Presumably,.
1bcf0 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
1bd00 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
1bd10 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
1bd20 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57  lback then .** W
1bd30 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
1bd40 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20  lback is set to 
1bd50 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65  do something use
1bd60 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a  ful for every .*
1bd70 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
1bd80 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
1bd90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
1bda0 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72  rWalkNoop(Walker
1bdb0 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20   *NotUsed, Expr 
1bdc0 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
1bdd0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
1bde0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
1bdf0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  2);.  return WRC
1be00 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
1be10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1be20 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c   "expands" a SEL
1be30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
1be40 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
1be50 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20  queries..** For 
1be60 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
1be70 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69  mation on what i
1be80 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61  t means to "expa
1be90 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20  nd" a SELECT.** 
1bea0 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74  statement, see t
1beb0 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
1bec0 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77  e selectExpand w
1bed0 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61  orker callback a
1bee0 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61  bove..**.** Expa
1bef0 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73  nding a SELECT s
1bf00 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20  tatement is the 
1bf10 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72  first step in pr
1bf20 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45  ocessing a.** SE
1bf30 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
1bf40 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
1bf50 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78  ement must be ex
1bf60 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a  panded before.**
1bf70 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
1bf80 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
1bf90 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  *.** If anything
1bfa0 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20   goes wrong, an 
1bfb0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
1bfc0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50   written into pP
1bfd0 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  arse..** The cal
1bfe0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  ling function ca
1bff0 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f  n detect the pro
1c000 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  blem by looking 
1c010 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a  at pParse->nErr.
1c020 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65  ** and/or pParse
1c030 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1c040 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1c050 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
1c060 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50  Expand(Parse *pP
1c070 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
1c080 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72  elect){.  Walker
1c090 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43   w;.  w.xSelectC
1c0a0 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
1c0b0 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 45  Expander;.  w.xE
1c0c0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
1c0d0 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
1c0e0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
1c0f0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
1c100 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
1c110 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  );.}...#ifndef S
1c120 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1c130 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  ERY./*.** This i
1c140 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  s a Walker.xSele
1c150 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62  ctCallback callb
1c160 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ack for the sqli
1c170 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66  te3SelectTypeInf
1c180 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  o().** interface
1c190 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68  ..**.** For each
1c1a0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
1c1b0 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d  query, add Colum
1c1c0 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75  n.zType and Colu
1c1d0 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f  mn.zColl.** info
1c1e0 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54  rmation to the T
1c1f0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
1c200 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
1c210 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a  he result set.**
1c220 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72   of that subquer
1c230 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62  y..**.** The Tab
1c240 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
1c250 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
1c260 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20   result set was 
1c270 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62  constructed.** b
1c280 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  y selectExpander
1c290 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20  () but the type 
1c2a0 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
1c2b0 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d  formation was om
1c2c0 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74  itted.** at that
1c2d0 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69   point because i
1c2e0 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e  dentifiers had n
1c2f0 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f  ot yet been reso
1c300 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  lved.  This.** r
1c310 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1c320 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65   after identifie
1c330 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  r resolution..*/
1c340 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
1c350 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
1c360 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57  eInfo(Walker *pW
1c370 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
1c380 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
1c390 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  se;.  int i;.  S
1c3a0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
1c3b0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1c3c0 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
1c3d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
1c3e0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
1c3f0 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 28 70  lved );.  if( (p
1c400 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1c410 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20  HasTypeInfo)==0 
1c420 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  ){.    p->selFla
1c430 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65  gs |= SF_HasType
1c440 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72 73 65  Info;.    pParse
1c450 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
1c460 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  se;.    pTabList
1c470 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
1c480 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
1c490 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
1c4a0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1c4b0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
1c4c0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
1c4d0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
1c4e0 20 20 20 20 69 66 28 20 70 54 61 62 20 26 26 20      if( pTab && 
1c4f0 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
1c500 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
1c510 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1c520 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
1c530 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1c540 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
1c550 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
1c560 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
1c570 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 61 73  lect;.        as
1c580 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20 20  sert( pSel );.  
1c590 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
1c5a0 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  l->pPrior ) pSel
1c5b0 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
1c5c0 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 41  .        selectA
1c5d0 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
1c5e0 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
1c5f0 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61   pTab->nCol, pTa
1c600 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 29 3b 0a  b->aCol, pSel);.
1c610 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c620 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
1c630 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69  ontinue;.}.#endi
1c640 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
1c650 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61  outine adds data
1c660 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
1c670 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f  ng sequence info
1c680 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68  rmation to.** th
1c690 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
1c6a0 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63  es of all FROM-c
1c6b0 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
1c6c0 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   in a.** SELECT 
1c6d0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
1c6e0 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   Use this routin
1c6f0 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  e after name res
1c700 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
1c710 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
1c720 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
1c730 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c740 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
1c750 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1c760 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1c770 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
1c780 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
1c790 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
1c7a0 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e  ryTypeInfo;.  w.
1c7b0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
1c7c0 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  exprWalkNoop;.  
1c7d0 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
1c7e0 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
1c7f0 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
1c800 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  ct);.#endif.}...
1c810 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1c820 6e 65 20 73 65 74 73 20 6f 66 20 61 20 53 45 4c  ne sets of a SEL
1c830 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  ECT statement fo
1c840 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  r processing.  T
1c850 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
1c860 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a  is accomplished:
1c870 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44  .**.**     *  VD
1c880 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE Cursor number
1c890 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  s are assigned t
1c8a0 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  o all FROM-claus
1c8b0 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20  e terms..**     
1c8c0 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62  *  Ephemeral Tab
1c8d0 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  le objects are c
1c8e0 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46  reated for all F
1c8f0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1c900 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  eries..**     * 
1c910 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1c920 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65  auses are shifte
1c930 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61  d into WHERE sta
1c940 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a  tements.**     *
1c950 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20    Wildcards "*" 
1c960 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e  and "TABLE.*" in
1c970 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65   result sets are
1c980 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20   expanded..**   
1c990 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73    *  Identifiers
1c9a0 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   in expression a
1c9b0 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61  re matched to ta
1c9c0 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  bles..**.** This
1c9d0 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65   routine acts re
1c9e0 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c  cursively on all
1c9f0 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
1ca00 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  in the SELECT..*
1ca10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
1ca20 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73  lectPrep(.  Pars
1ca30 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1ca40 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
1ca50 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
1ca60 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
1ca70 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
1ca80 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
1ca90 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
1caa0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
1cab0 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  erNC  /* Name co
1cac0 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69  ntext for contai
1cad0 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ner */.){.  sqli
1cae0 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 70  te3 *db;.  if( p
1caf0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1cb00 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1cb10 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
1cb20 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
1cb30 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  nfo ) return;.  
1cb40 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1cb50 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1cb60 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
1cb70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
1cb80 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b  pand(pParse, p);
1cb90 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1cba0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
1cbb0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
1cbc0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
1cbd0 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50  veSelectNames(pP
1cbe0 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e  arse, p, pOuterN
1cbf0 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  C);.  if( pParse
1cc00 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
1cc10 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1cc20 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
1cc30 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
1cc40 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f  pParse, p);.}../
1cc50 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
1cc60 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
1cc70 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
1cc80 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
1cc90 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
1cca0 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
1ccb0 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
1ccc0 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
1ccd0 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
1cce0 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
1ccf0 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
1cd00 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20  e simply stores 
1cd10 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
1cd20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c  those memory cel
1cd30 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
1cd40 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
1cd50 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
1cd60 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
1cd70 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
1cd80 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1cd90 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
1cda0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
1cdb0 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70   *pFunc;.  if( p
1cdc0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70  AggInfo->nFunc+p
1cdd0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
1cde0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1cdf0 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
1ce00 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
1ce10 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
1ce20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ce30 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1ce40 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  , pAggInfo->aCol
1ce50 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  [i].iMem);.  }. 
1ce60 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
1ce70 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
1ce80 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
1ce90 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
1cea0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1ceb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1cec0 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69  ull, 0, pFunc->i
1ced0 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 46  Mem);.    if( pF
1cee0 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d  unc->iDistinct>=
1cef0 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
1cf00 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78  *pE = pFunc->pEx
1cf10 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
1cf20 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1cf30 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pE, EP_xIsSel
1cf40 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ect) );.      if
1cf50 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30  ( pE->x.pList==0
1cf60 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d   || pE->x.pList-
1cf70 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
1cf80 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1cf90 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49  rMsg(pParse, "DI
1cfa0 53 54 49 4e 43 54 20 61 67 67 72 65 67 61 74 65  STINCT aggregate
1cfb0 73 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63  s must have exac
1cfc0 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20  tly one ".      
1cfd0 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29       "argument")
1cfe0 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d  ;.        pFunc-
1cff0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
1d000 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d010 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
1d020 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
1d030 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
1d040 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73  arse, pE->x.pLis
1d050 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
1d060 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1d070 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1d080 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  l, pFunc->iDisti
1d090 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
1d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0b0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1d0c0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
1d0d0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
1d0e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
1d0f0 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
1d100 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
1d110 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
1d120 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1d130 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
1d140 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
1d150 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d160 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
1d170 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
1d180 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
1d190 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
1d1a0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1d1b0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1d1c0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
1d1d0 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
1d1e0 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
1d1f0 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
1d200 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
1d210 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
1d220 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
1d230 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1d240 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1d250 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
1d260 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1d270 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ect) );.    sqli
1d280 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1d290 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46   OP_AggFinal, pF
1d2a0 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20  ->iMem, pList ? 
1d2b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
1d2c0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1d2d0 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
1d2e0 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
1d2f0 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a  FUNCDEF);.  }.}.
1d300 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
1d310 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65  e accumulator me
1d320 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  mory cells for a
1d330 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65  n aggregate base
1d340 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
1d350 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
1d360 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1d370 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75  oid updateAccumu
1d380 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
1d390 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
1d3a0 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
1d3b0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1d3c0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
1d3d0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
1d3e0 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
1d3f0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
1d400 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
1d410 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
1d420 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
1d430 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
1d440 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1d450 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
1d460 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
1d470 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
1d480 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
1d490 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1d4a0 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
1d4b0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
1d4c0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1d4d0 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
1d4e0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1d4f0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1d500 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
1d510 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
1d520 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
1d530 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1d540 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
1d550 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1d560 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
1d570 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
1d580 65 67 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 7d  egAgg, 0);.    }
1d590 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
1d5a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41   = 0;.      regA
1d5b0 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gg = 0;.    }.  
1d5c0 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
1d5d0 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
1d5e0 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
1d5f0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1d600 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
1d610 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
1d620 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
1d630 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73  pParse, pF->iDis
1d640 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c  tinct, addrNext,
1d650 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20   1, regAgg);.   
1d660 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70   }.    if( pF->p
1d670 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53 51  Func->flags & SQ
1d680 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
1d690 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
1d6a0 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
1d6b0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
1d6c0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1d6d0 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
1d6e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1d6f0 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
1d700 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
1d710 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
1d720 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
1d730 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
1d740 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
1d750 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
1d760 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
1d770 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1d780 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1d790 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
1d7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1d7b0 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
1d7c0 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
1d7d0 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
1d7e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1d7f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1d800 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
1d810 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
1d820 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
1d830 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  EQ);.    }.    s
1d840 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1d850 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20  (v, OP_AggStep, 
1d860 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69  0, regAgg, pF->i
1d870 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Mem,.           
1d880 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
1d890 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
1d8a0 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71  FUNCDEF);.    sq
1d8b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1d8c0 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a  5(v, (u8)nArg);.
1d8d0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1d8e0 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
1d8f0 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
1d900 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1d910 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1d920 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
1d930 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
1d940 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b   if( addrNext ){
1d950 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d960 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1d970 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
1d980 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30   }.  }.  for(i=0
1d990 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pC=pAggInfo->a
1d9a0 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  Col; i<pAggInfo-
1d9b0 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69  >nAccumulator; i
1d9c0 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73  ++, pC++){.    s
1d9d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1d9e0 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72  Parse, pC->pExpr
1d9f0 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d  , pC->iMem);.  }
1da00 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
1da10 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a  ectMode = 0;.}..
1da20 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1da30 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45  ode for the SELE
1da40 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76  CT statement giv
1da50 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75  en in the p argu
1da60 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ment.  .**.** Th
1da70 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
1da80 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72  stributed in var
1da90 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64  ious ways depend
1daa0 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f  ing on the.** co
1dab0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53 65  ntents of the Se
1dac0 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
1dad0 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
1dae0 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74 0a   argument pDest.
1daf0 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ** as follows:.*
1db00 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d 3e  *.**     pDest->
1db10 65 44 65 73 74 20 20 20 20 52 65 73 75 6c 74 0a  eDest    Result.
1db20 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  **     ---------
1db30 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
1db40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1db50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1db60 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4f 75  --.**     SRT_Ou
1db70 74 70 75 74 20 20 20 20 20 20 47 65 6e 65 72 61  tput      Genera
1db80 74 65 20 61 20 72 6f 77 20 6f 66 20 6f 75 74 70  te a row of outp
1db90 75 74 20 28 75 73 69 6e 67 20 74 68 65 20 4f 50  ut (using the OP
1dba0 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20 20 20  _ResultRow.**   
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbc0 20 20 6f 70 63 6f 64 65 29 20 66 6f 72 20 65 61    opcode) for ea
1dbd0 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20 72 65  ch row in the re
1dbe0 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  sult set..**.** 
1dbf0 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20      SRT_Mem     
1dc00 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69      Only valid i
1dc10 66 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  f the result is 
1dc20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e  a single column.
1dc30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1dc40 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68          Store th
1dc50 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  e first column o
1dc60 66 20 74 68 65 20 66 69 72 73 74 20 72 65 73 75  f the first resu
1dc70 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  lt row.**       
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1dc90 20 72 65 67 69 73 74 65 72 20 70 44 65 73 74 2d   register pDest-
1dca0 3e 69 50 61 72 6d 20 74 68 65 6e 20 61 62 61 6e  >iParm then aban
1dcb0 64 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a 2a 20  don the rest.** 
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcd0 20 20 20 20 6f 66 20 74 68 65 20 71 75 65 72 79      of the query
1dce0 2e 20 20 54 68 69 73 20 64 65 73 74 69 6e 61 74  .  This destinat
1dcf0 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c 49 4d  ion implies "LIM
1dd00 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  IT 1"..**.**    
1dd10 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20   SRT_Set        
1dd20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74   The result must
1dd30 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   be a single col
1dd40 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61 63 68  umn.  Store each
1dd50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1dd60 20 20 20 20 20 20 20 20 72 6f 77 20 6f 66 20 72          row of r
1dd70 65 73 75 6c 74 20 61 73 20 74 68 65 20 6b 65 79  esult as the key
1dd80 20 69 6e 20 74 61 62 6c 65 20 70 44 65 73 74 2d   in table pDest-
1dd90 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20  >iParm. .**     
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddb0 41 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69  Apply the affini
1ddc0 74 79 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69  ty pDest->affini
1ddd0 74 79 20 62 65 66 6f 72 65 20 73 74 6f 72 69 6e  ty before storin
1dde0 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  g.**            
1ddf0 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 73           results
1de00 2e 20 20 55 73 65 64 20 74 6f 20 69 6d 70 6c 65  .  Used to imple
1de10 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c 45 43 54  ment "IN (SELECT
1de20 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20   ...)"..**.**   
1de30 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20    SRT_Union     
1de40 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
1de50 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65  as a key in a te
1de60 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
1de70 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
1de80 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
1de90 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
1dea0 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65  ults from the te
1deb0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
1dec0 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
1ded0 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20  *     SRT_Table 
1dee0 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
1def0 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  lts in temporary
1df00 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
1df10 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  arm..**         
1df20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 69 73              This
1df30 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 45 70 68   is like SRT_Eph
1df40 65 6d 54 61 62 20 65 78 63 65 70 74 20 74 68 61  emTab except tha
1df50 74 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20  t the table.**  
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df70 20 20 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f     is assumed to
1df80 20 61 6c 72 65 61 64 79 20 62 65 20 6f 70 65 6e   already be open
1df90 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1dfa0 45 70 68 65 6d 54 61 62 20 20 20 20 43 72 65 61  EphemTab    Crea
1dfb0 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20  te an temporary 
1dfc0 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
1dfd0 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20  rm and store.** 
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dff0 20 20 20 20 74 68 65 20 72 65 73 75 6c 74 20 74      the result t
1e000 68 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f 72  here. The cursor
1e010 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61 66   is left open af
1e020 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ter.**          
1e030 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1e040 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 6c  ning.  This is l
1e050 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20 65 78  ike SRT_Table ex
1e060 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20 20 20  cept that.**    
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e080 20 74 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f   this destinatio
1e090 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e 45 70  n uses OP_OpenEp
1e0a0 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65 61 74  hemeral to creat
1e0b0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1e0c0 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
1e0d0 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20  le first..**.** 
1e0e0 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e      SRT_Coroutin
1e0f0 65 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 63  e   Generate a c
1e100 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72  o-routine that r
1e110 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72 6f 77  eturns a new row
1e120 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
1e130 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
1e140 74 73 20 65 61 63 68 20 74 69 6d 65 20 69 74 20  ts each time it 
1e150 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68 65  is invoked.  The
1e160 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a 2a 20   entry point.** 
1e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e180 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f      of the co-ro
1e190 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65 64 20  utine is stored 
1e1a0 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73  in register pDes
1e1b0 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  t->iParm..**.** 
1e1c0 20 20 20 20 53 52 54 5f 45 78 69 73 74 73 20 20      SRT_Exists  
1e1d0 20 20 20 20 53 74 6f 72 65 20 61 20 31 20 69 6e      Store a 1 in
1e1e0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65   memory cell pDe
1e1f0 73 74 2d 3e 69 50 61 72 6d 20 69 66 20 74 68 65  st->iParm if the
1e200 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20   result.**      
1e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1e220 65 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e  et is not empty.
1e230 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44  .**.**     SRT_D
1e240 69 73 63 61 72 64 20 20 20 20 20 54 68 72 6f 77  iscard     Throw
1e250 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 77 61   the results awa
1e260 79 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  y.  This is used
1e270 20 62 79 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20   by SELECT.**   
1e280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e290 20 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74    statements wit
1e2a0 68 69 6e 20 74 72 69 67 67 65 72 73 20 77 68 6f  hin triggers who
1e2b0 73 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20  se only purpose 
1e2c0 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  is.**           
1e2d0 20 20 20 20 20 20 20 20 20 20 74 68 65 20 73 69            the si
1e2e0 64 65 2d 65 66 66 65 63 74 73 20 6f 66 20 66 75  de-effects of fu
1e2f0 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  nctions..**.** T
1e300 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1e310 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
1e320 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
1e330 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
1e340 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
1e350 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
1e360 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1e370 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
1e380 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
1e390 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e3a0 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
1e3b0 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
1e3c0 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
1e3d0 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
1e3e0 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
1e3f0 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74   do that..*/.int
1e400 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
1e410 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1e420 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e430 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
1e440 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1e450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e460 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1e470 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
1e480 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
1e490 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57  *pDest      /* W
1e4a0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
1e4b0 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  he query results
1e4c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
1e4d0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
1e4e0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
1e4f0 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
1e500 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
1e510 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69  Return from sqli
1e520 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
1e530 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
1e540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e550 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
1e560 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
1e570 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
1e580 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20  sAgg;           
1e590 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
1e5a0 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
1e5b0 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
1e5c0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1e5d0 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
1e5e0 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
1e5f0 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
1e600 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
1e610 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
1e620 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
1e630 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
1e640 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
1e650 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1e660 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
1e670 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1e680 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20  pOrderBy;    /* 
1e690 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
1e6a0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
1e6b0 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
1e6c0 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
1e6d0 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
1e6e0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
1e6f0 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
1e700 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
1e710 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
1e720 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
1e730 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73  L */.  int isDis
1e740 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
1e750 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
1e760 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
1e770 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
1e780 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20  t distinct;     
1e790 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1e7a0 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
1e7b0 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69  tinct set */.  i
1e7c0 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
1e7d0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
1e7e0 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
1e7f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
1e800 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64   int addrSortInd
1e810 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  ex;     /* Addre
1e820 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e  ss of an OP_Open
1e830 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
1e840 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e  ction */.  AggIn
1e850 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20  fo sAggInfo;    
1e860 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1e870 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61   used by aggrega
1e880 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
1e890 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20  int iEnd;       
1e8a0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1e8b0 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20  s of the end of 
1e8c0 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  the query */.  s
1e8d0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
1e8e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1e8f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1e900 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72   */..  db = pPar
1e910 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d  se->db;.  if( p=
1e920 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
1e930 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
1e940 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65  ->nErr ){.    re
1e950 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
1e960 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1e970 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1e980 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
1e990 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
1e9a0 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66   memset(&sAggInf
1e9b0 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67  o, 0, sizeof(sAg
1e9c0 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 70 4f 72 64  gInfo));..  pOrd
1e9d0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1e9e0 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61  By;.  if( Ignora
1e9f0 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
1ea00 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ) ){.    p->pOrd
1ea10 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  erBy = 0;..    /
1ea20 2a 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  * In these cases
1ea30 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70   the DISTINCT op
1ea40 65 72 61 74 6f 72 20 6d 61 6b 65 73 20 6e 6f 20  erator makes no 
1ea50 64 69 66 66 65 72 65 6e 63 65 20 74 6f 20 74 68  difference to th
1ea60 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73  e.    ** results
1ea70 2c 20 73 6f 20 72 65 6d 6f 76 65 20 69 74 20 69  , so remove it i
1ea80 66 20 69 74 20 77 65 72 65 20 73 70 65 63 69 66  f it were specif
1ea90 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ied..    */.    
1eaa0 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44  assert(pDest->eD
1eab0 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20  est==SRT_Exists 
1eac0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
1ead0 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20  =SRT_Union || . 
1eae0 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
1eaf0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65  >eDest==SRT_Exce
1eb00 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  pt || pDest->eDe
1eb10 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 29  st==SRT_Discard)
1eb20 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
1eb30 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
1eb40 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
1eb50 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73  SelectPrep(pPars
1eb60 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70 54 61 62  e, p, 0);.  pTab
1eb70 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
1eb80 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
1eb90 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 50 61 72  List;.  if( pPar
1eba0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
1ebb0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1ebc0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
1ebd0 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f  end;.  }.  p->pO
1ebe0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
1ebf0 79 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d  y;.  isAgg = (p-
1ec00 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
1ec10 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
1ec20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20  if( pEList==0 ) 
1ec30 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1ec40 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20  ..  /* .  ** Do 
1ec50 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74  not even attempt
1ec60 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79   to generate any
1ec70 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76 65   code if we have
1ec80 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20   already seen.  
1ec90 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65  ** errors before
1eca0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   this routine st
1ecb0 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  arts..  */.  if(
1ecc0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
1ecd0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1ece0 64 3b 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42  d;..  /* ORDER B
1ecf0 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  Y is ignored for
1ed00 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f   some destinatio
1ed10 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ns..  */.  if( I
1ed20 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
1ed30 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 4f  pDest) ){.    pO
1ed40 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
1ed50 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
1ed60 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
1ed70 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
1ed80 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1ed90 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
1eda0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
1edb0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1edc0 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
1edd0 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
1ede0 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
1edf0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1ee00 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1ee10 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1ee20 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
1ee30 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50   for(i=0; !p->pP
1ee40 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69  rior && i<pTabLi
1ee50 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
1ee60 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1ee70 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1ee80 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
1ee90 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
1eea0 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
1eeb0 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
1eec0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e  >pSelect;.    in
1eed0 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20  t isAggSub;..   
1eee0 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20   if( pSub==0 || 
1eef0 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74  pItem->isPopulat
1ef00 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  ed ) continue;..
1ef10 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
1ef20 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62   Parse.nHeight b
1ef30 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20  y the height of 
1ef40 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72  the largest expr
1ef50 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72  ession.    ** tr
1ef60 65 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79  ee refered to by
1ef70 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e   this, the paren
1ef80 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68  t select. The ch
1ef90 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a  ild select.    *
1efa0 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78  * may contain ex
1efb0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f  pression trees o
1efc0 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a  f at most.    **
1efd0 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50   (SQLITE_MAX_EXP
1efe0 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48  R_DEPTH-Parse.nH
1eff0 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54  eight) height. T
1f000 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20  his is a bit.   
1f010 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76   ** more conserv
1f020 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73  ative than neces
1f030 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65  sary, but much e
1f040 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72  asier than enfor
1f050 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65  cing.    ** an e
1f060 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20  xact limit..    
1f070 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
1f080 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65  Height += sqlite
1f090 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
1f0a0 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  t(p);..    /* Ch
1f0b0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1f0c0 65 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62  e subquery can b
1f0d0 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20  e absorbed into 
1f0e0 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20  the parent. */. 
1f0f0 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28 70     isAggSub = (p
1f100 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1f110 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
1f120 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65  ;.    if( flatte
1f130 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  nSubquery(pParse
1f140 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69  , p, i, isAgg, i
1f150 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20  sAggSub) ){.    
1f160 20 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29    if( isAggSub )
1f170 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20  {.        isAgg 
1f180 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
1f190 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41  selFlags |= SF_A
1f1a0 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20  ggregate;.      
1f1b0 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a  }.      i = -1;.
1f1c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f1d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1f1e0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
1f1f0 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65  T_EphemTab, pIte
1f200 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
1f210 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1f220 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3d 3d 30  ->isPopulated==0
1f230 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1f240 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
1f250 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
1f260 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70      pItem->isPop
1f270 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  ulated = 1;.    
1f280 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  }.    if( pParse
1f290 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
1f2a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1f2b0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
1f2c0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  end;.    }.    p
1f2d0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
1f2e0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
1f2f0 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20  xprHeight(p);.  
1f300 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
1f310 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49  pSrc;.    if( !I
1f320 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
1f330 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
1f340 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
1f350 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20  rderBy;.    }.  
1f360 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  }.  pEList = p->
1f370 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20  pEList;.#endif. 
1f380 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
1f390 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  ere;.  pGroupBy 
1f3a0 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
1f3b0 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
1f3c0 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74 69  aving;.  isDisti
1f3d0 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  nct = (p->selFla
1f3e0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1f3f0 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53  )!=0;..#ifndef S
1f400 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
1f410 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
1f420 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20  If there is are 
1f430 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75  a sequence of qu
1f440 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61  eries, do the ea
1f450 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74  rlier ones first
1f460 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1f470 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
1f480 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
1f490 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  =0 ){.      Sele
1f4a0 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67  ct *pLoop, *pRig
1f4b0 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  ht = 0;.      in
1f4c0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  t cnt = 0;.     
1f4d0 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a 20   int mxSelect;. 
1f4e0 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70       for(pLoop=p
1f4f0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
1f500 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e  Loop->pPrior, cn
1f510 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t++){.        pL
1f520 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  oop->pRightmost 
1f530 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  = p;.        pLo
1f540 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67  op->pNext = pRig
1f550 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67  ht;.        pRig
1f560 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20  ht = pLoop;.    
1f570 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c 65    }.      mxSele
1f580 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  ct = db->aLimit[
1f590 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
1f5a0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a 20  POUND_SELECT];. 
1f5b0 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65 63       if( mxSelec
1f5c0 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65 63  t && cnt>mxSelec
1f5d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1f5e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1f5f0 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74  rse, "too many t
1f600 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64  erms in compound
1f610 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20   SELECT");.     
1f620 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f630 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
1f640 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
1f650 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
1f660 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  st);.  }.#endif.
1f670 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
1f680 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
1f690 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
1f6a0 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
1f6b0 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
1f6c0 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66  output..  */.#if
1f6d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f6e0 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
1f6f0 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
1f700 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70  umnSelectError(p
1f710 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45  Parse, pDest, pE
1f720 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
1f730 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
1f740 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  end;.  }.#endif.
1f750 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c  .  /* If possibl
1f760 65 2c 20 72 65 77 72 69 74 65 20 74 68 65 20 71  e, rewrite the q
1f770 75 65 72 79 20 74 6f 20 75 73 65 20 47 52 4f 55  uery to use GROU
1f780 50 20 42 59 20 69 6e 73 74 65 61 64 20 6f 66 20  P BY instead of 
1f790 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a 20 47  DISTINCT..  ** G
1f7a0 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75 73  ROUP BY might us
1f7b0 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53 54  e an index, DIST
1f7c0 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73 2e  INCT never does.
1f7d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
1f7e0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1f7f0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1f800 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
1f810 6e 63 74 20 26 26 20 21 70 2d 3e 70 47 72 6f 75  nct && !p->pGrou
1f820 70 42 79 20 29 7b 0a 20 20 20 20 70 2d 3e 70 47  pBy ){.    p->pG
1f830 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
1f840 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
1f850 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  p->pEList, 0);. 
1f860 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
1f870 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
1f880 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
1f890 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  F_Distinct;.    
1f8a0 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  isDistinct = 0;.
1f8b0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1f8c0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
1f8d0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
1f8e0 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a  his sorting.  **
1f8f0 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
1f900 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64   up being unused
1f910 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
1f920 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63   be .  ** extrac
1f930 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
1f940 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61  d order.  If tha
1f950 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
1f960 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f  hen the.  ** OP_
1f970 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
1f980 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
1f990 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  e changed to an 
1f9a0 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a  OP_Noop once.  *
1f9b0 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  * we figure out 
1f9c0 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
1f9d0 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65   index is not ne
1f9e0 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53  eded.  The addrS
1f9f0 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61  ortIndex.  ** va
1fa00 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
1fa10 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61  o facilitate tha
1fa20 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
1fa30 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
1fa40 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
1fa50 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79  eyInfo;.    pKey
1fa60 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
1fa70 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
1fa80 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  e, pOrderBy);.  
1fa90 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
1faa0 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
1fab0 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64  Tab++;.    p->ad
1fac0 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
1fad0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
1fae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1faf0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
1fb00 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
1fb30 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64  ->iECursor, pOrd
1fb40 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30  erBy->nExpr+2, 0
1fb50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1fb70 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
1fb80 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
1fb90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1fba0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20  addrSortIndex = 
1fbb0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  -1;.  }..  /* If
1fbc0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
1fbd0 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
1fbe0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
1fbf0 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
1fc00 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
1fc10 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
1fc20 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  emTab ){.    sql
1fc30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1fc40 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
1fc50 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  al, pDest->iParm
1fc60 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
1fc70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
1fc80 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
1fc90 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  /.  iEnd = sqlit
1fca0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1fcb0 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  v);.  computeLim
1fcc0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
1fcd0 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20  se, p, iEnd);.. 
1fce0 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75   /* Open a virtu
1fcf0 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
1fd00 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
1fd10 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
1fd20 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20   isDistinct ){. 
1fd30 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
1fd40 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  Info;.    assert
1fd50 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75  ( isAgg || pGrou
1fd60 70 42 79 20 29 3b 0a 20 20 20 20 64 69 73 74 69  pBy );.    disti
1fd70 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
1fd80 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ab++;.    pKeyIn
1fd90 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
1fda0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1fdb0 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
1fdc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fdd0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
1fde0 65 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e 63 74  emeral, distinct
1fdf0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe10 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
1fe20 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
1fe30 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OFF);.  }else{. 
1fe40 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31     distinct = -1
1fe50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72  ;.  }..  /* Aggr
1fe60 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67  egate and non-ag
1fe70 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
1fe80 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66  are handled diff
1fe90 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28  erently */.  if(
1fea0 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75   !isAgg && pGrou
1feb0 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBy==0 ){.    /*
1fec0 20 54 68 69 73 20 63 61 73 65 20 69 73 20 66 6f   This case is fo
1fed0 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  r non-aggregate 
1fee0 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2a 20 42  queries.    ** B
1fef0 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
1ff00 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20  e scan.    */.  
1ff10 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
1ff20 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
1ff30 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
1ff40 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79  Where, &pOrderBy
1ff50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
1ff60 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
1ff70 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
1ff80 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67     /* If sorting
1ff90 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20   index that was 
1ffa0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69  created by a pri
1ffb0 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
1ffc0 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74  ral .    ** inst
1ffd0 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70  ruction ended up
1ffe0 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65   not being neede
1fff0 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74  d, then change t
20000 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
20010 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ral.    ** into 
20020 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20  an OP_Noop..    
20030 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53  */.    if( addrS
20040 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70  ortIndex>=0 && p
20050 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
20060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
20070 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
20080 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 31 29  ddrSortIndex, 1)
20090 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
200a0 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
200b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
200c0 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
200d0 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a  inner loop.    *
200e0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 21 69 73  /.    assert(!is
200f0 44 69 73 74 69 6e 63 74 29 3b 0a 20 20 20 20 73  Distinct);.    s
20100 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
20110 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
20120 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
20130 2c 20 2d 31 2c 20 70 44 65 73 74 2c 0a 20 20 20  , -1, pDest,.   
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20150 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
20160 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ue, pWInfo->iBre
20170 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64  ak);..    /* End
20180 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
20190 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
201a0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
201b0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
201c0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
201d0 73 20 69 73 20 74 68 65 20 70 72 6f 63 65 73 73  s is the process
201e0 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
201f0 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20  e queries */.   
20200 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
20210 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
20220 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73  text for process
20230 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e  ing aggregate in
20240 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
20250 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20   int iAMem;     
20260 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
20270 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74  m address for st
20280 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52  oring current GR
20290 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
202a0 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iBMem;        
202b0 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
202c0 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69  ddress for previ
202d0 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ous GROUP BY */.
202e0 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67      int iUseFlag
202f0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ;       /* Mem a
20300 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66  ddress holding f
20310 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lag indicating t
20320 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20  hat at least.   
20330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20340 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20       ** one row 
20350 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  of the input to 
20360 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68  the aggregator h
20370 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  as been.        
20380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20390 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ** processed */.
203a0 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c      int iAbortFl
203b0 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ag;     /* Mem a
203c0 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75  ddress which cau
203d0 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20  ses query abort 
203e0 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
203f0 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f     int groupBySo
20400 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63  rt;    /* Rows c
20410 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20  ome from source 
20420 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
20430 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
20440 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  rEnd;        /* 
20450 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e  End of processin
20460 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  g for this SELEC
20470 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  T */..    /* Rem
20480 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
20490 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
204a0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
204b0 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
204c0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
204d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
204e0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
204f0 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
20500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20510 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
20520 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
20530 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
20540 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
20550 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
20560 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
20570 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
20580 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
20590 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
205a0 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
205b0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
205c0 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20  pItem->iAlias = 
205d0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
205e0 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
205f0 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
20600 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
20610 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
20620 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41         pItem->iA
20630 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
20640 7d 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20 20 2f  }.    }.. .    /
20650 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c  * Create a label
20660 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e   to jump to when
20670 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72   we want to abor
20680 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  t the query */. 
20690 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c     addrEnd = sql
206a0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
206b0 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  l(v);..    /* Co
206c0 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20  nvert TK_COLUMN 
206d0 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47  nodes into TK_AG
206e0 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b  G_COLUMN and mak
206f0 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20  e entries in.   
20700 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72   ** sAggInfo for
20710 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43   all TK_AGG_FUNC
20720 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78  TION nodes in ex
20730 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
20740 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  .    ** SELECT s
20750 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
20760 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
20770 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
20780 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
20790 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
207a0 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
207b0 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43  TabList;.    sNC
207c0 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67  .pAggInfo = &sAg
207d0 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49  gInfo;.    sAggI
207e0 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
207f0 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
20800 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b  pGroupBy->nExpr+
20810 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49  1 : 0;.    sAggI
20820 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  nfo.pGroupBy = p
20830 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c  GroupBy;.    sql
20840 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
20850 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
20860 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
20870 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
20880 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72  ist(&sNC, pOrder
20890 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61  By);.    if( pHa
208a0 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  ving ){.      sq
208b0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
208c0 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
208d0 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
208e0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
208f0 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
20900 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
20910 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
20920 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
20930 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
20940 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
20950 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  ty(sAggInfo.aFun
20960 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78  c[i].pExpr, EP_x
20970 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
20980 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
20990 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
209a0 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
209b0 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c  c[i].pExpr->x.pL
209c0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
209d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
209e0 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
209f0 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
20a00 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
20a10 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
20a20 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
20a30 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
20a40 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
20a50 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
20a60 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
20a70 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
20a80 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
20a90 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
20aa0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
20ab0 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
20ac0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
20ad0 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
20ae0 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20  .      int j1;  
20af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d             /* A-
20b00 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
20b10 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
20b20 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
20b30 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
20b40 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
20b50 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
20b60 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
20b70 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
20b80 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
20b90 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
20ba0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
20bb0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
20bc0 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
20bd0 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
20be0 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
20bf0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
20c00 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
20c10 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
20c20 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
20c30 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
20c40 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
20c50 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
20c60 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
20c70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
20c80 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
20c90 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
20ca0 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
20cb0 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
20cc0 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
20cd0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
20ce0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
20cf0 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
20d00 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
20d10 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
20d20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
20d30 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
20d40 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
20d50 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
20d60 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
20d70 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
20d80 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
20d90 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
20da0 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
20db0 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
20dc0 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e  er all, the Open
20dd0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
20de0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
20df0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
20e00 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
20e10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
20e20 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
20e30 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
20e40 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
20e50 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
20e60 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
20e70 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  , pGroupBy);.   
20e80 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64     addrSortingId
20e90 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  x = sqlite3VdbeA
20ea0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
20eb0 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20  Ephemeral, .    
20ec0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
20ed0 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
20ee0 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
20ef0 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
20f00 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
20f10 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
20f20 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f  NDOFF);..      /
20f30 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
20f40 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73  ory locations us
20f50 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61  ed by GROUP BY a
20f60 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73  ggregate process
20f70 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ing.      */.   
20f80 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b     iUseFlag = ++
20f90 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
20fa0 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d      iAbortFlag =
20fb0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
20fc0 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75 74  .      regOutput
20fd0 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Row = ++pParse->
20fe0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
20ff0 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
21000 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
21010 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65  (v);.      regRe
21020 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
21030 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
21040 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56  Reset = sqlite3V
21050 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
21060 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70  .      iAMem = p
21070 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
21080 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
21090 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
210a0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42  >nExpr;.      iB
210b0 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
210c0 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
210d0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
210e0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
210f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21100 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
21110 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46  eger, 0, iAbortF
21120 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
21130 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65  Comment((v, "cle
21140 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ar abort flag"))
21150 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21160 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21170 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65  Integer, 0, iUse
21180 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
21190 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
211a0 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74  dicate accumulat
211b0 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 0a 20 20  or empty"));..  
211c0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
211d0 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
211e0 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
211f0 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
21200 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
21210 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
21220 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
21230 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
21240 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
21250 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
21260 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
21270 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
21280 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
21290 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
212a0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
212b0 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
212c0 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
212d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
212e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
212f0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
21300 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
21310 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
21320 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
21330 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
21340 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
21350 47 72 6f 75 70 42 79 2c 20 30 2c 20 30 29 3b 0a  GroupBy, 0, 0);.
21360 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
21370 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
21380 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28  t_end;.      if(
21390 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
213a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
213b0 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65  ptimizer is able
213c0 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73   to deliver rows
213d0 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64   in group by ord
213e0 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a  er so.        **
213f0 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
21400 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50  to sort.  The OP
21410 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74  _OpenEphemeral t
21420 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  able will be.   
21430 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65       ** cancelle
21440 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20  d later because 
21450 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
21460 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66   use the pKeyInf
21470 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  o.        */.   
21480 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20       pGroupBy = 
21490 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
214a0 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
214b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
214c0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  e{.        /* Ro
214d0 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75  ws are coming ou
214e0 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65  t in undetermine
214f0 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76  d order.  We hav
21500 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20  e to push.      
21510 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e    ** each row in
21520 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
21530 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ex, terminate th
21540 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20  e first loop,.  
21550 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f        ** then lo
21560 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74  op over the sort
21570 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64  ing index in ord
21580 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75  er to get the ou
21590 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  tput.        ** 
215a0 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a  in sorted order.
215b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
215c0 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a     int regBase;.
215d0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52          int regR
215e0 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69  ecord;.        i
215f0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt nCol;.       
21600 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a   int nGroupBy;..
21610 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
21620 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
21630 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f   nGroupBy = pGro
21640 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
21650 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f       nCol = nGro
21660 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20  upBy + 1;.      
21670 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
21680 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
21690 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
216a0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
216b0 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
216c0 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
216d0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
216e0 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
216f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
21700 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
21710 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21720 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
21730 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
21740 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
21750 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
21760 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
21770 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
21780 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20  , regBase, 0);. 
21790 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
217a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
217b0 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66  equence, sAggInf
217c0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67  o.sortingIdx,reg
217d0 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a  Base+nGroupBy);.
217e0 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
217f0 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20  upBy+1;.        
21800 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
21810 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
21820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
21830 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
21840 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66  *pCol = &sAggInf
21850 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  o.aCol[i];.     
21860 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
21870 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
21880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
21890 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42  nt r1 = j + regB
218a0 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ase;.           
218b0 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20   int r2;..      
218c0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
218d0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
218e0 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20  umn(pParse, .   
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21900 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
21910 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43  ->pTab, pCol->iC
21920 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61  olumn, pCol->iTa
21930 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20  ble, r1, 0);.   
21940 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31 21           if( r1!
21950 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =r2 ){.         
21960 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21970 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
21980 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20  py, r2, r1);.   
21990 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
219a0 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
219b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
219c0 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63  }.        regRec
219d0 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
219e0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
219f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21a00 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
21a10 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
21a20 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52  Base, nCol, regR
21a30 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
21a40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21a50 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
21a60 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
21a70 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72  ingIdx, regRecor
21a80 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
21a90 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
21aa0 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
21ab0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
21ac0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
21ad0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
21ae0 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  gBase, nCol);.  
21af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
21b00 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
21b10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21b20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
21b30 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
21b40 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
21b50 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
21b60 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
21b70 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20  UP BY sort"));. 
21b80 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
21b90 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  useSortingIdx = 
21ba0 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  1;.      }..    
21bb0 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
21bc0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
21bd0 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
21be0 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
21bf0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
21c00 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
21c10 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
21c20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
21c30 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
21c40 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
21c50 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
21c60 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
21c70 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
21c80 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
21c90 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
21ca0 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
21cb0 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
21cc0 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
21cd0 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
21ce0 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
21cf0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
21d00 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
21d10 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
21d20 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
21d30 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
21d40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
21d50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
21d60 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41  v, OP_Column, sA
21d70 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
21d80 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  x, j, iBMem+j);.
21d90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21da0 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
21db0 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  o.directMode = 1
21dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
21dd0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
21de0 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
21df0 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b  j].pExpr, iBMem+
21e00 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  j);.        }.  
21e10 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
21e20 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
21e30 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d   OP_Compare, iAM
21e40 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75  em, iBMem, pGrou
21e50 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  pBy->nExpr,.    
21e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e70 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
21e80 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
21e90 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73  O);.      j1 = s
21ea0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
21eb0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
21ec0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21ed0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31  3(v, OP_Jump, j1
21ee0 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20  +1, 0, j1+1);.. 
21ef0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
21f00 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
21f10 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
21f20 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
21f30 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20       ** Changes 
21f40 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
21f50 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
21f60 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
21f70 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
21f80 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
21f90 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
21fa0 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
21fb0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
21fc0 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
21fd0 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
21fe0 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
21ff0 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
22000 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
22010 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
22020 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
22030 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
22040 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
22050 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
22060 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
22070 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
22080 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
22090 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
220a0 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
220b0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
220c0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
220d0 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d  arse, iBMem, iAM
220e0 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
220f0 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
22100 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22110 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
22120 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
22130 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
22140 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
22150 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
22160 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22170 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22180 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c  _IfPos, iAbortFl
22190 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  ag, addrEnd);.  
221a0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
221b0 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74  (v, "check abort
221c0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
221d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
221e0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
221f0 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
22200 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
22210 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65  omment((v, "rese
22220 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  t accumulator"))
22230 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
22240 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65  te the aggregate
22250 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61   accumulators ba
22260 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
22270 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  nt of.      ** t
22280 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20  he current row. 
22290 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
222a0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
222b0 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20  e(v, j1);.      
222c0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
222d0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
222e0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
222f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22300 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
22310 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
22320 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
22330 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20   "indicate data 
22340 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  in accumulator")
22350 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64  );..      /* End
22360 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20   of the loop.   
22370 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
22380 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
22390 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
223a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
223b0 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
223c0 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
223d0 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
223e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
223f0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
22400 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
22410 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
22420 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53  eToNoop(v, addrS
22430 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a 20  ortingIdx, 1);. 
22440 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
22450 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
22460 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
22470 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
22480 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22490 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
224a0 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
224b0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
224c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
224d0 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  , "output final 
224e0 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  row"));..      /
224f0 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  * Jump over the 
22500 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20  subroutines.    
22510 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
22520 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22530 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
22540 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  End);..      /* 
22550 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
22560 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
22570 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ts a single row 
22580 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
22590 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69      ** set.  Thi
225a0 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72  s subroutine fir
225b0 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  st looks at the 
225c0 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55  iUseFlag.  If iU
225d0 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  seFlag.      ** 
225e0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
225f0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
22600 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73  he subroutine is
22610 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20   a no-op.  If.  
22620 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
22630 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20  ssing calls for 
22640 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f  the query to abo
22650 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  rt, this subrout
22660 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ine.      ** inc
22670 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f  rements the iAbo
22680 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f  rtFlag memory lo
22690 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65  cation before re
226a0 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20  turning in.     
226b0 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67   ** order to sig
226c0 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  nal the caller t
226d0 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a  o abort..      *
226e0 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41  /.      addrSetA
226f0 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  bort = sqlite3Vd
22700 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
22710 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22720 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22730 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f  Integer, 1, iAbo
22740 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
22750 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
22760 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29  set abort flag")
22770 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22780 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
22790 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
227a0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71  utRow);.      sq
227b0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
227c0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74  Label(v, addrOut
227d0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61  putRow);.      a
227e0 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
227f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
22800 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
22810 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22820 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
22830 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
22840 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20  putRow+2);.     
22850 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
22860 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74   "Groupby result
22870 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79   generator entry
22880 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20   point"));.     
22890 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
228a0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
228b0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
228c0 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
228d0 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
228e0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
228f0 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67       if( pHaving
22900 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22910 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
22920 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
22930 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
22940 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
22950 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
22960 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
22970 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
22980 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70  >pEList, 0, 0, p
22990 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
229a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
229b0 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
229c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229d0 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
229e0 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62  Row+1, addrSetAb
229f0 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ort);.      sqli
22a00 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
22a10 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
22a20 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
22a30 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
22a40 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65   "end groupby re
22a50 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29  sult generator")
22a60 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
22a70 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
22a80 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73  ne that will res
22a90 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20  et the group-by 
22aa0 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20  accumulator.    
22ab0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
22ac0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
22ad0 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29  el(v, addrReset)
22ae0 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  ;.      resetAcc
22af0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
22b00 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
22b10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22b20 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
22b30 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20  n, regReset);.  
22b40 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64     .    } /* end
22b50 69 66 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20  if pGroupBy */. 
22b60 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
22b70 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d  ExprList *pDel =
22b80 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
22b90 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
22ba0 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  NT.      Table *
22bb0 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
22bc0 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65  (pTab = isSimple
22bd0 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e  Count(p, &sAggIn
22be0 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  fo))!=0 ){.     
22bf0 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c     /* If isSimpl
22c00 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73  eCount() returns
22c10 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
22c20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c  Table structure,
22c30 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
22c40 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
22c50 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
22c60 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  m:.        **.  
22c70 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
22c80 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
22c90 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a  <tbl>.        **
22ca0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72  .        ** wher
22cb0 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
22cc0 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72  cture returned r
22cd0 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20  epresents table 
22ce0 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a  <tbl>..        *
22cf0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
22d00 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  s statement is s
22d10 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74  o common that it
22d20 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70   is optimized sp
22d30 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20  ecially. The.   
22d40 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74       ** OP_Count
22d50 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
22d60 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20  executed either 
22d70 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61  on the intkey ta
22d80 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  ble that.       
22d90 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
22da0 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20   data for table 
22db0 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20  <tbl> or on one 
22dc0 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20  of its indexes. 
22dd0 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  It.        ** is
22de0 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75   better to execu
22df0 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20  te the op on an 
22e00 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65  index, as indexe
22e10 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20  s are almost.   
22e20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
22e30 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73  pread across les
22e40 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65  s pages than the
22e50 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ir corresponding
22e60 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20   tables..       
22e70 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
22e80 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69  t int iDb = sqli
22e90 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
22ea0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
22eb0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
22ec0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
22ed0 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Csr = pParse->nT
22ee0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72  ab++;     /* Cur
22ef0 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72  sor to scan b-tr
22f00 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ee */.        In
22f10 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
22f40 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
22f50 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
22f60 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Info = 0;       
22f70 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e          /* Keyin
22f80 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69  fo for scanned i
22f90 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
22fa0 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
22fb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22fc0 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64       /* Best ind
22fd0 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20  ex found so far 
22fe0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
22ff0 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75  Root = pTab->tnu
23000 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
23010 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
23020 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a  scanned b-tree *
23030 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  /..        sqlit
23040 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
23050 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
23060 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23070 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
23080 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
23090 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
230a0 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  e);..        /* 
230b0 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69  Search for the i
230c0 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68  ndex that has th
230d0 65 20 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20 6f  e least amount o
230e0 66 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20 20  f columns. If.  
230f0 20 20 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69        ** there i
23100 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2c  s such an index,
23110 20 61 6e 64 20 69 74 20 68 61 73 20 6c 65 73 73   and it has less
23120 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20 74 68   columns than th
23130 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  e table.        
23140 2a 2a 20 64 6f 65 73 2c 20 74 68 65 6e 20 77 65  ** does, then we
23150 20 63 61 6e 20 61 73 73 75 6d 65 20 74 68 61 74   can assume that
23160 20 69 74 20 63 6f 6e 73 75 6d 65 73 20 6c 65 73   it consumes les
23170 73 20 73 70 61 63 65 20 6f 6e 20 64 69 73 6b 20  s space on disk 
23180 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  and.        ** w
23190 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65  ill therefore be
231a0 20 63 68 65 61 70 65 72 20 74 6f 20 73 63 61 6e   cheaper to scan
231b0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
231c0 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a  e query result..
231d0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68          ** In th
231e0 69 73 20 63 61 73 65 20 73 65 74 20 69 52 6f 6f  is case set iRoo
231f0 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
23200 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
23210 20 69 6e 64 65 78 20 62 2d 74 72 65 65 0a 20 20   index b-tree.  
23220 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 4b 65        ** and pKe
23230 79 49 6e 66 6f 20 74 6f 20 74 68 65 20 4b 65 79  yInfo to the Key
23240 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 72  Info structure r
23250 65 71 75 69 72 65 64 20 74 6f 20 6e 61 76 69 67  equired to navig
23260 61 74 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  ate the.        
23270 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ** index..      
23280 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
23290 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20  In practice the 
232a0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
232b0 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  e will not be us
232c0 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a  ed. It is only .
232d0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65          ** passe
232e0 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65  d to keep OP_Ope
232f0 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20  nRead happy..   
23300 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23310 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
23320 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
23330 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
23340 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
23350 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 6e 43  Best || pIdx->nC
23360 6f 6c 75 6d 6e 3c 70 42 65 73 74 2d 3e 6e 43 6f  olumn<pBest->nCo
23370 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
23380 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78      pBest = pIdx
23390 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
233a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
233b0 69 66 28 20 70 42 65 73 74 20 26 26 20 70 42 65  if( pBest && pBe
233c0 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 54 61 62  st->nColumn<pTab
233d0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
233e0 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73      iRoot = pBes
233f0 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  t->tnum;.       
23400 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
23410 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
23420 6f 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29  o(pParse, pBest)
23430 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
23440 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72       /* Open a r
23450 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
23460 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f   execute the OP_
23470 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65  Count, close the
23480 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20   cursor. */.    
23490 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
234a0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
234b0 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f  Read, iCsr, iRoo
234c0 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  t, iDb);.       
234d0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
234e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
234f0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
23500 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b  , -1, (char *)pK
23510 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
23520 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
23530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
23540 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23550 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43  (v, OP_Count, iC
23560 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  sr, sAggInfo.aFu
23570 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20  nc[0].iMem);.   
23580 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23590 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
235a0 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20  se, iCsr);.     
235b0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
235c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
235d0 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20  EECOUNT */.     
235e0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   {.        /* Ch
235f0 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79  eck if the query
23600 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
23610 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
23620 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
23630 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
23640 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e  T min(x) FROM ..
23650 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ..        **   S
23660 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
23670 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
23680 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69  .        ** If i
23690 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74  t is, then ask t
236a0 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  he code in where
236b0 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  .c to attempt to
236c0 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20   sort results.  
236d0 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74        ** as if t
236e0 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
236f0 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44  ER ON x" or "ORD
23700 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c  ER ON x DESC" cl
23710 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a  ause. .        *
23720 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20  * If where.c is 
23730 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20  able to produce 
23740 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69  results sorted i
23750 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68  n this order, th
23760 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  en.        ** ad
23770 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62  d vdbe code to b
23780 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
23790 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20  processing loop 
237a0 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20  after the .     
237b0 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72     ** first iter
237c0 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65  ation (since the
237d0 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
237e0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20   of the loop is 
237f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72  .        ** guar
23800 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74  anteed to operat
23810 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74  e on the row wit
23820 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72  h the minimum or
23830 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20   maximum .      
23840 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c    ** value of x,
23850 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65   the only row re
23860 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20  quired)..       
23870 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
23880 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75   special flag mu
23890 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  st be passed to 
238a0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
238b0 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a  n() to slightly.
238c0 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
238d0 79 20 62 65 68 61 76 69 6f 75 72 20 61 73 20 66  y behaviour as f
238e0 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20  ollows:.        
238f0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
23900 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  + If the query i
23910 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28  s a "SELECT min(
23920 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  x)", then the lo
23930 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20  op coded by.    
23940 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65      **     where
23950 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74  .c should not it
23960 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76  erate over any v
23970 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c  alues with a NUL
23980 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  L value.        
23990 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20  **     for x..  
239a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
239b0 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69   **   + The opti
239c0 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68  mizer code in wh
239d0 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67  ere.c (the thing
239e0 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68   that decides wh
239f0 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ich.        **  
23a00 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69     index or indi
23a10 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75  ces to use) shou
23a20 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65  ld place a diffe
23a30 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e  rent priority on
23a40 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20   .        **    
23a50 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20   satisfying the 
23a60 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73  'ORDER BY' claus
23a70 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69  e than it does i
23a80 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20  n other cases.. 
23a90 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65         **     Re
23aa0 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20  fer to code and 
23ab0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72  comments in wher
23ac0 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  e.c for details.
23ad0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
23ae0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d      ExprList *pM
23af0 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20  inMax = 0;.     
23b00 20 20 20 75 38 20 66 6c 61 67 20 3d 20 6d 69 6e     u8 flag = min
23b10 4d 61 78 51 75 65 72 79 28 70 29 3b 0a 20 20 20  MaxQuery(p);.   
23b20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b       if( flag ){
23b30 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
23b40 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
23b50 72 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  rty(p->pEList->a
23b60 5b 30 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49  [0].pExpr, EP_xI
23b70 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
23b80 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20        pMinMax = 
23b90 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
23ba0 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
23bb0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 78 2e  ->a[0].pExpr->x.
23bc0 70 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20 20 20  pList,0);.      
23bd0 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d      pDel = pMinM
23be0 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ax;.          if
23bf0 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62  ( pMinMax && !db
23c00 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
23c10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  {.            pM
23c20 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74  inMax->a[0].sort
23c30 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48  Order = flag!=WH
23c40 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
23c50 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20  ?1:0;.          
23c60 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
23c70 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
23c80 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
23c90 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a   }.        }.  .
23ca0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
23cb0 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65  case runs if the
23cc0 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e   aggregate has n
23cd0 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
23ce0 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20  e.  The.        
23cf0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ** processing is
23d00 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69   much simpler si
23d10 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  nce there is onl
23d20 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20  y a single row. 
23d30 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74         ** of out
23d40 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  put..        */.
23d50 20 20 20 20 20 20 20 20 72 65 73 65 74 41 63 63          resetAcc
23d60 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
23d70 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
23d80 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
23d90 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
23da0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
23db0 2c 20 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d  , pWhere, &pMinM
23dc0 61 78 2c 20 66 6c 61 67 2c 20 30 29 3b 0a 20 20  ax, flag, 0);.  
23dd0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
23de0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
23df0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
23e00 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
23e10 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
23e20 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
23e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
23e40 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
23e50 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
23e60 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fo);.        if(
23e70 20 21 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c 61   !pMinMax && fla
23e80 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  g ){.          s
23e90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23ea0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
23eb0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
23ec0 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
23ed0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29  omment((v, "%s()
23ee0 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20   by index",.    
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61              (fla
23f00 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g==WHERE_ORDERBY
23f10 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22  _MIN?"min":"max"
23f20 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  )));.        }. 
23f30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
23f40 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
23f50 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65          finalize
23f60 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
23f70 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
23f80 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
23f90 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
23fa0 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
23fb0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23fc0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
23fd0 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
23fe0 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a  ddrEnd, SQLITE_J
23ff0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
24000 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74    }.      select
24010 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
24020 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
24030 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20  0, 0, 0, -1, .  
24040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24050 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45      pDest, addrE
24060 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  nd, addrEnd);.  
24070 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
24080 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
24090 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  el);.    }.    s
240a0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
240b0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
240c0 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
240d0 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
240e0 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49  query */..  /* I
240f0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
24100 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
24110 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
24120 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
24130 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
24140 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
24150 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
24160 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
24170 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  By ){.    genera
24180 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
24190 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d  e, p, v, pEList-
241a0 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
241b0 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68    }..  /* Jump h
241c0 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73  ere to skip this
241d0 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71   query.  */.  sq
241e0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
241f0 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a  Label(v, iEnd);.
24200 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
24210 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
24220 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
24230 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
24240 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
24250 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
24260 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
24270 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
24280 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
24290 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
242a0 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
242b0 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
242c0 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
242d0 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
242e0 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f  select_end:..  /
242f0 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
24300 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c  n names if resul
24310 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
24320 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75   are to be outpu
24330 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  t..  */.  if( rc
24340 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
24350 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
24360 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67  _Output ){.    g
24370 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
24380 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
24390 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
243a0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  }..  sqlite3DbFr
243b0 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
243c0 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
243d0 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49  DbFree(db, sAggI
243e0 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65  nfo.aFunc);.  re
243f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
24400 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
24410 45 42 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a  EBUG)./*.*******
24420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24460 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
24470 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69  following code i
24480 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
24490 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
244a0 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 64 65   only.  The code
244b0 0a 2a 2a 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  .** that follows
244c0 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
244d0 20 69 6e 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64   in normal build
244e0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  s..**.** These r
244f0 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
24500 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 74 68   to print out th
24510 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c  e content of all
24520 20 6f 72 20 70 61 72 74 20 6f 66 20 61 20 0a 2a   or part of a .*
24530 2a 20 70 61 72 73 65 20 73 74 72 75 63 74 75 72  * parse structur
24540 65 73 20 73 75 63 68 20 61 73 20 53 65 6c 65 63  es such as Selec
24550 74 20 6f 72 20 45 78 70 72 2e 20 20 53 75 63 68  t or Expr.  Such
24560 20 70 72 69 6e 74 6f 75 74 73 20 61 72 65 20 75   printouts are u
24570 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c  seful.** for hel
24580 70 69 6e 67 20 74 6f 20 75 6e 64 65 72 73 74 61  ping to understa
24590 6e 64 20 77 68 61 74 20 69 73 20 68 61 70 70 65  nd what is happe
245a0 6e 69 6e 67 20 69 6e 73 69 64 65 20 74 68 65 20  ning inside the 
245b0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a  code generator.*
245c0 2a 20 64 75 72 69 6e 67 20 74 68 65 20 65 78 65  * during the exe
245d0 63 75 74 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65  cution of comple
245e0 78 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  x SELECT stateme
245f0 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  nts..**.** These
24600 20 72 6f 75 74 69 6e 65 20 61 72 65 20 6e 6f 74   routine are not
24610 20 63 61 6c 6c 65 64 20 61 6e 79 77 68 65 72 65   called anywhere
24620 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
24630 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20   normal.** code 
24640 62 61 73 65 2e 20 20 54 68 65 6e 20 61 72 65 20  base.  Then are 
24650 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 63  intended to be c
24660 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
24670 6e 20 74 68 65 20 64 65 62 75 67 67 65 72 0a 2a  n the debugger.*
24680 2a 20 6f 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72  * or from tempor
24690 61 72 79 20 22 70 72 69 6e 74 66 22 20 73 74 61  ary "printf" sta
246a0 74 65 6d 65 6e 74 73 20 69 6e 73 65 72 74 65 64  tements inserted
246b0 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a   for debugging..
246c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
246d0 72 69 6e 74 45 78 70 72 28 45 78 70 72 20 2a 70  rintExpr(Expr *p
246e0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  ){.  if( p->toke
246f0 6e 2e 7a 20 26 26 20 70 2d 3e 74 6f 6b 65 6e 2e  n.z && p->token.
24700 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  n>0 ){.    sqlit
24710 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
24720 25 2e 2a 73 22 2c 20 70 2d 3e 74 6f 6b 65 6e 2e  %.*s", p->token.
24730 6e 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a  n, p->token.z);.
24740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
24750 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24760 22 28 25 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20  "(%d", p->op);. 
24770 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66   }.  if( p->pLef
24780 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
24790 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29  DebugPrintf(" ")
247a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
247b0 6e 74 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 29  ntExpr(p->pLeft)
247c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
247d0 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  Right ){.    sql
247e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
247f0 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  " ");.    sqlite
24800 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 52  3PrintExpr(p->pR
24810 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ight);.  }.  sql
24820 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24830 22 29 22 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ")");.}.void sql
24840 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
24850 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t(ExprList *pLis
24860 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  t){.  int i;.  f
24870 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
24880 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
24890 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
248a0 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pr(pList->a[i].p
248b0 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 69  Expr);.    if( i
248c0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20  <pList->nExpr-1 
248d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
248e0 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20 22  DebugPrintf(", "
248f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76  );.    }.  }.}.v
24900 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
24910 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70  Select(Select *p
24920 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20  , int indent){. 
24930 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24940 6e 74 66 28 22 25 2a 73 53 45 4c 45 43 54 28 25  ntf("%*sSELECT(%
24950 70 29 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  p) ", indent, ""
24960 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  , p);.  sqlite3P
24970 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  rintExprList(p->
24980 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
24990 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
249a0 6e 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  n");.  if( p->pS
249b0 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  rc ){.    char *
249c0 7a 50 72 65 66 69 78 3b 0a 20 20 20 20 69 6e 74  zPrefix;.    int
249d0 20 69 3b 0a 20 20 20 20 7a 50 72 65 66 69 78 20   i;.    zPrefix 
249e0 3d 20 22 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f  = "FROM";.    fo
249f0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63  r(i=0; i<p->pSrc
24a00 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
24a10 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
24a20 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
24a30 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b   &p->pSrc->a[i];
24a40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
24a50 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 22  bugPrintf("%*s "
24a60 2c 20 69 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65  , indent+6, zPre
24a70 66 69 78 29 3b 0a 20 20 20 20 20 20 7a 50 72 65  fix);.      zPre
24a80 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  fix = "";.      
24a90 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
24aa0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
24ab0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24ac0 28 22 28 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ("(\n");.       
24ad0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c   sqlite3PrintSel
24ae0 65 63 74 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65  ect(pItem->pSele
24af0 63 74 2c 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a  ct, indent+10);.
24b00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
24b10 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 29  ebugPrintf("%*s)
24b20 22 2c 20 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29  ", indent+8, "")
24b30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
24b40 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29  ( pItem->zName )
24b50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24b60 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73  3DebugPrintf("%s
24b70 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ", pItem->zName)
24b80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24b90 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20  if( pItem->pTab 
24ba0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
24bb0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
24bc0 74 61 62 6c 65 3a 20 25 73 29 22 2c 20 70 49 74  table: %s)", pIt
24bd0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
24be0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24bf0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
24c00 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
24c10 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24c20 22 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d  " AS %s", pItem-
24c30 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  >zAlias);.      
24c40 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70 2d  }.      if( i<p-
24c50 3e 70 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b  >pSrc->nSrc-1 ){
24c60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24c70 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 22 29  DebugPrintf(",")
24c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24c90 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24ca0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  tf("\n");.    }.
24cb0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68    }.  if( p->pWh
24cc0 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ere ){.    sqlit
24cd0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
24ce0 2a 73 20 57 48 45 52 45 20 22 2c 20 69 6e 64 65  *s WHERE ", inde
24cf0 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
24d00 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
24d10 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
24d20 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24d30 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ("\n");.  }.  if
24d40 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  ( p->pGroupBy ){
24d50 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
24d60 67 50 72 69 6e 74 66 28 22 25 2a 73 20 47 52 4f  gPrintf("%*s GRO
24d70 55 50 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c  UP BY ", indent,
24d80 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
24d90 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70  3PrintExprList(p
24da0 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
24db0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24dc0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
24dd0 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20   if( p->pHaving 
24de0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
24df0 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 48  bugPrintf("%*s H
24e00 41 56 49 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c  AVING ", indent,
24e10 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
24e20 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 48  3PrintExpr(p->pH
24e30 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
24e40 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24e50 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
24e60 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
24e70 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24e80 72 69 6e 74 66 28 22 25 2a 73 20 4f 52 44 45 52  rintf("%*s ORDER
24e90 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22   BY ", indent, "
24ea0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
24eb0 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  rintExprList(p->
24ec0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73  pOrderBy);.    s
24ed0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24ee0 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f  f("\n");.  }.}./
24ef0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72  * End of the str
24f00 75 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69  ucture debug pri
24f10 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a  nting code.*****
24f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f60 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
24f70 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
24f80 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
24f90 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
24fa0 29 20 2a 2f 0a                                   ) */.