/ Hex Artifact Content
Login

Artifact 462d9671e91accd983110fa38674be0d2a3daa66:


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 37  select.c,v 1.507
0200: 20 32 30 30 39 2f 30 34 2f 30 32 20 31 36 3a 35   2009/04/02 16:5
0210: 39 3a 34 37 20 64 72 68 20 45 78 70 20 24 0a 2a  9:47 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 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
b4f0: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
b500: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
b510: 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
b520: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29  ->a[iCol].pExpr)
b530: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
b540: 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Ret;.}.#endif /*
b550: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
b560: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
b570: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
b580: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
b590: 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
b5a0: 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
b5b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
b5c0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
b5d0: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
b5e0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
b5f0: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
b600: 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
b610: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
b620: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
b630: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
b640: 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
b650: 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64  ts */.);...#ifnd
b660: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
b670: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
b680: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b690: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
b6a0: 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e  rocess a compoun
b6b0: 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f  d query form fro
b6c0: 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65  m.** two or more
b6d0: 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65   separate querie
b6e0: 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55  s using UNION, U
b6f0: 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54  NION ALL, EXCEPT
b700: 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43  , or.** INTERSEC
b710: 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e  T.**.** "p" poin
b720: 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ts to the right-
b730: 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20  most of the two 
b740: 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75  queries.  the qu
b750: 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65  ery on the.** le
b760: 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e  ft is p->pPrior.
b770: 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79    The left query
b780: 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61   could also be a
b790: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a   compound query.
b7a0: 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  ** in which case
b7b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
b7c0: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63  ll be called rec
b7d0: 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a  ursively. .**.**
b7e0: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
b7f0: 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
b800: 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  are to be writte
b810: 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61  n into a destina
b820: 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20  tion.** of type 
b830: 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d  eDest with param
b840: 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  eter iParm..**.*
b850: 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f  * Example 1:  Co
b860: 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77  nsider a three-w
b870: 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20  ay compound SQL 
b880: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
b890: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
b8a0: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
b8b0: 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT b FROM t2 UNI
b8c0: 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  ON SELECT c FROM
b8d0: 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73   t3.**.** This s
b8e0: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
b8f0: 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73  ed up as follows
b900: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
b910: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20  CT c FROM t3.** 
b920: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60       |.**      `
b930: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62  ----->  SELECT b
b940: 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20   FROM t2.**     
b950: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60                 `
b970: 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  ------>  SELECT 
b980: 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20  a FROM t1.**.** 
b990: 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68  The arrows in th
b9a0: 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20  e diagram above 
b9b0: 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65  represent the Se
b9c0: 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e  lect.pPrior poin
b9d0: 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68  ter..** So if th
b9e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
b9f0: 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61  lled with p equa
ba00: 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72  l to the t3 quer
ba10: 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f  y, then.** pPrio
ba20: 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32  r will be the t2
ba30: 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77   query.  p->op w
ba40: 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20  ill be TK_UNION 
ba50: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
ba60: 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20  .** Notice that 
ba70: 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
ba80: 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73  ay SQLite parses
ba90: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
baa0: 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  s, the.** indivi
bab0: 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77  dual selects alw
bac0: 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c  ays group from l
bad0: 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f  eft to right..*/
bae0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
baf0: 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  iSelect(.  Parse
bb00: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
bb10: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
bb20: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
bb30: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
bb40: 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
bb50: 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
bb60: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
bb70: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
bb80: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
bb90: 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
bba0: 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
bbb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
bbc0: 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64    /* Success cod
bbd0: 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74  e from a subrout
bbe0: 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ine */.  Select 
bbf0: 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
bc00: 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
bc10: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
bc20: 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
bc30: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
bc40: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
bc50: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
bc60: 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
bc70: 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20  t dest;      /* 
bc80: 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61  Alternative data
bc90: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
bca0: 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74    Select *pDelet
bcb0: 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e  e = 0;  /* Chain
bcc0: 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63   of simple selec
bcd0: 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ts to delete */.
bce0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
bcf0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
bd00: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
bd10: 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  /..  /* Make sur
bd20: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
bd30: 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
bd40: 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
bd50: 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
bd60: 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
bd70: 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
bd80: 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
bd90: 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
bda0: 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
bdb0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26  */.  assert( p &
bdc0: 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20  & p->pPrior );  
bdd0: 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74  /* Calling funct
bde0: 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74  ion guarantees t
bdf0: 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64 62  his much */.  db
be00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
be10: 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
be20: 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
be30: 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
be40: 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61  t!=pPrior );.  a
be50: 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
be60: 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52  Rightmost==p->pR
be70: 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65  ightmost );.  de
be80: 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69  st = *pDest;.  i
be90: 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  f( pPrior->pOrde
bea0: 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
beb0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
bec0: 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  e,"ORDER BY clau
bed0: 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
bee0: 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
bef0: 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
bf00: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
bf10: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
bf20: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
bf30: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  ct_end;.  }.  if
bf40: 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
bf50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
bf60: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
bf70: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f  LIMIT clause sho
bf80: 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
bf90: 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
bfa0: 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
bfb0: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
bfc0: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
bfd0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
bfe0: 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c  ;.  }..  v = sql
bff0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
c000: 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
c010: 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56  !=0 );  /* The V
c020: 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61  DBE already crea
c030: 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66  ted by calling f
c040: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  unction */..  /*
c050: 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74   Create the dest
c060: 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72  ination temporar
c070: 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73  y table if neces
c080: 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sary.  */.  if( 
c090: 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
c0a0: 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
c0b0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
c0c0: 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
c0d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c0e0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
c0f0: 64 65 73 74 2e 69 50 61 72 6d 2c 20 70 2d 3e 70  dest.iParm, p->p
c100: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
c110: 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
c120: 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
c130: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
c140: 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68  ll SELECTs in th
c150: 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65  e statement have
c160: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
c170: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a   of elements.  *
c180: 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c  * in their resul
c190: 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61  t sets..  */.  a
c1a0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
c1b0: 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
c1c0: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
c1d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
c1e0: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
c1f0: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
c200: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
c210: 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
c220: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
c230: 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22  t of %s".      "
c240: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
c250: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
c260: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
c270: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
c280: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
c290: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
c2a0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c2b0: 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64  }..  /* Compound
c2c0: 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61   SELECTs that ha
c2d0: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ve an ORDER BY c
c2e0: 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65  lause are handle
c2f0: 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20  d separately..  
c300: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  */.  if( p->pOrd
c310: 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  erBy ){.    retu
c320: 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  rn multiSelectOr
c330: 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
c340: 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pDest);.  }..  
c350: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
c360: 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e   for the left an
c370: 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73  d right SELECT s
c380: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
c390: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
c3a0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
c3b0: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
c3c0: 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
c3d0: 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
c3e0: 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20  >pLimit );.     
c3f0: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
c400: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
c410: 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73     pPrior->pOffs
c420: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
c430: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c440: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
c450: 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
c460: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
c470: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
c480: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
c490: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
c4a0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
c4b0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
c4c0: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
c4d0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
c4e0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
c4f0: 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
c500: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
c510: 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
c520: 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
c530: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  it ){.        ad
c540: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
c550: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a  AddOp1(v, OP_IfZ
c560: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b  ero, p->iLimit);
c570: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
c580: 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61  ment((v, "Jump a
c590: 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
c5a0: 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
c5b0: 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
c5c0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
c5d0: 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
c5e0: 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
c5f0: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
c600: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
c610: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  r;.      if( rc 
c620: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
c630: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c640: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c650: 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
c660: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c670: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
c680: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c690: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c6a0: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
c6b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49  .    case TK_UNI
c6c0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
c6d0: 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
c6e0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
c6f0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
c700: 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
c710: 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ult */.      u8 
c720: 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  op = 0;       /*
c730: 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f   One of the SRT_
c740: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61   operations to a
c750: 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a  pply to self */.
c760: 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
c770: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
c780: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
c790: 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
c7a0: 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  elects */.      
c7b0: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
c7c0: 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64  Offset; /* Saved
c7d0: 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c   values of p->nL
c7e0: 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66  imit and p->nOff
c7f0: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  set */.      int
c800: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
c810: 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73  ectDest uniondes
c820: 74 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f  t;..      priorO
c830: 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
c840: 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
c850: 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20  est==priorOp && 
c860: 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c 69 6d 69  ALWAYS(!p->pLimi
c870: 74 20 26 26 21 70 2d 3e 70 4f 66 66 73 65 74 29  t &&!p->pOffset)
c880: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
c890: 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
c8a0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
c8b0: 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
c8c0: 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
c8d0: 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
c8e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c8f0: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
c900: 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20 2f 2a 20  tmost!=p );  /* 
c910: 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  Can only happen 
c920: 66 6f 72 20 6c 65 66 74 77 61 72 64 20 65 6c 65  for leftward ele
c930: 6d 65 6e 74 73 0a 20 20 20 20 20 20 20 20 20 20  ments.          
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c950: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66             ** of
c960: 20 61 20 33 2d 77 61 79 20 6f 72 20 6d 6f 72 65   a 3-way or more
c970: 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 20   compound */.   
c980: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c990: 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20  pLimit==0 );    
c9a0: 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
c9b0: 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
c9c0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
c9d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
c9e0: 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a  set==0 );     /*
c9f0: 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
ca00: 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
ca10: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69  s */.        uni
ca20: 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 50 61  onTab = dest.iPa
ca30: 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
ca40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
ca50: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
ca60: 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
ca70: 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
ca80: 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
ca90: 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
caa0: 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
cab0: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
cac0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
cad0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ab++;.        as
cae0: 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
caf0: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y==0 );.        
cb00: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
cb10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
cb20: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e  penEphemeral, un
cb30: 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
cb40: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
cb50: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
cb60: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
cb70: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
cb80: 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
cb90: 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
cba0: 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
cbb0: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
cbc0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
cbd0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
cbe0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
cbf0: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
cc00: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
cc10: 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
cc20: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
cc30: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
cc40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
cc50: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75  electDestInit(&u
cc60: 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f  niondest, priorO
cc70: 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
cc80: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cc90: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
cca0: 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73  Prior, &uniondes
ccb0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
ccc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
ccd0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
cce0: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
ccf0: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
cd00: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
cd10: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a  tement.      */.
cd20: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
cd30: 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20  =TK_EXCEPT ){.  
cd40: 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45        op = SRT_E
cd50: 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c  xcept;.      }el
cd60: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
cd70: 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  rt( p->op==TK_UN
cd80: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  ION );.        o
cd90: 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
cda0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
cdb0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
cdc0: 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
cdd0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
cde0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
cdf0: 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
ce00: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
ce10: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
ce20: 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65     uniondest.eDe
ce30: 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 72  st = op;.      r
ce40: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
ce50: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e  t(pParse, p, &un
ce60: 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
ce70: 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e  /* Query flatten
ce80: 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65  ing in sqlite3Se
ce90: 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66  lect() might ref
cea0: 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e  ill p->pOrderBy.
ceb0: 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72  .      ** Be sur
cec0: 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70  e to delete p->p
ced0: 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f  OrderBy, therefo
cee0: 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  re, to avoid a m
cef0: 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20  emory leak. */. 
cf00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
cf10: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
cf20: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
cf30: 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
cf40: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
cf50: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
cf60: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
cf70: 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
cf80: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
cf90: 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
cfa0: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
cfb0: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
cfc0: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
cfd0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
cfe0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
cff0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
d000: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
d010: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
d020: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d030: 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
d040: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
d050: 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
d060: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
d070: 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
d080: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
d090: 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
d0a0: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20  need..      */  
d0b0: 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 64      .      if( d
d0c0: 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
d0d0: 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d  Op || unionTab!=
d0e0: 64 65 73 74 2e 69 50 61 72 6d 20 29 7b 0a 20 20  dest.iParm ){.  
d0f0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
d100: 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
d110: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d120: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
d130: 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
d140: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
d150: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65   ){.          Se
d160: 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
d170: 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
d180: 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
d190: 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
d1a0: 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
d1b0: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
d1c0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
d1d0: 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
d1e0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
d1f0: 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
d200: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
d210: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
d220: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
d230: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d240: 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
d250: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
d260: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
d270: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
d280: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d290: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
d2a0: 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
d2b0: 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
d2c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
d2d0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
d2e0: 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
d2f0: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
d300: 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e  p->pEList, union
d310: 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Tab, p->pEList->
d320: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d340: 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f  , -1, &dest, iCo
d350: 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
d360: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d370: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
d380: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
d390: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d3a0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  2(v, OP_Next, un
d3b0: 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
d3c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d3d0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
d3e0: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
d3f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d400: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
d410: 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
d420: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d430: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
d440: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
d450: 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  CT: {.      int 
d460: 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20  tab1, tab2;.    
d470: 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
d480: 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
d490: 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
d4a0: 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20   *pOffset;.     
d4b0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
d4c0: 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65   SelectDest inte
d4d0: 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20  rsectdest;.     
d4e0: 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20   int r1;..      
d4f0: 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
d500: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
d510: 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
d520: 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
d530: 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
d540: 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
d550: 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
d560: 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
d570: 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
d580: 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
d590: 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
d5a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
d5b0: 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
d5c0: 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
d5d0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
d5e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d5f0: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
d600: 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ..      addr = s
d610: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d620: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
d630: 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a  eral, tab1, 0);.
d640: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
d650: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
d660: 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
d670: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
d680: 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
d690: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e   p->pRightmost->
d6a0: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
d6b0: 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
d6c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
d6d0: 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20  EList );..      
d6e0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
d6f0: 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
d700: 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
d710: 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
d720: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
d730: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
d740: 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  t(&intersectdest
d750: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
d760: 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  1);.      rc = s
d770: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
d780: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e  rse, pPrior, &in
d790: 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
d7a0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
d7b0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
d7c0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
d7d0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
d7e0: 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
d7f0: 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70  SELECT into temp
d800: 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
d810: 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  2".      */.    
d820: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
d830: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d840: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
d850: 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
d860: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
d870: 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31  penEphm[1] == -1
d880: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
d890: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61  rOpenEphm[1] = a
d8a0: 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ddr;.      p->pP
d8b0: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
d8c0: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
d8d0: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
d8e0: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
d8f0: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
d900: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
d910: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
d920: 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69   intersectdest.i
d930: 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20  Parm = tab2;.   
d940: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
d950: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
d960: 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
d970: 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
d980: 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
d990: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
d9a0: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  Prior;.      sql
d9b0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
d9c0: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
d9d0: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
d9e0: 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
d9f0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
da00: 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72  set;.      if( r
da10: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
da20: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
da30: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
da40: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
da50: 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ode to take the 
da60: 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
da70: 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72  the two temporar
da80: 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  y.      ** table
da90: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
daa0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
dab0: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ist );.      if(
dac0: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
dad0: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
dae0: 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
daf0: 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77  t = p;.        w
db00: 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
db10: 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
db20: 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
db30: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
db40: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
db50: 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
db60: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
db70: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
db80: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
db90: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43  bel(v);.      iC
dba0: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
dbb0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
dbc0: 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
dbd0: 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
dbe0: 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
dbf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dc00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
dc10: 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61  ind, tab1, iBrea
dc20: 6b 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  k);.      r1 = s
dc30: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
dc40: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
dc50: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
dc60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
dc70: 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72  _RowKey, tab1, r
dc80: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
dc90: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
dca0: 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
dcb0: 2c 20 69 43 6f 6e 74 2c 20 72 31 29 3b 0a 20 20  , iCont, r1);.  
dcc0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
dcd0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
dce0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c  , r1);.      sel
dcf0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
dd00: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
dd10: 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69  t, tab1, p->pELi
dd20: 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69   0, -1, &dest, i
dd50: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
dd60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd70: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
dd80: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
dd90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
dda0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
ddb0: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
ddc0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
ddd0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
dde0: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
ddf0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
de00: 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20  OP_Close, tab2, 
de10: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
de20: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
de30: 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30  P_Close, tab1, 0
de40: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
de50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
de60: 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e  Compute collatin
de70: 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64  g sequences used
de80: 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72   by .  ** tempor
de90: 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
dea0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
deb0: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
dec0: 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
ded0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
dee0: 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
def0: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20  porary tables.. 
df00: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
df10: 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
df20: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
df30: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
df40: 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
df50: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
df60: 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
df70: 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
df80: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
df90: 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
dfa0: 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
dfb0: 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
dfc0: 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
dfd0: 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
dfe0: 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
dff0: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
e000: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
e010: 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  & SF_UsesEphemer
e020: 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  al ){.    int i;
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e040: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
e050: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b  counter */.    K
e060: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
e070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e080: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
e090: 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ce for the resul
e0a0: 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c  t set */.    Sel
e0b0: 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  ect *pLoop;     
e0c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
e0d0: 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
e0e0: 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  h SELECT stateme
e0f0: 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  nts */.    CollS
e100: 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20  eq **apColl;    
e110: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
e120: 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
e130: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
e140: 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  ] */.    int nCo
e150: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
e160: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
e170: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72   of columns in r
e180: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
e190: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
e1a0: 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20  ghtmost==p );.  
e1b0: 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
e1c0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70  st->nExpr;.    p
e1d0: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
e1e0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
e1f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e200: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
e210: 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a  *pKeyInfo)+nCol*
e220: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
e230: 29 20 2b 20 31 29 29 3b 0a 20 20 20 20 69 66 28  ) + 1));.    if(
e240: 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
e250: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e260: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
e270: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
e280: 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  nd;.    }..    p
e290: 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45  KeyInfo->enc = E
e2a0: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 4b 65 79  NC(db);.    pKey
e2b0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28  Info->nField = (
e2c0: 75 31 36 29 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66  u16)nCol;..    f
e2d0: 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70  or(i=0, apColl=p
e2e0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20  KeyInfo->aColl; 
e2f0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43  i<nCol; i++, apC
e300: 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61  oll++){.      *a
e310: 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
e320: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
e330: 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
e340: 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29  if( 0==*apColl )
e350: 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c  {.        *apCol
e360: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
e370: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
e380: 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ..    for(pLoop=
e390: 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
e3a0: 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  pLoop->pPrior){.
e3b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e3c0: 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
e3d0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f    int addr = pLo
e3e0: 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
e3f0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
e400: 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20   addr<0 ){.     
e410: 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69       /* If [0] i
e420: 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31  s unused then [1
e430: 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64  ] is also unused
e440: 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20  .  So we can.   
e450: 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
e460: 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73   safely abort as
e470: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72   soon as the fir
e480: 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  st unused slot i
e490: 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  s found */.     
e4a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
e4b0: 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
e4c0: 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20  [1]<0 );.       
e4d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e4e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
e4f0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
e500: 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a  v, addr, nCol);.
e510: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e520: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
e530: 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79  ddr, (char*)pKey
e540: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
e550: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
e560: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
e570: 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  ] = -1;.      }.
e580: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e590: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b 65 79  3DbFree(db, pKey
e5a0: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
e5b0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
e5c0: 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 64 65  pDest->iMem = de
e5d0: 73 74 2e 69 4d 65 6d 3b 0a 20 20 70 44 65 73 74  st.iMem;.  pDest
e5e0: 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73 74 2e 6e 4d  ->nMem = dest.nM
e5f0: 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  em;.  sqlite3Sel
e600: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  ectDelete(db, pD
e610: 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e  elete);.  return
e620: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
e630: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
e640: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
e650: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f  ./*.** Code an o
e660: 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
e670: 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65   for a coroutine
e680: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
e690: 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  of a.** SELECT s
e6a0: 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  tatment..**.** T
e6b0: 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75  he data to be ou
e6c0: 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65  tput is containe
e6d0: 64 20 69 6e 20 70 49 6e 2d 3e 69 4d 65 6d 2e 20  d in pIn->iMem. 
e6e0: 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49   There are.** pI
e6f0: 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75 6d 6e 73 20  n->nMem columns 
e700: 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70  to be output.  p
e710: 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68  Dest is where th
e720: 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a  e output should.
e730: 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a  ** be sent..**.*
e740: 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74  * regReturn is t
e750: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  he number of the
e760: 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
e770: 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  g the subroutine
e780: 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65  .** return addre
e790: 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67  ss..**.** If reg
e7a0: 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69  Prev>0 then it i
e7b0: 73 20 61 20 74 68 65 20 66 69 72 73 74 20 72 65  s a the first re
e7c0: 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74  gister in a vect
e7d0: 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72  or that.** recor
e7e0: 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ds the previous 
e7f0: 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67  output.  mem[reg
e800: 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20  Prev] is a flag 
e810: 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a  that is false.**
e820: 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
e830: 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f  en no previous o
e840: 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72  utput.  If regPr
e850: 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69  ev>0 then code i
e860: 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74  s.** generated t
e870: 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69  o suppress dupli
e880: 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f  cates.  pKeyInfo
e890: 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d   is used for com
e8a0: 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a  paring.** keys..
e8b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d  **.** If the LIM
e8c0: 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69  IT found in p->i
e8d0: 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64  Limit is reached
e8e0: 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  , jump immediate
e8f0: 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e  ly to.** iBreak.
e900: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
e910: 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
e920: 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65  routine(.  Parse
e930: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e940: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
e950: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
e960: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
e970: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
e980: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
e990: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c  SelectDest *pIn,
e9a0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75          /* Corou
e9b0: 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64  tine supplying d
e9c0: 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
e9d0: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
e9e0: 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e   /* Where to sen
e9f0: 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  d the data */.  
ea00: 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20  int regReturn,  
ea10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
ea20: 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
ea30: 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
ea40: 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20  regPrev,        
ea50: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
ea60: 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e  result register.
ea70: 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20    No uniqueness 
ea80: 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  if 0 */.  KeyInf
ea90: 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
eaa0: 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69    /* For compari
eab0: 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73  ng with previous
eac0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20   entry */.  int 
ead0: 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  p4type,         
eae0: 20 20 20 20 2f 2a 20 54 68 65 20 70 34 20 74 79      /* The p4 ty
eaf0: 70 65 20 66 6f 72 20 70 4b 65 79 49 6e 66 6f 20  pe for pKeyInfo 
eb00: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eb20: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65 20  Jump here if we 
eb30: 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f  hit the LIMIT */
eb40: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
eb50: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
eb60: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a   int iContinue;.
eb70: 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61    int addr;..  a
eb80: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
eb90: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
eba0: 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73  .  iContinue = s
ebb0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
ebc0: 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75  bel(v);..  /* Su
ebd0: 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
ebe0: 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43  s for UNION, EXC
ebf0: 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
ec00: 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  CT .  */.  if( r
ec10: 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e  egPrev ){.    in
ec20: 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31  t j1, j2;.    j1
ec30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ec40: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
ec50: 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
ec60: 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j2 = sqlite3Vdbe
ec70: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
ec80: 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  pare, pIn->iMem,
ec90: 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
eca0: 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20  >nMem,.         
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecc0: 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
ecd0: 49 6e 66 6f 2c 20 70 34 74 79 70 65 29 3b 0a 20  Info, p4type);. 
ece0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ecf0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
ed00: 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65   j2+2, iContinue
ed10: 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71 6c  , j2+2);.    sql
ed20: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
ed30: 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c  (v, j1);.    sql
ed40: 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79  ite3ExprCodeCopy
ed50: 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d  (pParse, pIn->iM
ed60: 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  em, regPrev+1, p
ed70: 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 73  In->nMem);.    s
ed80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ed90: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
eda0: 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d  1, regPrev);.  }
edb0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
edc0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
edd0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
ede0: 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20 74  * Suppress the t
edf0: 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
ee00: 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65  entries if there
ee10: 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c   is an OFFSET cl
ee20: 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65  ause.  */.  code
ee30: 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f  Offset(v, p, iCo
ee40: 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74  ntinue);..  swit
ee50: 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  ch( pDest->eDest
ee60: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65   ){.    /* Store
ee70: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
ee80: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
ee90: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
eea0: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
eeb0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
eec0: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
eed0: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
eee0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
eef0: 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
ef00: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
ef10: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
ef20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ef30: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
ef40: 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
ef50: 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 20  Mem, pIn->nMem, 
ef60: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
ef70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ef80: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65  OP_NewRowid, pDe
ef90: 73 74 2d 3e 69 50 61 72 6d 2c 20 72 32 29 3b 0a  st->iParm, r2);.
efa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
efb0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
efc0: 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61  sert, pDest->iPa
efd0: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
efe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
eff0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
f000: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
f010: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
f020: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
f030: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f040: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
f050: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
f060: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
f070: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f080: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
f090: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
f0a0: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
f0b0: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
f0c0: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
f0d0: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
f0e0: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
f0f0: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
f100: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
f110: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
f120: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
f130: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
f140: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
f150: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
f160: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t: {.      int r
f170: 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
f180: 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b   pIn->nMem==1 );
f190: 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69  .      p->affini
f1a0: 74 79 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73  ty = .         s
f1b0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
f1c0: 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d  inity(p->pEList-
f1d0: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65  >a[0].pExpr, pDe
f1e0: 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20  st->affinity);. 
f1f0: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
f200: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
f210: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
f220: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
f230: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
f240: 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72 31 2c  In->iMem, 1, r1,
f250: 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31   &p->affinity, 1
f260: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f270: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
f280: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
f290: 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20  pIn->iMem, 1);. 
f2a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f2b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
f2c0: 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
f2d0: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
f2e0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
f2f0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
f300: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
f310: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f  .    }..#if 0  /
f320: 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f  * Never occurs o
f330: 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75  n an ORDER BY qu
f340: 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  ery */.    /* If
f350: 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
f360: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
f370: 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
f380: 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
f390: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
f3a0: 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
f3b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f3c0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
f3d0: 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 50 61  r, 1, pDest->iPa
f3e0: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
f3f0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
f400: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
f410: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
f420: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f430: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
f440: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
f450: 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
f460: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
f470: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
f480: 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
f490: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
f4a0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
f4b0: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
f4c0: 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
f4d0: 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
f4e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
f4f0: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
f500: 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
f510: 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Mem==1 );.      
f520: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
f530: 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
f540: 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69 50  >iMem, pDest->iP
f550: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
f560: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
f570: 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
f580: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
f590: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
f5a0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
f5b0: 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
f5c0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
f5d0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   */..    /* The 
f5e0: 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
f5f0: 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
f600: 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
f610: 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
f620: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2e 20 20 54   pDest->iMem.  T
f630: 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  hen the co-routi
f640: 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a  ne yields..    *
f650: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  /.    case SRT_C
f660: 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  oroutine: {.    
f670: 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d 65    if( pDest->iMe
f680: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
f690: 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71  pDest->iMem = sq
f6a0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
f6b0: 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
f6c0: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 44  Mem);.        pD
f6d0: 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d  est->nMem = pIn-
f6e0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >nMem;.      }. 
f6f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f700: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
f710: 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73   pIn->iMem, pDes
f720: 74 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e  t->iMem, pDest->
f730: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  nMem);.      sql
f740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
f750: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
f760: 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  t->iParm);.     
f770: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
f780: 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 61 72     /* Results ar
f790: 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
f7a0: 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
f7b0: 65 72 73 2e 20 20 54 68 65 6e 20 74 68 65 0a 20  ers.  Then the. 
f7c0: 20 20 20 2a 2a 20 4f 50 5f 52 65 73 75 6c 74 52     ** OP_ResultR
f7d0: 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  ow opcode is use
f7e0: 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74  d to cause sqlit
f7f0: 65 33 5f 73 74 65 70 28 29 20 74 6f 20 72 65 74  e3_step() to ret
f800: 75 72 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e  urn.    ** the n
f810: 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  ext row of resul
f820: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
f830: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
f840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f850: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
f860: 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69  esultRow, pIn->i
f870: 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b  Mem, pIn->nMem);
f880: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f890: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
f8a0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
f8b0: 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d  n->iMem, pIn->nM
f8c0: 65 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  em);.      break
f8d0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65  ;.    }..#if !de
f8e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
f8f0: 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f  T_TRIGGER).    /
f900: 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65  * Discard the re
f910: 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20  sults.  This is 
f920: 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20  used for SELECT 
f930: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64  statements insid
f940: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64  e.    ** the bod
f950: 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20  y of a TRIGGER. 
f960: 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
f970: 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20  such selects is 
f980: 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75  to call.    ** u
f990: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
f9a0: 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  tions that have 
f9b0: 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57  side effects.  W
f9c0: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20  e do not care.  
f9d0: 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61    ** about the a
f9e0: 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66  ctual results of
f9f0: 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20   the select..   
fa00: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
fa10: 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   {.      break;.
fa20: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
fa30: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
fa40: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
fa50: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
fa60: 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
fa70: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
fa80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
fa90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
faa0: 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69  AddImm, p->iLimi
fab0: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  t, -1);.    sqli
fac0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fad0: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
fae0: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a  Limit, iBreak);.
faf0: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
fb00: 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  te the subroutin
fb10: 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  e return.  */.  
fb20: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
fb30: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
fb40: 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
fb50: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
fb60: 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75  _Return, regRetu
fb70: 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61  rn);..  return a
fb80: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ddr;.}../*.** Al
fb90: 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75  ternative compou
fba0: 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67  nd select code g
fbb0: 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73  enerator for cas
fbc0: 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a  es when there.**
fbd0: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
fbe0: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65  clause..**.** We
fbf0: 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20   assume a query 
fc00: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
fc10: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
fc20: 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70    <selectA>  <op
fc30: 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74  erator>  <select
fc40: 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72  B>  ORDER BY <or
fc50: 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a  derbylist>.**.**
fc60: 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f   <operator> is o
fc70: 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c  ne of UNION ALL,
fc80: 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
fc90: 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54  or INTERSECT.  T
fca0: 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f  he idea.** is to
fcb0: 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65   code both <sele
fcc0: 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74  ctA> and <select
fcd0: 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45  B> with the ORDE
fce0: 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a  R BY clause as.*
fcf0: 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20  * co-routines.  
fd00: 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d  Then run the co-
fd10: 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61  routines in para
fd20: 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74  llel and merge t
fd30: 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
fd40: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20  to the output.  
fd50: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  In addition to t
fd60: 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
fd70: 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74  s (called select
fd80: 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42  A and.** selectB
fd90: 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75  ) there are 7 su
fda0: 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a  broutines:.**.**
fdb0: 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76      outA:    Mov
fdc0: 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
fdd0: 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f  the selectA coro
fde0: 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
fdf0: 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
fe00: 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
fe10: 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a  ound query..**.*
fe20: 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f  *    outB:    Mo
fe30: 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
fe40: 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72   the selectB cor
fe50: 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
fe60: 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
fe70: 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
fe80: 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f  pound query.  (O
fe90: 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f  nly generated fo
fea0: 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20  r UNION and.**  
feb0: 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
fec0: 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e   ALL.  EXCEPT an
fed0: 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76  d INSERTSECT nev
fee0: 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20  er output a row 
fef0: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
ff00: 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79      appears only
ff10: 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20   in B.).**.**   
ff20: 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AltB:    Called
ff30: 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
ff40: 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
ff50: 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42  routines and A<B
ff60: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a  ..**.**    AeqB:
ff70: 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
ff80: 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
ff90: 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
ffa0: 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a  es and A==B..**.
ffb0: 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43  **    AgtB:    C
ffc0: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
ffd0: 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
ffe0: 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
fff0: 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A>B..**.**    
10000 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofA:    Called 
10010 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
10020 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
10030 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  ctA..**.**    Eo
10040 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fB:    Called wh
10050 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
10060 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
10070 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  B..**.** The imp
10080 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
10090 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73  he latter five s
100a0 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e  ubroutines depen
100b0 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c  d on which .** <
100c0 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65  operator> is use
100d0 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d:.**.**.**     
100e0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
100f0 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  L         UNION 
10100 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50             EXCEP
10110 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52  T          INTER
10120 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  SECT.**         
10130 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20   -------------  
10140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10150 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
10160 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
10170 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20  ----.**   AltB: 
10180 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
10190 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
101a0 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
101b0 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a           nextA.*
101c0 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f  *.**   AeqB:   o
101d0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
101e0 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
101f0 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
10200 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a     outA, nextA.*
10210 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f  *.**   AgtB:   o
10220 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
10230 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
10240 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20       nextB      
10250 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a        nextB.**.*
10260 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42  *   EofA:   outB
10270 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
10280 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
10290 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20    halt          
102a0 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20     halt.**.**   
102b0 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  EofB:   outA, ne
102c0 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
102d0 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
102e0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68   nextA         h
102f0 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  alt.**.** In the
10300 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64   AltB, AeqB, and
10310 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65   AgtB subroutine
10320 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66  s, an EOF on A f
10330 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a  ollowing nextA.*
10340 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65  * causes an imme
10350 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
10360 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e  fA and an EOF on
10370 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   B following nex
10380 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20  tB causes.** an 
10390 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
103a0 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20  o EofB.  Within 
103b0 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61  EofA and EofB, a
103c0 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20  nd EOF on entry 
103d0 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  or.** following 
103e0 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a  nextX causes a j
103f0 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
10400 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f  f the select pro
10410 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44  cessing..**.** D
10420 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
10430 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45   in the UNION, E
10440 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
10450 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61  SECT cases is ha
10460 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ndled.** within 
10470 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
10480 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50  utine.  The regP
10490 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74  rev register set
104a0 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69   holds the previ
104b0 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20  ously.** output 
104c0 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72  value.  A compar
104d0 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61  ison is made aga
104e0 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20  inst this value 
104f0 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
10500 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  * is skipped if 
10510 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73  the next results
10520 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61   would be the sa
10530 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  me as the previo
10540 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  us..**.** The im
10550 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61  plementation pla
10560 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  n is to implemen
10570 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  t the two corout
10580 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a  ines and seven.*
10590 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69  * subroutines fi
105a0 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68  rst, then put th
105b0 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20  e control logic 
105c0 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20  at the bottom.  
105d0 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
105e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49            goto I
105f0 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20  nit.**     coA: 
10600 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
10610 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20  ft query (A).** 
10620 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69      coB: corouti
10630 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65  ne for right que
10640 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74  ry (B).**    out
10650 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  A: output one ro
10660 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74  w of A.**    out
10670 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  B: output one ro
10680 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e  w of B (UNION an
10690 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79  d UNION ALL only
106a0 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e  ).**    EofA: ..
106b0 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e  ..**    EofB: ..
106c0 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e  ..**    AltB: ..
106d0 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e  ..**    AeqB: ..
106e0 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e  ..**    AgtB: ..
106f0 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e  ..**    Init: in
10700 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69  itialize corouti
10710 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  ne registers.** 
10720 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
10730 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oA.**          i
10740 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f  f eof(A) goto Eo
10750 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  fA.**          y
10760 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20  ield coB.**     
10770 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67       if eof(B) g
10780 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43  oto EofB.**    C
10790 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20  mpr: Compare A, 
107a0 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75  B.**          Ju
107b0 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  mp AltB, AeqB, A
107c0 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20  gtB.**     End: 
107d0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c  ....**.** We cal
107e0 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  l AltB, AeqB, Ag
107f0 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f  tB, EofA, and Eo
10800 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22  fB "subroutines"
10810 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f   but they are no
10820 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61  t.** actually ca
10830 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62  lled using Gosub
10840 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74   and they do not
10850 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61   Return.  EofA a
10860 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20  nd EofB loop.** 
10870 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69  until all data i
10880 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e  s exhausted then
10890 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e   jump to the "en
108a0 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20  d" labe.  AltB, 
108b0 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74  AeqB,.** and Agt
108c0 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72  B jump to either
108d0 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66   L2 or to one of
108e0 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a   EofA or EofB..*
108f0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
10900 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
10910 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74  ELECT.static int
10920 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
10930 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
10940 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
10950 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
10960 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
10970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10980 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
10990 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
109a0 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
109b0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
109c0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
109d0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
109e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
109f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10a00 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
10a10 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
10a20 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
10a30 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
10a40 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
10a50 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
10a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10a70 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
10a80 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
10a90 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
10aa0 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tA;     /* Desti
10ab0 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
10ac0 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65  tine A */.  Sele
10ad0 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20  ctDest destB;   
10ae0 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
10af0 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42   for coroutine B
10b00 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
10b10 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rA;         /* A
10b20 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
10b30 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  for select-A cor
10b40 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10b50 72 65 67 45 6f 66 41 3b 20 20 20 20 20 20 20 20  regEofA;        
10b60 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64    /* Flag to ind
10b70 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63  icate when selec
10b80 74 2d 41 20 69 73 20 63 6f 6d 70 6c 65 74 65 20  t-A is complete 
10b90 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
10ba0 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
10bb0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
10bc0 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f  or select-B coro
10bd0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
10be0 65 67 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  egEofB;         
10bf0 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69   /* Flag to indi
10c00 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74  cate when select
10c10 2d 42 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a  -B is complete *
10c20 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
10c30 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctA;      /* Add
10c40 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
10c50 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
10c60 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
10c70 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctB;      /* Add
10c80 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
10c90 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
10ca0 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b  /.  int regOutA;
10cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
10cc0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
10cd0 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  r the output-A s
10ce0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
10cf0 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20  nt regOutB;     
10d00 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
10d10 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
10d20 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
10d30 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
10d40 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20  drOutA;         
10d50 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
10d60 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
10d70 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
10d80 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20  ddrOutB = 0;    
10d90 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
10da0 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
10db0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10dc0 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20  addrEofA;       
10dd0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10de0 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68  the select-A-exh
10df0 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
10e00 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
10e10 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofB;         /* 
10e20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
10e30 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65  elect-B-exhauste
10e40 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
10e50 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20    int addrAltB; 
10e60 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
10e70 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75  ss of the A<B su
10e80 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
10e90 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20  t addrAeqB;     
10ea0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
10eb0 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f  f the A==B subro
10ec0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
10ed0 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20  ddrAgtB;        
10ee0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
10ef0 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e  he A>B subroutin
10f00 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  e */.  int regLi
10f10 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitA;        /* 
10f20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
10f30 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
10f40 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20   int regLimitB; 
10f50 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
10f60 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
10f70 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
10f80 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
10f90 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72   /* A range of r
10fa0 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64  egisters to hold
10fb0 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
10fc0 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c   */.  int savedL
10fd0 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
10fe0 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
10ff0 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74  >iLimit */.  int
11000 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20   savedOffset;   
11010 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
11020 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20  e of p->iOffset 
11030 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d  */.  int labelCm
11040 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  pr;        /* La
11050 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72  bel for the star
11060 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61  t of the merge a
11070 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e  lgorithm */.  in
11080 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20  t labelEnd;     
11090 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
110a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
110b0 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73  overall SELECT s
110c0 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b  tmt */.  int j1;
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
110e0 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  * Jump instructi
110f0 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74  ons that get ret
11100 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e  argetted */.  in
11110 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
11120 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
11130 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20  _ALL, TK_UNION, 
11140 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e  TK_EXCEPT, TK_IN
11150 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79  TERSECT */.  Key
11160 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20  Info *pKeyDup = 
11170 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e  0; /* Comparison
11180 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
11190 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   duplicate remov
111a0 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  al */.  KeyInfo 
111b0 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a  *pKeyMerge;   /*
111c0 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f   Comparison info
111d0 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67  rmation for merg
111e0 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71  ing rows */.  sq
111f0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
11200 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
11210 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
11220 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
11230 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
11240 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
11250 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
11260 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11270 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
11280 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
11290 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72  e */.  int *aPer
112a0 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  mute;        /* 
112b0 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44  Mapping from ORD
112c0 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72  ER BY terms to r
112d0 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
112e0 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
112f0 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29  p->pOrderBy!=0 )
11300 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
11310 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61  Dup==0 ); /* "Ma
11320 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64  naged" code need
11330 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20  s this.  Ticket 
11340 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d  #3382. */.  db =
11350 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
11360 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
11370 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
11380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11390 45 4d 3b 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d  EM;.  labelEnd =
113a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
113b0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65  Label(v);.  labe
113c0 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56  lCmpr = sqlite3V
113d0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
113e0 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70  ...  /* Patch up
113f0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
11400 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ause.  */.  op =
11410 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69   p->op;  .  pPri
11420 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
11430 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
11440 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
11450 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
11460 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73  >pOrderBy;.  ass
11470 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b  ert( pOrderBy );
11480 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
11490 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a  rderBy->nExpr;..
114a0 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f    /* For operato
114b0 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  rs other than UN
114c0 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20  ION ALL we have 
114d0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
114e0 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52  t.  ** the ORDER
114f0 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72   BY clause cover
11500 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  s every term of 
11510 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
11520 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20   Add.  ** terms 
11530 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
11540 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73  clause as necess
11550 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
11560 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op!=TK_ALL ){.  
11570 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d    for(i=1; db->m
11580 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26  allocFailed==0 &
11590 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  & i<=p->pEList->
115a0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
115b0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
115c0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
115d0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
115e0 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
115f0 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b  ; j<nOrderBy; j+
11600 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
11610 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
11620 65 6d 2d 3e 69 43 6f 6c 3e 30 20 29 3b 0a 20 20  em->iCol>0 );.  
11630 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
11640 3e 69 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  >iCol==i ) break
11650 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11660 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
11670 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
11680 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50  *pNew = sqlite3P
11690 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
116a0 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 30  INTEGER, 0, 0, 0
116b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
116c0 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
116d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
116e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
116f0 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  s |= EP_IntValue
11700 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
11710 69 54 61 62 6c 65 20 3d 20 69 3b 0a 20 20 20 20  iTable = i;.    
11720 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73      pOrderBy = s
11730 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
11740 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72  pend(pParse, pOr
11750 64 65 72 42 79 2c 20 70 4e 65 77 2c 20 30 29 3b  derBy, pNew, 0);
11760 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
11770 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
11780 2e 69 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a  .iCol = (u16)i;.
11790 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
117a0 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
117b0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70  the comparison p
117c0 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b  ermutation and k
117d0 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75  eyinfo that is u
117e0 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68  sed with.  ** th
117f0 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 69 6e  e permutation in
11800 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 61 72   order to compar
11810 69 73 6f 6e 73 20 74 6f 20 64 65 74 65 72 6d 69  isons to determi
11820 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20  ne if the next. 
11830 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c   ** row of resul
11840 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65  ts comes from se
11850 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42  lectA or selectB
11860 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c  .  Also add expl
11870 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  icit.  ** collat
11880 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45  ions to the ORDE
11890 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
118a0 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  s so that when t
118b0 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  he subqueries.  
118c0 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  ** to the right 
118d0 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65  and the left are
118e0 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79   evaluated, they
118f0 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74   use the correct
11900 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e  .  ** collation.
11910 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65  .  */.  aPermute
11920 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
11930 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
11940 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b  (int)*nOrderBy);
11950 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20  .  if( aPermute 
11960 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
11970 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
11980 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  em;.    for(i=0,
11990 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
119a0 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; i<nOrderBy; 
119b0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
119c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
119d0 65 6d 2d 3e 69 43 6f 6c 3e 30 20 20 26 26 20 70  em->iCol>0  && p
119e0 49 74 65 6d 2d 3e 69 43 6f 6c 3c 3d 70 2d 3e 70  Item->iCol<=p->p
119f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
11a00 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69        aPermute[i
11a10 5d 20 3d 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20  ] = pItem->iCol 
11a20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  - 1;.    }.    p
11a30 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20 20 20 20  KeyMerge =.     
11a40 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
11a50 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
11a60 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f 72 64 65  pKeyMerge)+nOrde
11a70 72 42 79 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  rBy*(sizeof(Coll
11a80 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 20 20 69  Seq*)+1));.    i
11a90 66 28 20 70 4b 65 79 4d 65 72 67 65 20 29 7b 0a  f( pKeyMerge ){.
11aa0 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
11ab0 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
11ac0 38 2a 29 26 70 4b 65 79 4d 65 72 67 65 2d 3e 61  8*)&pKeyMerge->a
11ad0 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a  Coll[nOrderBy];.
11ae0 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
11af0 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e  >nField = (u16)n
11b00 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
11b10 4b 65 79 4d 65 72 67 65 2d 3e 65 6e 63 20 3d 20  KeyMerge->enc = 
11b20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66  ENC(db);.      f
11b30 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
11b40 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
11b50 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
11b60 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  ;.        Expr *
11b70 70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79  pTerm = pOrderBy
11b80 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
11b90 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
11ba0 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
11bb0 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
11bc0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 54 65 72      pColl = pTer
11bd0 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  m->pColl;.      
11be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11bf0 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
11c00 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
11c10 61 72 73 65 2c 20 70 2c 20 61 50 65 72 6d 75 74  arse, p, aPermut
11c20 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  e[i]);.         
11c30 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d   pTerm->flags |=
11c40 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
11c50 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
11c60 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
11c70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11c80 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f    pKeyMerge->aCo
11c90 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[i] = pColl;. 
11ca0 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65         pKeyMerge
11cb0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
11cc0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
11cd0 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
11ce0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
11cf0 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65  e{.    pKeyMerge
11d00 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
11d10 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44  Reattach the ORD
11d20 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  ER BY clause to 
11d30 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
11d40 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
11d50 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69  pOrderBy;.  pPri
11d60 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  or->pOrderBy = s
11d70 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
11d80 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f  p(pParse->db, pO
11d90 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f  rderBy, 0);..  /
11da0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e  * Allocate a ran
11db0 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  ge of temporary 
11dc0 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
11dd0 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64  e KeyInfo needed
11de0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f  .  ** for the lo
11df0 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73  gic that removes
11e00 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c   duplicate resul
11e10 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a  t rows when the.
11e20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73    ** operator is
11e30 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
11e40 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75  or INTERSECT (bu
11e50 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29  t not UNION ALL)
11e60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
11e70 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
11e80 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65  egPrev = 0;.  }e
11e90 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
11ea0 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
11eb0 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  nExpr;.    asser
11ec0 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78  t( nOrderBy>=nEx
11ed0 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
11ee0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
11ef0 67 50 72 65 76 20 3d 20 73 71 6c 69 74 65 33 47  gPrev = sqlite3G
11f00 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
11f10 73 65 2c 20 6e 45 78 70 72 2b 31 29 3b 0a 20 20  se, nExpr+1);.  
11f20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11f30 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
11f40 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 0, regPrev);.
11f50 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71      pKeyDup = sq
11f60 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
11f70 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  o(db,.          
11f80 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
11f90 70 4b 65 79 44 75 70 29 20 2b 20 6e 45 78 70 72  pKeyDup) + nExpr
11fa0 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
11fb0 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28  *)+1) );.    if(
11fc0 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20   pKeyDup ){.    
11fd0 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
11fe0 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b  Order = (u8*)&pK
11ff0 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78  eyDup->aColl[nEx
12000 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 44  pr];.      pKeyD
12010 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31  up->nField = (u1
12020 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 70  6)nExpr;.      p
12030 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d 20 45 4e  KeyDup->enc = EN
12040 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72  C(db);.      for
12050 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
12060 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
12070 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
12080 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
12090 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
120a0 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
120b0 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
120c0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
120d0 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
120e0 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
120f0 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
12100 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
12110 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
12120 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
12130 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
12140 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
12150 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
12160 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  pBy(pParse, p, p
12170 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
12180 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69  ER");.  if( pPri
12190 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b  or->pPrior==0 ){
121a0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
121b0 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
121c0 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
121d0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
121e0 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a  , "ORDER");.  }.
121f0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
12200 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
12210 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
12220 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
12230 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64  rse, p, labelEnd
12240 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
12250 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  it && op==TK_ALL
12260 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74   ){.    regLimit
12270 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
12280 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  em;.    regLimit
12290 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
122a0 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
122b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
122c0 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74  Copy, p->iOffset
122d0 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20   ? p->iOffset+1 
122e0 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20  : p->iLimit,.   
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
12310 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73  egLimitA);.    s
12320 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12330 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
12340 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74  LimitA, regLimit
12350 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  B);.  }else{.   
12360 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67   regLimitA = reg
12370 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a  LimitB = 0;.  }.
12380 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
12390 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
123a0 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  t);.  p->pLimit 
123b0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 0;.  sqlite3Ex
123c0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
123d0 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70  pOffset);.  p->p
123e0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72  Offset = 0;..  r
123f0 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72  egAddrA = ++pPar
12400 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45  se->nMem;.  regE
12410 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ofA = ++pParse->
12420 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42  nMem;.  regAddrB
12430 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
12440 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d 20 2b  m;.  regEofB = +
12450 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
12460 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61   regOutA = ++pPa
12470 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
12480 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutB = ++pParse-
12490 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
124a0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
124b0 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75  destA, SRT_Corou
124c0 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b  tine, regAddrA);
124d0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
124e0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c  DestInit(&destB,
124f0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
12500 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a  regAddrB);..  /*
12510 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65 20 76   Jump past the v
12520 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74 69 6e  arious subroutin
12530 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69 6e 65  es and coroutine
12540 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20  s to the main.  
12550 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20  ** merge loop.  
12560 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  */.  j1 = sqlite
12570 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
12580 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64 72 53  P_Goto);.  addrS
12590 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33  electA = sqlite3
125a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
125b0 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  v);...  /* Gener
125c0 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
125d0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
125e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
125f0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66   to the.  ** lef
12600 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  t of the compoun
12610 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65  d operator - the
12620 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a   "A" select..  *
12630 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
12640 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63  ent((v, "Begin c
12650 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
12660 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70  t SELECT"));.  p
12670 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
12680 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 73 71 6c  regLimitA;.  sql
12690 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
126a0 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
126b0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
126c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
126d0 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66  teger, 1, regEof
126e0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
126f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
12700 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  eld, regAddrA);.
12710 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12720 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75  t((v, "End corou
12730 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45  tine for left SE
12740 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47  LECT"));..  /* G
12750 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
12760 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
12770 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
12780 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68  ment on .  ** th
12790 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42  e right - the "B
127a0 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20  " select.  */.  
127b0 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71  addrSelectB = sq
127c0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
127d0 41 64 64 72 28 76 29 3b 0a 20 20 56 64 62 65 4e  Addr(v);.  VdbeN
127e0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
127f0 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20  Begin coroutine 
12800 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43 54  for right SELECT
12810 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69  "));.  savedLimi
12820 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
12830 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70   savedOffset = p
12840 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e  ->iOffset;.  p->
12850 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
12860 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  tB;.  p->iOffset
12870 20 3d 20 30 3b 20 20 0a 20 20 73 71 6c 69 74 65   = 0;  .  sqlite
12880 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
12890 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d  p, &destB);.  p-
128a0 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c  >iLimit = savedL
128b0 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  imit;.  p->iOffs
128c0 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74  et = savedOffset
128d0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
128e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
128f0 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42 29  ger, 1, regEofB)
12900 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12910 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
12920 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
12930 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
12940 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69  (v, "End corouti
12950 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c  ne for right SEL
12960 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65  ECT"));..  /* Ge
12970 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
12980 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
12990 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
129a0 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73   of the A.  ** s
129b0 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
129c0 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
129d0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
129e0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
129f0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
12a00 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
12a10 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72  for A"));.  addr
12a20 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutA = generateO
12a30 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
12a40 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
12a50 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
12a60 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tA, pDest, regOu
12a70 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tA,.            
12a80 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
12a90 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46  eyDup, P4_KEYINF
12aa0 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62 65 6c  O_HANDOFF, label
12ab0 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65  End);.  .  /* Ge
12ac0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
12ad0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
12ae0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
12af0 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73   of the B.  ** s
12b00 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
12b10 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
12b20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
12b30 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ect..  */.  if( 
12b40 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
12b50 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
12b60 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12b70 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
12b80 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a  utine for B"));.
12b90 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67      addrOutB = g
12ba0 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
12bb0 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
12bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bd0 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73   p, &destB, pDes
12be0 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20  t, regOutB,.    
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
12c00 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50  Prev, pKeyDup, P
12c10 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43  4_KEYINFO_STATIC
12c20 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d  , labelEnd);.  }
12c30 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
12c40 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
12c50 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
12c60 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
12c70 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   A.  ** are exha
12c80 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
12c90 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20  ata in select B 
12ca0 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
12cb0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
12cc0 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f  (v, "eof-A subro
12cd0 75 74 69 6e 65 22 29 29 3b 0a 20 20 69 66 28 20  utine"));.  if( 
12ce0 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
12cf0 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
12d00 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
12d10 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  A = sqlite3VdbeA
12d20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
12d30 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  , 0, labelEnd);.
12d40 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 61    }else{  .    a
12d50 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65  ddrEofA = sqlite
12d60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12d70 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 6c  P_If, regEofB, l
12d80 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71  abelEnd);.    sq
12d90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12da0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
12db0 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
12dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12dd0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
12de0 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20  ld, regAddrB);. 
12df0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12e00 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
12e10 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20   0, addrEofA);. 
12e20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
12e30 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
12e40 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
12e50 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
12e60 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct B.  ** are ex
12e70 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
12e80 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
12e90 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  A remains..  */.
12ea0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54    if( op==TK_INT
12eb0 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
12ec0 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66  drEofB = addrEof
12ed0 41 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  A;.  }else{  .  
12ee0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12ef0 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62  t((v, "eof-B sub
12f00 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
12f10 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74  addrEofB = sqlit
12f20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12f30 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
12f40 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73  labelEnd);.    s
12f50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12f60 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
12f70 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29  gOutA, addrOutA)
12f80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12f90 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
12fa0 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  eld, regAddrA);.
12fb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12fc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
12fd0 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  , 0, addrEofB);.
12fe0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
12ff0 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
13000 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c  e the case of A<
13010 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
13020 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
13030 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  lt-B subroutine"
13040 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d  ));.  addrAltB =
13050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13060 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
13070 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
13080 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
13090 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
130a0 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  eld, regAddrA);.
130b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
130c0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
130d0 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29  gEofA, addrEofA)
130e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
130f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
13100 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  , 0, labelCmpr);
13110 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
13120 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
13130 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a  he case of A==B.
13140 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
13150 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64  K_ALL ){.    add
13160 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
13170 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
13180 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
13190 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
131a0 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61   addrAltB;.    a
131b0 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c  ddrAltB++;.  }el
131c0 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  se{.    VdbeNoop
131d0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65  Comment((v, "A-e
131e0 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  q-B subroutine")
131f0 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  );.    addrAeqB 
13200 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  =.    sqlite3Vdb
13210 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
13220 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  eld, regAddrA);.
13230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13240 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
13250 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
13260 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
13270 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13280 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
13290 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  pr);.  }..  /* G
132a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
132b0 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
132c0 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64  of A>B.  */.  Vd
132d0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
132e0 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75  , "A-gt-B subrou
132f0 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
13300 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  gtB = sqlite3Vdb
13310 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
13320 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
13330 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
13340 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
13350 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13360 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
13370 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a   addrOutB);.  }.
13380 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13390 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
133a0 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 73 71   regAddrB);.  sq
133b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
133c0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
133d0 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20  B, addrEofB);.  
133e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
133f0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
13400 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
13410 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e  /* This code run
13420 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61  s once to initia
13430 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e  lize everything.
13440 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
13450 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
13460 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
13470 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
13480 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66  teger, 0, regEof
13490 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
134a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
134b0 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66  teger, 0, regEof
134c0 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
134d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
134e0 73 75 62 2c 20 72 65 67 41 64 64 72 41 2c 20 61  sub, regAddrA, a
134f0 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 73  ddrSelectA);.  s
13500 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13510 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
13520 67 41 64 64 72 42 2c 20 61 64 64 72 53 65 6c 65  gAddrB, addrSele
13530 63 74 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ctB);.  sqlite3V
13540 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13550 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64  If, regEofA, add
13560 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65  rEofA);.  sqlite
13570 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13580 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61  P_If, regEofB, a
13590 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20  ddrEofB);..  /* 
135a0 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61  Implement the ma
135b0 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20  in merge loop.  
135c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
135d0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
135e0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71  labelCmpr);.  sq
135f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13600 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  v, OP_Permutatio
13610 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  n, 0, 0, 0, (cha
13620 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f  r*)aPermute, P4_
13630 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c  INTARRAY);.  sql
13640 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
13650 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65  , OP_Compare, de
13660 73 74 41 2e 69 4d 65 6d 2c 20 64 65 73 74 42 2e  stA.iMem, destB.
13670 69 4d 65 6d 2c 20 6e 4f 72 64 65 72 42 79 2c 0a  iMem, nOrderBy,.
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
136a0 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45  pKeyMerge, P4_KE
136b0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
136c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
136d0 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
136e0 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65  addrAltB, addrAe
136f0 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 0a 0a  qB, addrAgtB);..
13700 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 65 6d    /* Release tem
13710 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
13720 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50  .  */.  if( regP
13730 72 65 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rev ){.    sqlit
13740 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
13750 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 50 72  ge(pParse, regPr
13760 65 76 2c 20 6e 4f 72 64 65 72 42 79 2b 31 29 3b  ev, nOrderBy+1);
13770 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
13780 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e  to the this poin
13790 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65  t in order to te
137a0 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72  rminate the quer
137b0 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
137c0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
137d0 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  l(v, labelEnd);.
137e0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75  .  /* Set the nu
137f0 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63  mber of output c
13800 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
13810 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
13820 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
13830 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
13840 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77   = pPrior;.    w
13850 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
13860 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
13870 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
13880 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
13890 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
138a0 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
138b0 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  t);.  }..  /* Re
138c0 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d  assembly the com
138d0 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74  pound query so t
138e0 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66  hat it will be f
138f0 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  reed correctly. 
13900 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69   ** by the calli
13910 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ng function */. 
13920 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
13930 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
13940 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
13950 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20  >pPrior);.  }.  
13960 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
13970 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a  or;..  /*** TBD:
13980 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74    Insert subrout
13990 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f  ine calls to clo
139a0 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e  se cursors on in
139b0 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20  complete.  **** 
139c0 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f  subqueries ****/
139d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
139e0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
139f0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
13a00 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
13a10 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
13a20 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
13a30 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61  /* Forward Decla
13a40 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
13a50 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
13a60 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45  List(sqlite3*, E
13a70 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45  xprList*, int, E
13a80 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69  xprList*);.stati
13a90 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
13aa0 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c  ct(sqlite3*, Sel
13ab0 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72  ect *, int, Expr
13ac0 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  List *);../*.** 
13ad0 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
13ae0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
13af0 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
13b00 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
13b10 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
13b20 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
13b30 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
13b40 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
13b50 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
13b60 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
13b70 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
13b80 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
13b90 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
13ba0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13bb0 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
13bc0 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
13bd0 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
13be0 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
13bf0 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
13c00 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
13c10 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
13c20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
13c30 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
13c40 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
13c50 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
13c60 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
13c70 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
13c80 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
13c90 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65  routine make the
13ca0 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
13cb0 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
13cc0 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
13cd0 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
13ce0 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
13cf0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
13d00 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
13d10 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
13d20 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
13d30 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
13d40 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
13d50 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f  ,        /* Repo
13d60 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
13d70 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   to this connect
13d80 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ion */.  Expr *p
13d90 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Expr,        /* 
13da0 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75  Expr in which su
13db0 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72  bstitution occur
13dc0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
13dd0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  e,         /* Ta
13de0 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69  ble to be substi
13df0 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  tuted */.  ExprL
13e00 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
13e10 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78 70  * Substitute exp
13e20 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  ressions */.){. 
13e30 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
13e40 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45  return;.  if( pE
13e50 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
13e60 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
13e70 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20  ble==iTable ){. 
13e80 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
13e90 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
13ea0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
13eb0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
13ec0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
13ed0 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
13ee0 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45   pEList!=0 && pE
13ef0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c  xpr->iColumn<pEL
13f00 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
13f10 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
13f20 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
13f30 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
13f40 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
13f50 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d  pEList->a[pExpr-
13f60 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b  >iColumn].pExpr;
13f70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13f80 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  New!=0 );.      
13f90 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77  pExpr->op = pNew
13fa0 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65  ->op;.      asse
13fb0 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
13fc0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
13fd0 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  pr->pLeft = sqli
13fe0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
13ff0 4e 65 77 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  New->pLeft, 0);.
14000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
14010 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
14020 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
14030 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
14040 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65 77 2d  xprDup(db, pNew-
14050 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
14060 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
14070 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b   = pNew->iTable;
14080 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54  .      pExpr->pT
14090 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61 62 3b  ab = pNew->pTab;
140a0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
140b0 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43  olumn = pNew->iC
140c0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78  olumn;.      pEx
140d0 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d  pr->iAgg = pNew-
140e0 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c  >iAgg;.      sql
140f0 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62  ite3TokenCopy(db
14100 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c  , &pExpr->token,
14110 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a   &pNew->token);.
14120 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
14130 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45 78 70  enCopy(db, &pExp
14140 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e  r->span, &pNew->
14150 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  span);.      ass
14160 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ert( pExpr->x.pL
14170 69 73 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  ist==0 && pExpr-
14180 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  >x.pSelect==0 );
14190 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
141a0 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
141b0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
141c0 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
141d0 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  >x.pSelect = sql
141e0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
141f0 2c 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63  , pNew->x.pSelec
14200 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  t, 0);.      }el
14210 73 65 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70  se{.        pExp
14220 72 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c  r->x.pList = sql
14230 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
14240 64 62 2c 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73  db, pNew->x.pLis
14250 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
14260 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67       pExpr->flag
14270 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b  s = pNew->flags;
14280 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41  .      pExpr->pA
14290 67 67 49 6e 66 6f 20 3d 20 70 4e 65 77 2d 3e 70  ggInfo = pNew->p
142a0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 70  AggInfo;.      p
142b0 4e 65 77 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  New->pAggInfo = 
142c0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
142d0 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  {.    substExpr(
142e0 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
142f0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
14300 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
14310 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  (db, pExpr->pRig
14320 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ht, iTable, pELi
14330 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  st);.    if( Exp
14340 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
14350 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
14360 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ) ){.      subst
14370 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72  Select(db, pExpr
14380 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61  ->x.pSelect, iTa
14390 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
143a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
143b0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
143c0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
143d0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
143e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
143f0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
14400 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74  xprList(.  sqlit
14410 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
14420 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
14430 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
14440 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
14450 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74  t,     /* List t
14460 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68  o scan and in wh
14470 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
14480 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74  titutes */.  int
14490 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
144a0 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
144b0 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
144c0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
144d0 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
144e0 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
144f0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
14500 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
14510 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
14520 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
14530 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  ++){.    substEx
14540 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  pr(db, pList->a[
14550 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
14560 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
14570 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
14580 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69  stSelect(.  sqli
14590 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
145a0 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
145b0 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
145c0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
145d0 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
145e0 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77  T statement in w
145f0 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
14600 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20  stitutions */.  
14610 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
14620 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
14630 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a   be replaced */.
14640 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
14650 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
14660 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
14670 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
14680 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  c;.  struct SrcL
14690 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
146a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
146b0 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
146c0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
146d0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62   p->pEList, iTab
146e0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
146f0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
14700 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54   p->pGroupBy, iT
14710 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
14720 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
14730 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
14740 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
14750 0a 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c  .  substExpr(db,
14760 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61   p->pHaving, iTa
14770 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
14780 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
14790 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c  >pWhere, iTable,
147a0 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
147b0 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70  tSelect(db, p->p
147c0 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70  Prior, iTable, p
147d0 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d  EList);.  pSrc =
147e0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
147f0 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a 20  rt( pSrc );  /* 
14800 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43 54  Even for (SELECT
14810 20 31 29 20 77 65 20 68 61 76 65 3a 20 70 53 72   1) we have: pSr
14820 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e 6e  c!=0 but pSrc->n
14830 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20  Src==0 */.  if( 
14840 41 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b 0a  ALWAYS(pSrc) ){.
14850 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e      for(i=pSrc->
14860 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63  nSrc, pItem=pSrc
14870 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
14880 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
14890 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
148a0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Item->pSelect, i
148b0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
148c0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
148d0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
148e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
148f0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
14900 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
14910 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  W) */..#if !defi
14920 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14930 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
14940 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14950 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68  T_VIEW)./*.** Th
14960 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
14970 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73  pts to flatten s
14980 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64  ubqueries in ord
14990 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65  er to speed.** e
149a0 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65  xecution.  It re
149b0 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61  turns 1 if it ma
149c0 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20  kes changes and 
149d0 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69  0 if no flatteni
149e0 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a  ng.** occurs..**
149f0 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
14a00 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
14a10 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
14a20 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
14a30 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
14a40 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
14a50 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
14a60 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
14a70 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
14a80 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
14a90 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
14aa0 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
14ab0 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
14ac0 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
14ad0 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
14ae0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
14af0 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
14b00 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
14b10 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
14b20 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
14b30 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
14b40 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
14b50 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
14b60 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
14b70 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
14b80 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
14b90 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
14ba0 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
14bb0 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
14bc0 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
14bd0 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
14be0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14bf0 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
14c00 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
14c10 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
14c20 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
14c30 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
14c40 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
14c50 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
14c60 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
14c70 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
14c80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
14c90 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
14ca0 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e  is simpification
14cb0 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20   gives the same 
14cc0 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e  result.** but on
14cd0 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74  ly has to scan t
14ce0 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41  he data once.  A
14cf0 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63  nd because indic
14d00 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69  es might .** exi
14d10 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  st on the table 
14d20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73  t1, a complete s
14d30 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20  can of the data 
14d40 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69  might be.** avoi
14d50 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74  ded..**.** Flatt
14d60 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74  ening is only at
14d70 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f  tempted if all o
14d80 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
14d90 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
14da0 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75    (1)  The subqu
14db0 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
14dc0 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
14dd0 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74  oth use aggregat
14de0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  es..**.**   (2) 
14df0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
14e00 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
14e10 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  e or the outer q
14e20 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
14e30 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20  in..**.**   (3) 
14e40 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
14e50 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   not the right o
14e60 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
14e70 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20   outer join.**  
14e80 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c        (Originall
14e90 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20 20  y ticket #306.  
14ea0 53 74 72 65 6e 67 68 74 65 6e 65 64 20 62 79 20  Strenghtened by 
14eb0 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a  ticket #3300).**
14ec0 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
14ed0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
14ee0 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
14ef0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
14f00 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
14f10 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75    (5)  The subqu
14f20 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
14f30 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  NCT or the outer
14f40 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
14f50 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
14f60 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
14f70 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
14f80 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
14f90 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
14fa0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
14fb0 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
14fc0 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
14fd0 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
14fe0 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
14ff0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  lause..**.**   (
15000 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
15010 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
15020 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
15030 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
15040 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
15050 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
15060 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
15070 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
15080 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
15090 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
150a0 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
150b0 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
150c0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
150d0 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
150e0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
150f0 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
15100 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
15110 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
15120 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
15130 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
15140 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
15150 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
15160 2a 2a 20 20 28 31 32 29 20 20 4e 6f 74 20 69 6d  **  (12)  Not im
15170 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73  plemented.  Subs
15180 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69  umed into restri
15190 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20  ction (3).  Was 
151a0 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20  previously.**   
151b0 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20       a separate 
151c0 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69  restriction deri
151d0 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74  ving from ticket
151e0 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31   #350..**.**  (1
151f0 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
15200 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79   and outer query
15210 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
15220 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31   LIMIT.**.**  (1
15230 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
15240 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46   does not use OF
15250 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29  FSET.**.**  (15)
15260 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
15270 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  y is not part of
15280 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
15290 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20  ct or the.**    
152a0 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65      subquery doe
152b0 73 20 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20  s not have both 
152c0 61 6e 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  an ORDER BY and 
152d0 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a  a LIMIT clause..
152e0 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74  **        (See t
152f0 69 63 6b 65 74 20 23 32 33 33 39 29 0a 2a 2a 0a  icket #2339).**.
15300 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f 75  **  (16)  The ou
15310 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
15320 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
15330 20 74 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   the subquery do
15340 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74  es.**        not
15350 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42   contain ORDER B
15360 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34  Y.  (Ticket #294
15370 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f  2)  This used to
15380 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20   not matter.**  
15390 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69        until we i
153a0 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72  ntroduced the gr
153b0 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e  oup_concat() fun
153c0 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20  ction.  .**.**  
153d0 28 31 37 29 20 20 54 68 65 20 73 75 62 2d 71 75  (17)  The sub-qu
153e0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d  ery is not a com
153f0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72  pound select, or
15400 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41   it is a UNION A
15410 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  LL .**        co
15420 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61  mpound clause ma
15430 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f  de up entirely o
15440 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  f non-aggregate 
15450 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a  queries, and .**
15460 20 20 20 20 20 20 20 20 74 68 65 20 70 61 72 65          the pare
15470 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  nt query:.**.** 
15480 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f           * is no
15490 74 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66  t itself part of
154a0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
154b0 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ct,.**          
154c0 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  * is not an aggr
154d0 65 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43  egate or DISTINC
154e0 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20  T query, and.** 
154f0 20 20 20 20 20 20 20 20 20 2a 20 68 61 73 20 6e           * has n
15500 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 6f  o other tables o
15510 72 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e  r sub-selects in
15520 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
15530 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54  ..**.**        T
15540 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75  he parent and su
15550 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74  b-query may cont
15560 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65  ain WHERE clause
15570 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a  s. Subject to.**
15580 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31          rules (1
15590 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34  1), (13) and (14
155a0 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f  ), they may also
155b0 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42   contain ORDER B
155c0 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d  Y,.**        LIM
155d0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
155e0 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  auses..**.**  (1
155f0 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  8)  If the sub-q
15600 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
15610 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
15620 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
15630 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52  .**        ORDER
15640 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68   by clause of th
15650 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65  e parent must be
15660 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63   simple referenc
15670 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20  es to .**       
15680 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
15690 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  sub-query..**.**
156a0 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71    (19)  The subq
156b0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
156c0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
156d0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
156e0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61  not.**        ha
156f0 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ve a WHERE claus
15700 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20  e..**.**  (20)  
15710 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
15720 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
15730 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d  elect, then it m
15740 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  ust not use.**  
15750 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42        an ORDER B
15760 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65  Y clause.  Ticke
15770 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75  t #3773.  We cou
15780 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f  ld relax this co
15790 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20  nstraint.**     
157a0 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73     somewhat by s
157b0 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74  aying that the t
157c0 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
157d0 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74  R BY clause must
157e0 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61  .**        appea
157f0 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20  r as unmodified 
15800 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69  result columns i
15810 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
15820 79 2e 20 20 42 75 74 0a 2a 2a 20 20 20 20 20 20  y.  But.**      
15830 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74    have other opt
15840 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69  imizations in mi
15850 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  nd to deal with 
15860 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  that case..**.**
15870 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
15880 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
15890 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
158a0 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
158b0 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
158c0 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
158d0 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
158e0 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
158f0 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
15900 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20  uses aggregates 
15910 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67  and subqueryIsAg
15920 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
15930 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
15940 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
15950 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
15960 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
15970 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
15980 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
15990 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
159a0 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
159b0 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
159c0 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
159d0 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
159e0 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
159f0 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
15a00 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
15a10 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
15a20 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
15a30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
15a40 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
15a50 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
15a60 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
15a70 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
15a80 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
15a90 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
15aa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
15ab0 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
15ac0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
15ad0 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
15ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
15af0 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
15b00 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
15b10 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
15b20 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
15b30 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
15b40 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
15b50 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
15b60 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
15b70 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
15b80 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
15b90 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
15ba0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
15bb0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
15bc0 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
15bd0 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
15be0 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65  uthContext;.  Se
15bf0 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20  lect *pParent;. 
15c00 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
15c10 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
15c20 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
15c30 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63  uery" */.  Selec
15c40 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f  t *pSub1;      /
15c50 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
15c60 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63   rightmost selec
15c70 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a  t in sub-query *
15c80 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
15c90 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
15ca0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
15cb0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
15cc0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62  .  SrcList *pSub
15cd0 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52  Src;   /* The FR
15ce0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
15cf0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45   subquery */.  E
15d00 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20  xprList *pList; 
15d10 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
15d20 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65   set of the oute
15d30 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
15d40 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20   iParent;       
15d50 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
15d60 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53  number of the pS
15d70 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65  ub result set te
15d80 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  mp table */.  in
15d90 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
15da0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
15db0 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  r */.  Expr *pWh
15dc0 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ere;            
15dd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
15de0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
15df0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
15e00 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20  item *pSubitem; 
15e10 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
15e20 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
15e30 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
15e40 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
15e50 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e  see if flattenin
15e60 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
15e70 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
15e80 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
15e90 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
15ea0 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
15eb0 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f  );  /* Unable to
15ec0 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e   flatten compoun
15ed0 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 70  d queries */.  p
15ee0 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
15ef0 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
15f00 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
15f10 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
15f20 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70  .  pSubitem = &p
15f30 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20  Src->a[iFrom];. 
15f40 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69   iParent = pSubi
15f50 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
15f60 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d  pSub = pSubitem-
15f70 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  >pSelect;.  asse
15f80 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20  rt( pSub!=0 );. 
15f90 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75   if( isAgg && su
15fa0 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
15fb0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
15fc0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
15fd0 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20  iction (1)  */. 
15fe0 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
15ff0 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63  gg && pSrc->nSrc
16000 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  >1 ) return 0;  
16010 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
16020 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20  iction (2)  */. 
16030 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d   pSubSrc = pSub-
16040 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
16050 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a   pSubSrc );.  /*
16060 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f   Prior to versio
16070 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49  n 3.1.2, when LI
16080 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68  MIT and OFFSET h
16090 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20  ad to be simple 
160a0 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20  constants,.  ** 
160b0 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78  not arbitrary ex
160c0 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61  presssions, we a
160d0 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62  llowed some comb
160e0 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61  ining of LIMIT a
160f0 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
16100 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c  ecause they coul
16110 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74  d be computed at
16120 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20   compile-time.  
16130 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  But when LIMIT a
16140 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
16150 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20  ecame arbitrary 
16160 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
16170 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61  were forced to a
16180 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  dd restrictions 
16190 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31  (13).  ** and (1
161a0 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  4). */.  if( pSu
161b0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
161c0 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
161d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
161e0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
161f0 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  13) */.  if( pSu
16200 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74  b->pOffset ) ret
16210 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
16220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16230 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
16240 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  14) */.  if( p->
16250 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70 53  pRightmost && pS
16260 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53  ub->pLimit && pS
16270 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
16280 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
162c0 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a  riction (15) */.
162d0 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72    }.  if( pSubSr
162e0 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
162f0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16310 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20  Restriction (7) 
16320 20 2a 2f 0a 20 20 69 66 28 20 28 28 70 53 75 62   */.  if( ((pSub
16330 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
16340 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20  Distinct)!=0 || 
16350 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20  pSub->pLimit) . 
16360 20 20 20 20 20 20 20 20 26 26 20 28 70 53 72 63          && (pSrc
16370 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
16380 67 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  g) ){          /
16390 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * Restrictions (
163a0 34 29 28 35 29 28 38 29 28 39 29 20 2a 2f 0a 20  4)(5)(8)(9) */. 
163b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
163c0 20 20 20 20 0a 20 20 7d 0a 20 20 69 66 28 20 28      .  }.  if( (
163d0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
163e0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26  _Distinct)!=0 &&
163f0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
16400 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
16410 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
16420 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a  riction (6)  */.
16430 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
16440 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70  derBy && pSub->p
16450 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
16460 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16490 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
164a0 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (11) */.  }. 
164b0 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53   if( isAgg && pS
164c0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72  ub->pOrderBy ) r
164d0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
164e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
164f0 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20  iction (16) */. 
16500 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
16510 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29  t && p->pWhere )
16520 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
16530 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
16540 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 0a  iction (19) */..
16550 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f    /* OBSOLETE CO
16560 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65  MMENT 1:.  ** Re
16570 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66  striction 3:  If
16580 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
16590 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75   a join, make su
165a0 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
165b0 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65  is .  ** not use
165c0 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f  d as the right o
165d0 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74  perand of an out
165e0 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c  er join.  Exampl
165f0 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  es of why this. 
16600 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77   ** is not allow
16610 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
16620 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
16630 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49  TER JOIN (t2 JOI
16640 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N t3).  **.  ** 
16650 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
16660 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
16670 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
16680 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
16690 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
166a0 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a  JOIN t3.  **.  *
166b0 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  * which is not a
166c0 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74  t all the same t
166d0 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  hing..  **.  ** 
166e0 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
166f0 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63   2:.  ** Restric
16700 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65  tion 12:  If the
16710 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
16720 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
16730 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20  f a left outer. 
16740 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73   ** join, make s
16750 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
16760 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
16770 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78  ause..  ** An ex
16780 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
16790 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  is is not allowe
167a0 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
167b0 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
167c0 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  ER JOIN (SELECT 
167d0 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  * FROM t2 WHERE 
167e0 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a  t2.x>0).  **.  *
167f0 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
16800 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
16810 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
16820 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
16830 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
16840 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20  ) WHERE t2.x>0. 
16850 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65   **.  ** But the
16860 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c   t2.x>0 test wil
16870 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e  l always fail on
16880 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74   a NULL row of t
16890 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66  2, which.  ** ef
168a0 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72  fectively conver
168b0 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49  ts the OUTER JOI
168c0 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20  N into an INNER 
168d0 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  JOIN..  **.  ** 
168e0 54 48 49 53 20 4f 56 45 52 52 49 44 45 53 20 4f  THIS OVERRIDES O
168f0 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53  BSOLETE COMMENTS
16900 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a   1 AND 2 ABOVE:.
16910 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33 30    ** Ticket #330
16920 30 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c 61  0 shows that fla
16930 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67 68  ttening the righ
16940 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
16950 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72   JOIN.  ** is fr
16960 61 75 67 68 74 20 77 69 74 68 20 64 61 6e 67 65  aught with dange
16970 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f 69  r.  Best to avoi
16980 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e  d the whole thin
16990 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  g.  If the.  ** 
169a0 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
169b0 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
169c0 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
169d0 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a  do not flatten..
169e0 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
169f0 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  item->jointype &
16a00 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b   JT_OUTER)!=0 ){
16a10 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
16a20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63   }..  /* Restric
16a30 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20  tion 17: If the 
16a40 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
16a50 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20  ompound SELECT, 
16a60 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a  then it must.  *
16a70 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55  * use only the U
16a80 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
16a90 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  r. And none of t
16aa0 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  he simple select
16ab0 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68   queries.  ** th
16ac0 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
16ad0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61  ompound SELECT a
16ae0 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  re allowed to be
16af0 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69   aggregate or di
16b00 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72  stinct.  ** quer
16b10 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ies..  */.  if( 
16b20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
16b30 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
16b40 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
16b50 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65  return 0;  /* Re
16b60 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a  striction 20 */.
16b70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
16b80 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c  Agg || (p->selFl
16b90 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
16ba0 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e  t)!=0 || pSrc->n
16bb0 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  Src!=1 ){.      
16bc0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
16bd0 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53      for(pSub1=pS
16be0 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31  ub; pSub1; pSub1
16bf0 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b  =pSub1->pPrior){
16c00 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62  .      if( (pSub
16c10 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
16c20 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
16c30 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20  gregate))!=0.   
16c40 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70      || (pSub1->p
16c50 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e  Prior && pSub1->
16c60 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20  op!=TK_ALL) .   
16c70 20 20 20 20 7c 7c 20 21 70 53 75 62 31 2d 3e 70      || !pSub1->p
16c80 53 72 63 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53  Src || pSub1->pS
16c90 72 63 2d 3e 6e 53 72 63 21 3d 31 0a 20 20 20 20  rc->nSrc!=1.    
16ca0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
16cb0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
16cc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
16cd0 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a  triction 18. */.
16ce0 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
16cf0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  rBy ){.      int
16d00 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
16d10 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65  i=0; ii<p->pOrde
16d20 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  rBy->nExpr; ii++
16d30 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
16d40 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69  ->pOrderBy->a[ii
16d50 5d 2e 69 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  ].iCol==0 ) retu
16d60 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
16d70 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a    }.  }..  /****
16d80 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
16d90 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65  is point, flatte
16da0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
16db0 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20  d. *****/..  /* 
16dc0 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75  Authorize the su
16dd0 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72  bquery */.  pPar
16de0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
16df0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61   = pSubitem->zNa
16e00 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 41 75 74  me;.  sqlite3Aut
16e10 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
16e20 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
16e30 20 30 2c 20 30 29 3b 0a 20 20 70 50 61 72 73 65   0, 0);.  pParse
16e40 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
16e50 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
16e60 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  xt;..  /* If the
16e70 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
16e80 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
16e90 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
16ea0 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73  (by restrictions
16eb0 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20  .  ** 17 and 18 
16ec0 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62  above) it must b
16ed0 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e  e a UNION ALL an
16ee0 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  d the parent que
16ef0 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65  ry must .  ** be
16f00 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
16f10 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
16f20 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46  CT <expr-list> F
16f30 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e  ROM (<sub-query>
16f40 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e  ) <where-clause>
16f50 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c   .  **.  ** foll
16f60 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45  owed by any ORDE
16f70 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f  R BY, LIMIT and/
16f80 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  or OFFSET clause
16f90 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20  s. This block.  
16fa0 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63  ** creates N-1 c
16fb0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
16fc0 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75  ent query withou
16fd0 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  t any ORDER BY, 
16fe0 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f  LIMIT or .  ** O
16ff0 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e  FFSET clauses an
17000 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20  d joins them to 
17010 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69  the left-hand-si
17020 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  de of the origin
17030 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e  al.  ** using UN
17040 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
17050 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
17060 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
17070 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73  of simple.  ** s
17080 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
17090 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   in the compound
170a0 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a   sub-query..  **
170b0 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20  .  ** Example:. 
170c0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
170d0 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20  ECT a+1 FROM (. 
170e0 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
170f0 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a  T x FROM tab.  *
17100 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41  *        UNION A
17110 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53  LL.  **        S
17120 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62  ELECT y FROM tab
17130 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
17140 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
17150 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
17160 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a  2) FROM tab2.  *
17170 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21  *     ) WHERE a!
17180 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20  =5 ORDER BY 1.  
17190 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72  **.  ** Transfor
171a0 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20  med into:.  **. 
171b0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
171c0 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
171d0 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E x+1!=5.  **   
171e0 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
171f0 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20       SELECT y+1 
17200 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79  FROM tab WHERE y
17210 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
17220 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
17230 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
17240 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48  )+1 FROM tab2 WH
17250 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d  ERE abs(z*2)+1!=
17260 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52  5.  **     ORDER
17270 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
17280 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65  We call this the
17290 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75   "compound-subqu
172a0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e  ery flattening".
172b0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62  .  */.  for(pSub
172c0 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70  =pSub->pPrior; p
172d0 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e  Sub; pSub=pSub->
172e0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c  pPrior){.    Sel
172f0 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45  ect *pNew;.    E
17300 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
17310 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
17320 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  .    Expr *pLimi
17330 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
17340 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f     Select *pPrio
17350 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
17360 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
17370 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20   0;.    p->pSrc 
17380 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  = 0;.    p->pPri
17390 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  or = 0;.    p->p
173a0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70  Limit = 0;.    p
173b0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  New = sqlite3Sel
173c0 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29  ectDup(db, p, 0)
173d0 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
173e0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d  = pLimit;.    p-
173f0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
17400 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72  erBy;.    p->pSr
17410 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d  c = pSrc;.    p-
17420 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20  >op = TK_ALL;.  
17430 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20    p->pRightmost 
17440 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  = 0;.    if( pNe
17450 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e  w==0 ){.      pN
17460 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  ew = pPrior;.   
17470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
17480 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
17490 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ior;.      pNew-
174a0 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b  >pRightmost = 0;
174b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50  .    }.    p->pP
174c0 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  rior = pNew;.   
174d0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
174e0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
174f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
17500 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  n flattening the
17510 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
17520 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
17530 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  se .  ** in the 
17540 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
17550 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31  /.  pSub = pSub1
17560 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
17570 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  lect;..  /* Dele
17580 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  te the transient
17590 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
175a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
175b0 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
175c0 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
175d0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
175e0 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
175f0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
17600 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
17610 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
17620 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
17630 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
17640 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
17650 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  base = 0;.  pSub
17660 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  item->zName = 0;
17670 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  .  pSubitem->zAl
17680 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ias = 0;.  pSubi
17690 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30  tem->pSelect = 0
176a0 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65  ;..  /* Defer de
176b0 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65  leting the Table
176c0 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
176d0 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
176e0 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20   subquery until 
176f0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
17700 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65  is.  ** complete
17710 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61  , since there ma
17720 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78  y still exist Ex
17730 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20  pr.pTab entries 
17740 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20  that.  ** refer 
17750 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
17760 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74  even after flatt
17770 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23  ening.  Ticket #
17780 33 33 34 36 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  3346..  */.  if(
17790 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21   pSubitem->pTab!
177a0 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
177b0 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75  *pTabToDel = pSu
177c0 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bitem->pTab;.   
177d0 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e   if( pTabToDel->
177e0 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nRef==1 ){.     
177f0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
17800 74 5a 6f 6d 62 69 65 20 3d 20 70 50 61 72 73 65  tZombie = pParse
17810 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20  ->pZombieTab;.  
17820 20 20 20 20 70 50 61 72 73 65 2d 3e 70 5a 6f 6d      pParse->pZom
17830 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44  bieTab = pTabToD
17840 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  el;.    }else{. 
17850 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
17860 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nRef--;.    }.  
17870 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62    pSubitem->pTab
17880 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
17890 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  The following lo
178a0 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
178b0 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20   each term in a 
178c0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
178d0 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e  y.  ** flattenin
178e0 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20  g (as described 
178f0 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61  above).  If we a
17900 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65  re doing a diffe
17910 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f  rent kind.  ** o
17920 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61  f flattening - a
17930 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65   flattening othe
17940 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e  r than a compoun
17950 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
17960 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65  ening -.  ** the
17970 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79  n this loop only
17980 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a   runs once..  **
17990 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
179a0 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65  moves all of the
179b0 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
179c0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
179d0 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
179e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
179f0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
17a00 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
17a10 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
17a20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
17a30 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
17a40 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
17a50 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
17a60 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
17a70 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
17a80 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
17a90 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
17aa0 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
17ab0 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
17ac0 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
17ad0 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
17ae0 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
17af0 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
17b00 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
17b10 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
17b20 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
17b30 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
17b40 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
17b50 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
17b60 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d  /.  for(pParent=
17b70 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72  p; pParent; pPar
17b80 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72  ent=pParent->pPr
17b90 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e  ior, pSub=pSub->
17ba0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74  pPrior){.    int
17bb0 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38   nSubSrc;.    u8
17bc0 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
17bd0 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75     pSubSrc = pSu
17be0 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  b->pSrc;     /* 
17bf0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73  FROM clause of s
17c00 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e  ubquery */.    n
17c10 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
17c20 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62  ->nSrc;  /* Numb
17c30 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73  er of terms in s
17c40 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61  ubquery FROM cla
17c50 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20  use */.    pSrc 
17c60 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b  = pParent->pSrc;
17c70 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
17c80 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
17c90 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69   query */..    i
17ca0 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20  f( pSrc ){.     
17cb0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
17cc0 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74  ==p );  /* First
17cd0 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68   time through th
17ce0 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
17cf0 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69  jointype = pSubi
17d00 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
17d10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17d20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
17d30 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e  =p );  /* 2nd an
17d40 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d  d subsequent tim
17d50 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  es through the l
17d60 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72  oop */.      pSr
17d70 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  c = pParent->pSr
17d80 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
17d90 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20  stAppend(db, 0, 
17da0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
17db0 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   pSrc==0 ){.    
17dc0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
17dd0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
17de0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17df0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
17e00 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
17e10 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20  y uses a single 
17e20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  slot of the FROM
17e30 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
17e40 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72  uter.    ** quer
17e50 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75  y.  If the subqu
17e60 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61  ery has more tha
17e70 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e  n one element in
17e80 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
17e90 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78  ,.    ** then ex
17ea0 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71  pand the outer q
17eb0 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61  uery to make spa
17ec0 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c  ce for it to hol
17ed0 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20  d all elements. 
17ee0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62     ** of the sub
17ef0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  query..    **.  
17f00 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
17f10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53    **.    **    S
17f20 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
17f30 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  A, (SELECT * FRO
17f40 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74  M sub1, sub2), t
17f50 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  abB;.    **.    
17f60 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  ** The outer que
17f70 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69  ry has 3 slots i
17f80 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
17f90 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20  e.  One slot of 
17fa0 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
17fb0 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64   query (the midd
17fc0 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64  le slot) is used
17fd0 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79   by the subquery
17fe0 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  .  The next.    
17ff0 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ** block of code
18000 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65   will expand the
18010 20 6f 75 74 20 71 75 65 72 79 20 74 6f 20 34 20   out query to 4 
18020 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69 64 64  slots.  The midd
18030 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69  le.    ** slot i
18040 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77  s expanded to tw
18050 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72  o slots in order
18060 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
18070 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 77  or the.    ** tw
18080 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
18090 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
180a0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
180b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53     */.    if( nS
180c0 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
180d0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
180e0 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
180f0 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
18100 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d  , pSrc, nSubSrc-
18110 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20  1,iFrom+1);.    
18120 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
18130 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
18140 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
18150 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
18160 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d  ransfer the FROM
18170 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72   clause terms fr
18180 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20  om the subquery 
18190 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
181a0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
181b0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
181c0 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
181d0 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  {.      pSrc->a[
181e0 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53  i+iFrom] = pSubS
181f0 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
18200 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
18210 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
18220 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
18230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
18240 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74  ->a[iFrom].joint
18250 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
18260 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65    .    /* Now be
18270 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
18280 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
18290 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
182a0 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66   for .    ** ref
182b0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
182c0 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
182d0 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
182e0 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  * .    ** Exampl
182f0 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
18300 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
18310 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
18320 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
18330 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
18340 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20  ERE a>b;.    ** 
18350 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
18360 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
18370 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
18380 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
18390 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20       /.    **   
183a0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
183b0 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
183c0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
183d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
183e0 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  __/.    **.    *
183f0 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
18400 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
18410 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
18420 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
18430 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22   we see.    ** "
18440 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
18450 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
18460 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
18470 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
18480 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20  "y+10"..    */. 
18490 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65     pList = pPare
184a0 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  nt->pEList;.    
184b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
184c0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
184d0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
184e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
184f0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
18500 20 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69   && (pExpr = pLi
18510 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d  st->a[i].pExpr)-
18520 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20  >span.z!=0 ){.  
18530 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
18540 5d 2e 7a 4e 61 6d 65 20 3d 20 0a 20 20 20 20 20  ].zName = .     
18550 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18560 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
18570 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 73 70 61  char*)pExpr->spa
18580 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e  n.z, pExpr->span
18590 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  .n);.      }.   
185a0 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72   }.    substExpr
185b0 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
185c0 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
185d0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
185e0 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  ;.    if( isAgg 
185f0 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
18600 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
18610 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  nt->pGroupBy, iP
18620 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
18630 69 73 74 29 3b 0a 20 20 20 20 20 20 73 75 62 73  ist);.      subs
18640 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
18650 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  t->pHaving, iPar
18660 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
18670 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
18680 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
18690 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
186a0 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  ( pParent->pOrde
186b0 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
186c0 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
186d0 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  y = pSub->pOrder
186e0 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
186f0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
18700 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72    }else if( pPar
18710 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ent->pOrderBy ){
18720 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
18730 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
18740 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
18750 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
18760 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
18770 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29  ( pSub->pWhere )
18780 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d  {.      pWhere =
18790 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
187a0 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65  db, pSub->pWhere
187b0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
187c0 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
187d0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
187e0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
187f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18800 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
18810 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
18820 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
18830 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b  pParent->pWhere;
18840 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
18850 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
18860 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
18870 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
18880 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
18890 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
188a0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
188b0 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
188c0 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65  xprAnd(db, pPare
188d0 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20  nt->pHaving, .  
188e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18900 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
18910 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  b, pSub->pHaving
18920 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73  , 0));.      ass
18930 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47  ert( pParent->pG
18940 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
18950 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f     pParent->pGro
18960 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
18970 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53  prListDup(db, pS
18980 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29  ub->pGroupBy, 0)
18990 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
189a0 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
189b0 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
189c0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
189d0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
189e0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
189f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
18a00 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
18a10 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  here, pWhere);. 
18a20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54     }.  .    /* T
18a30 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
18a40 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
18a50 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
18a60 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  er or the.    **
18a70 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
18a80 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a  distinct. .    *
18a90 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73  /.    pParent->s
18aa0 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d  elFlags |= pSub-
18ab0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
18ac0 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20  istinct;.  .    
18ad0 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  /*.    ** SELECT
18ae0 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43   ... FROM (SELEC
18af0 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46  T ... LIMIT a OF
18b00 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20  FSET b) LIMIT x 
18b10 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a  OFFSET y;.    **
18b20 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74  .    ** One is t
18b30 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f  empted to try to
18b40 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20   add a and b to 
18b50 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69  combine the limi
18b60 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20  ts.  But this.  
18b70 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f    ** does not wo
18b80 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d  rk if either lim
18b90 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
18ba0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
18bb0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
18bc0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c       pParent->pL
18bd0 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
18be0 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  mit;.      pSub-
18bf0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
18c00 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
18c10 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
18c20 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
18c30 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
18c40 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
18c50 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
18c60 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
18c70 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20 72 65  b, pSub1);..  re
18c80 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
18c90 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
18ca0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
18cb0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
18cc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
18cd0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79   */../*.** Analy
18ce0 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  ze the SELECT st
18cf0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
18d00 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
18d10 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73   see if it.** is
18d20 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28   a min() or max(
18d30 29 20 71 75 65 72 79 2e 20 52 65 74 75 72 6e 20  ) query. Return 
18d40 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
18d50 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
18d60 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20 69 74  BY_MAX if .** it
18d70 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77   is, or 0 otherw
18d80 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e 74 2c  ise. At present,
18d90 20 61 20 71 75 65 72 79 20 69 73 20 63 6f 6e 73   a query is cons
18da0 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a 2a 20  idered to be.** 
18db0 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 71 75  a min()/max() qu
18dc0 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery if:.**.**   
18dd0 31 2e 20 54 68 65 72 65 20 69 73 20 61 20 73 69  1. There is a si
18de0 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e 20 74  ngle object in t
18df0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
18e00 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65 72 65  **.**   2. There
18e10 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65 78 70   is a single exp
18e20 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72  ression in the r
18e30 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 69  esult set, and i
18e40 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65 69 74  t is.**      eit
18e50 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20 6d 61  her min(x) or ma
18e60 78 28 78 29 2c 20 77 68 65 72 65 20 78 20 69 73  x(x), where x is
18e70 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65   a column refere
18e80 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  nce..*/.static u
18e90 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 53 65  8 minMaxQuery(Se
18ea0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78 70 72  lect *p){.  Expr
18eb0 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72 4c   *pExpr;.  ExprL
18ec0 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d  ist *pEList = p-
18ed0 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  >pEList;..  if( 
18ee0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
18ef0 20 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f   ) return WHERE_
18f00 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
18f10 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74    pExpr = pEList
18f20 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
18f30 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
18f40 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
18f50 73 53 65 6c 65 63 74 29 20 29 20 72 65 74 75 72  sSelect) ) retur
18f60 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  n 0;.  pEList = 
18f70 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
18f80 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
18f90 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
18fa0 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c   || pEList==0 ||
18fb0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
18fc0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
18fd0 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  if( pEList->a[0]
18fe0 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41  .pExpr->op!=TK_A
18ff0 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  GG_COLUMN ) retu
19000 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
19010 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66 28 20 70  _NORMAL;.  if( p
19020 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33  Expr->token.n!=3
19030 20 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f   ) return WHERE_
19040 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
19050 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
19060 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78  NICmp((char*)pEx
19070 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e  pr->token.z,"min
19080 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ",3)==0 ){.    r
19090 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
190a0 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73 65  RBY_MIN;.  }else
190b0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
190c0 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78 70  ICmp((char*)pExp
190d0 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22  r->token.z,"max"
190e0 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ,3)==0 ){.    re
190f0 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
19100 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72 65  BY_MAX;.  }.  re
19110 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
19120 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a  BY_NORMAL;.}../*
19130 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
19140 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
19150 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
19160 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72  ument is an aggr
19170 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20  egate query..** 
19180 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65  The second argme
19190 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
191a0 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
191b0 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
191c0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
191d0 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
191e0 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
191f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
19200 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
19210 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
19220 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
19230 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
19240 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
19250 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
19260 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
19270 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
19280 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
19290 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
192a0 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
192b0 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
192c0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
192d0 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
192e0 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
192f0 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
19300 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
19310 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
19320 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
19330 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
19340 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
19350 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
19360 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
19370 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
19380 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
19390 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
193a0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
193b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
193c0 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
193d0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
193e0 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
193f0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
19400 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
19410 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
19420 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
19430 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
19440 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
19450 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
19460 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
19470 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
19480 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f  .  if( (pAggInfo
19490 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63  ->aFunc[0].pFunc
194a0 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ->flags&SQLITE_F
194b0 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
194c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
194d0 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
194e0 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
194f0 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
19500 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
19510 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
19520 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
19530 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
19540 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
19550 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
19560 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
19570 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
19580 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
19590 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
195a0 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
195b0 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
195c0 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
195d0 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
195e0 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
195f0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
19600 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
19610 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
19620 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
19630 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
19640 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
19650 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
19660 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
19670 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
19680 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
19690 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
196a0 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65   && pFrom->zInde
196b0 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  x ){.    Table *
196c0 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
196d0 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  ab;.    char *zI
196e0 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49  ndex = pFrom->zI
196f0 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20  ndex;.    Index 
19700 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
19710 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
19720 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  ; .        pIdx 
19730 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
19740 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pIdx->zName, z
19750 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20  Index); .       
19760 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
19770 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
19780 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20   !pIdx ){.      
19790 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
197a0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
197b0 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e   index: %s", zIn
197c0 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  dex, 0);.      r
197d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
197e0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  OR;.    }.    pF
197f0 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  rom->pIndex = pI
19800 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
19810 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
19820 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19830 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61  e is a Walker ca
19840 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61  llback for "expa
19850 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20  nding" a SELECT 
19860 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45  statement..** "E
19870 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20  xpanding" means 
19880 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  to do the follow
19890 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ing:.**.**    (1
198a0 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42  )  Make sure VDB
198b0 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
198c0 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
198d0 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20  ned to every.** 
198e0 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20          element 
198f0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
19900 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
19910 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54    Fill in the pT
19920 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62  abList->a[].pTab
19930 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53   fields in the S
19940 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  rcList that .** 
19950 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
19960 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68  FROM clause.  Wh
19970 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20  en views appear 
19980 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
19990 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  se,.**         f
199a0 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
199b0 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
199c0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
199d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
199e0 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
199f0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
19a00 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
19a10 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
19a20 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
19a30 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
19a40 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
19a50 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
19a60 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
19a70 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
19a80 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
19a90 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
19aa0 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72  the presistent r
19ab0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
19ac0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
19ad0 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
19ae0 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  3)  Add terms to
19af0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
19b00 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20  e to accomodate 
19b10 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
19b20 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ord.**         o
19b30 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20  n joins and the 
19b40 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
19b50 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a  use of joins..**
19b60 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e  .**    (4)  Scan
19b70 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c   the list of col
19b80 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
19b90 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20  lt set (pEList) 
19ba0 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  looking.**      
19bb0 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73     for instances
19bc0 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72   of the "*" oper
19bd0 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c  ator or the TABL
19be0 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  E.* operator..**
19bf0 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e           If foun
19c00 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22  d, expand each "
19c10 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  *" to be every c
19c20 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74  olumn in every t
19c30 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
19c40 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62  and TABLE.* to b
19c50 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
19c60 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73  n TABLE..**.*/.s
19c70 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
19c80 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20  Expander(Walker 
19c90 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
19ca0 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
19cb0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
19cc0 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  >pParse;.  int i
19cd0 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73  , j, k;.  SrcLis
19ce0 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45  t *pTabList;.  E
19cf0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
19d00 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
19d10 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20  t_item *pFrom;. 
19d20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
19d30 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
19d40 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
19d50 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed  ){.    retur
19d60 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
19d70 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 3d 3d  .  if( p->pSrc==
19d80 30 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67  0 || (p->selFlag
19d90 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
19da0 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
19db0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
19dc0 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
19dd0 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20  = SF_Expanded;. 
19de0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
19df0 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
19e00 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a  p->pEList;..  /*
19e10 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f   Make sure curso
19e20 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
19e30 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
19e40 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  all entries in. 
19e50 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
19e60 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43  use of the SELEC
19e70 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  T statement..  *
19e80 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  /.  sqlite3SrcLi
19e90 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
19ea0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
19eb0 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70  );..  /* Look up
19ec0 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d   every table nam
19ed0 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
19ee0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c  lause of the sel
19ef0 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e  ect.  If.  ** an
19f00 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
19f10 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73  OM clause is a s
19f20 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20  ubquery instead 
19f30 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
19f40 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72  ew,.  ** then cr
19f50 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74  eate a transient
19f60 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
19f70 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
19f80 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a   subquery..  */.
19f90 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
19fa0 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
19fb0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
19fc0 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
19fd0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
19fe0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
19ff0 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab!=0 ){.      
1a000 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  /* This statemen
1a010 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1a020 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  en prepared.  Th
1a030 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
1a040 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75       ** to go fu
1a050 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  rther. */.      
1a060 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a  assert( i==0 );.
1a070 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
1a080 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
1a090 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61    if( pFrom->zNa
1a0a0 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  me==0 ){.#ifndef
1a0b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1a0c0 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65  QUERY.      Sele
1a0d0 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
1a0e0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
1a0f0 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
1a100 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1a110 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
1a120 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1a130 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSel!=0 );.     
1a140 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
1a150 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
1a160 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
1a170 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
1a180 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
1a190 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
1a1a0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1a1b0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
1a1c0 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  le));.      if( 
1a1d0 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
1a1e0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
1a1f0 20 20 70 54 61 62 2d 3e 64 62 4d 65 6d 20 3d 20    pTab->dbMem = 
1a200 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
1a210 6e 61 62 6c 65 64 20 3f 20 64 62 20 3a 20 30 3b  nabled ? db : 0;
1a220 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
1a230 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61  f = 1;.      pTa
1a240 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
1a250 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
1a260 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25  qlite_subquery_%
1a270 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62  p_", (void*)pTab
1a280 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
1a290 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20  pSel->pPrior ){ 
1a2a0 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
1a2b0 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c  ior; }.      sel
1a2c0 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
1a2d0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1a2e0 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  Sel->pEList, &pT
1a2f0 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
1a300 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54  >aCol);.      pT
1a310 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
1a320 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
1a330 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
1a340 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  eral;.#endif.   
1a350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
1a360 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
1a370 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
1a380 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1a390 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  se */.      asse
1a3a0 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
1a3b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
1a3c0 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
1a3d0 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
1a3e0 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
1a3f0 72 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61  rse,0,pFrom->zNa
1a400 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62  me,pFrom->zDatab
1a410 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ase);.      if( 
1a420 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
1a430 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
1a440 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
1a450 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1a460 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
1a470 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49  | !defined (SQLI
1a480 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1a490 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20  ABLE).      if( 
1a4a0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c  pTab->pSelect ||
1a4b0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
1a4c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
1a4d0 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20  e reach here if 
1a4e0 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
1a4f0 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69  is a really a vi
1a500 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ew */.        if
1a510 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  ( sqlite3ViewGet
1a520 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
1a530 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75  se, pTab) ) retu
1a540 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 0a 20  rn WRC_Abort;.. 
1a550 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72         /* If pFr
1a560 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69  om->pSelect!=0 i
1a570 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
1a580 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20  ealing with a.  
1a590 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69        ** view wi
1a5a0 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68  thin a view.  Th
1a5b0 65 20 53 45 4c 45 43 54 20 73 74 72 75 63 74 75  e SELECT structu
1a5c0 72 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  re has already b
1a5d0 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  een.        ** c
1a5e0 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f 75 74  opied by the out
1a5f0 65 72 20 76 69 65 77 20 73 6f 20 77 65 20 63 61  er view so we ca
1a600 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20  n skip the copy 
1a610 73 74 65 70 20 68 65 72 65 0a 20 20 20 20 20 20  step here.      
1a620 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65    ** in the inne
1a630 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20  r view..        
1a640 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1a650 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
1a660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
1a670 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
1a680 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
1a690 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  db, pTab->pSelec
1a6a0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
1a6b0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
1a6c0 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  ct(pWalker, pFro
1a6d0 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
1a6e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
1a6f0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
1a700 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69   /* Locate the i
1a710 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68  ndex named by th
1a720 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  e INDEXED BY cla
1a730 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  use, if any. */.
1a740 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1a750 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70  ndexedByLookup(p
1a760 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b  Parse, pFrom) ){
1a770 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
1a780 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
1a790 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
1a7a0 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
1a7b0 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53  s, and ON and US
1a7c0 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a  ING clauses of j
1a7d0 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oins..  */.  if(
1a7e0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1a7f0 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65  d || sqliteProce
1a800 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
1a810 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1a820 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
1a830 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
1a840 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
1a850 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
1a860 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
1a870 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
1a880 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
1a890 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20  ables.  And for 
1a8a0 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e  every TABLE.* in
1a8b0 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20  sert the names. 
1a8c0 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d   ** of all colum
1a8d0 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68  ns in TABLE.  Th
1a8e0 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65  e parser inserte
1a8f0 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  d a special expr
1a900 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68  ession.  ** with
1a910 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72   the TK_ALL oper
1a920 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a  ator for each "*
1a930 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20  " that it found 
1a940 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
1a950 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c  st..  ** The fol
1a960 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
1a970 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
1a980 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73  he TK_ALL expres
1a990 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64  sions and expand
1a9a0 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74  .  ** each one t
1a9b0 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
1a9c0 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
1a9d0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
1a9e0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f  ** The first loo
1a9f0 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f  p just checks to
1aa00 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
1aa10 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74  e any "*" operat
1aa20 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65  ors.  ** that ne
1aa30 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20  ed expanding..  
1aa40 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
1aa50 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
1aa60 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1aa70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d  E = pEList->a[k]
1aa80 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
1aa90 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  pE->op==TK_ALL )
1aaa0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
1aab0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
1aac0 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20  & pE->pRight && 
1aad0 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
1aae0 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20  TK_ALL.         
1aaf0 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20  && pE->pLeft && 
1ab00 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pE->pLeft->op==T
1ab10 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20  K_ID ) break;.  
1ab20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  }.  if( k<pEList
1ab30 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
1ab40 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
1ab50 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
1ab60 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
1ab70 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
1ab80 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
1ab90 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
1aba0 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
1abb0 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
1abc0 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
1abd0 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
1abe0 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
1abf0 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
1ac00 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
1ac10 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1ac20 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
1ac30 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
1ac40 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
1ac50 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
1ac60 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
1ac70 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
1ac80 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
1ac90 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
1aca0 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  es)!=0.         
1acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1acc0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1acd0 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
1ace0 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  0;..    for(k=0;
1acf0 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
1ad00 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; k++){.      Ex
1ad10 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45  pr *pE = a[k].pE
1ad20 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
1ad30 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26  E->op!=TK_ALL &&
1ad40 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d  .           (pE-
1ad50 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
1ad60 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  E->pRight==0 || 
1ad70 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d  pE->pRight->op!=
1ad80 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  TK_ALL) ){.     
1ad90 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
1ada0 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
1adb0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1adc0 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
1add0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1ade0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1adf0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1ae00 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
1ae10 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
1ae20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
1ae30 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
1ae40 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
1ae50 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
1ae60 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
1ae70 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78          a[k].pEx
1ae80 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pr = 0;.        
1ae90 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
1aea0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1aeb0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
1aec0 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
1aed0 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
1aee0 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
1aef0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
1af00 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
1af10 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
1af20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
1af30 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
1af40 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
1af50 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20    char *zTName; 
1af60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65             /* te
1af70 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
1af80 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
1af90 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
1afa0 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29  T && pE->pLeft )
1afb0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  {.          zTNa
1afc0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1afd0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70  FromToken(db, &p
1afe0 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29  E->pLeft->token)
1aff0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1b000 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
1b010 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
1b020 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
1b030 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
1b040 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
1b050 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
1b060 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
1b070 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
1b080 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
1b090 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
1b0a0 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
1b0b0 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ias;.          i
1b0c0 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  f( zTabName==0 |
1b0d0 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
1b0e0 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
1b0f0 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
1b100 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
1b110 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
1b120 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1b130 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  led ) break;.   
1b140 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
1b150 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
1b160 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62  Cmp(zTName, zTab
1b170 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
1b180 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1b190 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b1a0 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
1b1b0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
1b1c0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
1b1d0 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
1b1e0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
1b1f0 70 45 78 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a  pExpr, *pRight;.
1b200 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
1b210 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
1b220 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a  aCol[j].zName;..
1b230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1b240 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61  f a column is ma
1b250 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27  rked as 'hidden'
1b260 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79   (currently only
1b270 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20   possible.      
1b280 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72        ** for vir
1b290 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f  tual tables), do
1b2a0 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20   not include it 
1b2b0 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a  in the expanded.
1b2c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
1b2d0 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a  esult-set list..
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
1b2f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49             if( I
1b300 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70  sHiddenColumn(&p
1b310 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b  Tab->aCol[j]) ){
1b320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
1b330 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c 28  ssert(IsVirtual(
1b340 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20  pTab));.        
1b350 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1b360 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
1b370 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
1b380 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20  >0 && zTName==0 
1b390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1b3a0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1b3b0 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70  item *pLeft = &p
1b3c0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b  TabList->a[i-1];
1b3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1b3e0 66 28 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69  f( (pLeft[1].joi
1b3f0 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
1b400 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  AL)!=0 &&.      
1b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b420 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c    columnIndex(pL
1b430 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65  eft->pTab, zName
1b440 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
1b450 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
1b460 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
1b470 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
1b480 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
1b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1b4a0 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
1b4b0 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ght */.         
1b4c0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1b4d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1b4e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1b4f0 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  f( sqlite3IdList
1b500 49 6e 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e 70  Index(pLeft[1].p
1b510 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
1b520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b530 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
1b540 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
1b550 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
1b560 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
1b570 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
1b580 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
1b590 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
1b5a0 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
1b5b0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1b5c0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1b5d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1b5e0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
1b5f0 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 50 45  ight = sqlite3PE
1b600 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
1b610 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
1b620 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69           if( pRi
1b630 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ght==0 ) break;.
1b640 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 51              setQ
1b650 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61 72 73  uotedToken(pPars
1b660 65 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65  e, &pRight->toke
1b670 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  n, zName);.     
1b680 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
1b690 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74  ames || pTabList
1b6a0 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  ->nSrc>1 ){.    
1b6b0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
1b6c0 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 50  pLeft = sqlite3P
1b6d0 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1b6e0 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1b700 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
1b710 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
1b720 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
1b730 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
1b740 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1b750 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1b760 20 20 20 20 20 20 73 65 74 51 75 6f 74 65 64 54        setQuotedT
1b770 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70 4c  oken(pParse, &pL
1b780 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62  eft->token, zTab
1b790 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
1b7a0 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70       setToken(&p
1b7b0 45 78 70 72 2d 3e 73 70 61 6e 2c 20 0a 20 20 20  Expr->span, .   
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1b7d0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1b7e0 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e  , "%s.%s", zTabN
1b7f0 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20  ame, zName));.  
1b800 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1b810 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b  r->span.dyn = 1;
1b820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1b830 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  Expr->token.z = 
1b840 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
1b850 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20   pExpr->token.n 
1b860 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
1b870 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
1b880 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
1b890 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b8a0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
1b8b0 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
1b8c0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
1b8d0 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  pan = pExpr->tok
1b8e0 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  en;.            
1b8f0 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79    pExpr->span.dy
1b900 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
1b910 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1b920 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
1b930 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b940 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
1b950 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1b960 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
1b970 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b  , &pExpr->span);
1b980 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
1b990 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1b9a0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1b9b0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1b9c0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78  Parse, pNew, pEx
1b9d0 70 72 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b  pr, &pRight->tok
1b9e0 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
1b9f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1ba00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ba10 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
1ba20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1ba30 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
1ba40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1ba50 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1ba60 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
1ba70 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
1ba80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ba90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1baa0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1bab0 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
1bac0 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
1bad0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1bae0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1baf0 62 46 72 65 65 28 64 62 2c 20 7a 54 4e 61 6d 65  bFree(db, zTName
1bb00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1bb10 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1bb20 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1bb30 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
1bb40 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
1bb50 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
1bb60 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
1bb70 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45  >pEList && p->pE
1bb80 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
1bb90 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
1bba0 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
1bbb0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1bbc0 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
1bbd0 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
1bbe0 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
1bbf0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
1bc00 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1bc10 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72  }../*.** No-op r
1bc20 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70  outine for the p
1bc30 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72  arse-tree walker
1bc40 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1bc50 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
1bc60 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
1bc70 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65  lback then expre
1bc80 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61  ssion trees.** a
1bc90 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75  re walked withou
1bca0 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65  t any actions be
1bcb0 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63  ing taken at eac
1bcc0 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61  h node.  Presuma
1bcd0 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69  bly,.** when thi
1bce0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1bcf0 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78  d for Walker.xEx
1bd00 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
1bd10 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  .** Walker.xSele
1bd20 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65  ctCallback is se
1bd30 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  t to do somethin
1bd40 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65  g useful for eve
1bd50 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ry .** subquery 
1bd60 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
1bd70 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
1bd80 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57  t exprWalkNoop(W
1bd90 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
1bda0 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b  Expr *NotUsed2){
1bdb0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1bdc0 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
1bdd0 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
1bde0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1bdf0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1be00 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
1be10 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1be20 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
1be30 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
1be40 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
1be50 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
1be60 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
1be70 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
1be80 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
1be90 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
1bea0 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
1beb0 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
1bec0 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
1bed0 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
1bee0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
1bef0 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
1bf00 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
1bf10 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
1bf20 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
1bf30 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
1bf40 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
1bf50 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
1bf60 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
1bf70 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
1bf80 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
1bf90 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
1bfa0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
1bfb0 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
1bfc0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1bfd0 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
1bfe0 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
1bff0 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
1c000 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
1c010 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1c020 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
1c030 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
1c040 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
1c050 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
1c060 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
1c070 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65  alker w;.  w.xSe
1c080 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
1c090 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20  electExpander;. 
1c0a0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
1c0b0 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
1c0c0 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
1c0d0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
1c0e0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
1c0f0 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  elect);.}...#ifn
1c100 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c110 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
1c120 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e  his is a Walker.
1c130 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1c140 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
1c150 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79   sqlite3SelectTy
1c160 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65  peInfo().** inte
1c170 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rface..**.** For
1c180 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73   each FROM-claus
1c190 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20  e subquery, add 
1c1a0 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64  Column.zType and
1c1b0 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a   Column.zColl.**
1c1c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
1c1d0 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
1c1e0 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
1c1f0 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
1c200 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75  et.** of that su
1c210 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
1c220 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
1c230 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
1c240 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
1c250 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64   was constructed
1c260 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70  .** by selectExp
1c270 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20  ander() but the 
1c280 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
1c290 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  on information w
1c2a0 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74  as omitted.** at
1c2b0 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61   that point beca
1c2c0 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20  use identifiers 
1c2d0 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  had not yet been
1c2e0 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73   resolved.  This
1c2f0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
1c300 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e  alled after iden
1c310 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f  tifier resolutio
1c320 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1c330 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
1c340 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65  ryTypeInfo(Walke
1c350 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
1c360 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
1c370 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  *pParse;.  int i
1c380 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
1c390 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
1c3a0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
1c3b0 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rom;..  assert( 
1c3c0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1c3d0 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69  _Resolved );.  i
1c3e0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1c3f0 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
1c400 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73  )==0 ){.    p->s
1c410 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61  elFlags |= SF_Ha
1c420 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70  sTypeInfo;.    p
1c430 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
1c440 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61  >pParse;.    pTa
1c450 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1c460 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  .    for(i=0, pF
1c470 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
1c480 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1c490 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
1c4a0 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
1c4b0 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
1c4c0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  b;.      if( pTa
1c4d0 62 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  b && (pTab->tabF
1c4e0 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
1c4f0 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
1c500 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
1c510 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
1c520 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
1c530 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
1c540 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
1c550 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
1c560 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 20     assert( pSel 
1c570 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
1c580 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
1c590 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
1c5a0 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 65  rior;.        se
1c5b0 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
1c5c0 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
1c5d0 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  arse, pTab->nCol
1c5e0 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53  , pTab->aCol, pS
1c5f0 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
1c600 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1c610 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
1c620 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
1c630 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
1c640 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f   datatype and co
1c650 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1c660 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a   information to.
1c670 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  ** the Table str
1c680 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46  uctures of all F
1c690 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1c6a0 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45  eries in a.** SE
1c6b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
1c6c0 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72  **.** Use this r
1c6d0 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d  outine after nam
1c6e0 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  e resolution..*/
1c6f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
1c700 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
1c710 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  eInfo(Parse *pPa
1c720 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
1c730 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  lect){.#ifndef S
1c740 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1c750 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  ERY.  Walker w;.
1c760 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
1c770 61 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64 53  ack = selectAddS
1c780 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b  ubqueryTypeInfo;
1c790 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
1c7a0 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f  ck = exprWalkNoo
1c7b0 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
1c7c0 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
1c7d0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
1c7e0 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66  pSelect);.#endif
1c7f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1c800 72 6f 75 74 69 6e 65 20 73 65 74 73 20 6f 66 20  routine sets of 
1c810 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1c820 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  nt for processin
1c830 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  g.  The.** follo
1c840 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69  wing is accompli
1c850 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  shed:.**.**     
1c860 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e  *  VDBE Cursor n
1c870 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67  umbers are assig
1c880 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d  ned to all FROM-
1c890 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
1c8a0 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61       *  Ephemera
1c8b0 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20  l Table objects 
1c8c0 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
1c8d0 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
1c8e0 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20  subqueries..**  
1c8f0 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49     *  ON and USI
1c900 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73  NG clauses are s
1c910 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52  hifted into WHER
1c920 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  E statements.** 
1c930 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73      *  Wildcards
1c940 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e   "*" and "TABLE.
1c950 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  *" in result set
1c960 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a  s are expanded..
1c970 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69  **     *  Identi
1c980 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73  fiers in express
1c990 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20  ion are matched 
1c9a0 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  to tables..**.**
1c9b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
1c9c0 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ts recursively o
1c9d0 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73  n all subqueries
1c9e0 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45   within the SELE
1c9f0 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
1ca00 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20  te3SelectPrep(. 
1ca10 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1ca20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1ca30 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
1ca40 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1ca50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ca60 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1ca70 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
1ca80 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
1ca90 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61  *pOuterNC  /* Na
1caa0 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63  me context for c
1cab0 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20  ontainer */.){. 
1cac0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1cad0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1cae0 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  n;.  db = pParse
1caf0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 73  ->db;.  if( p->s
1cb00 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
1cb10 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72  TypeInfo ) retur
1cb20 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
1cb30 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
1cb40 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1cb50 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
1cb60 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65  ectExpand(pParse
1cb70 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , p);.  if( pPar
1cb80 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
1cb90 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
1cba0 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
1cbb0 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d  ResolveSelectNam
1cbc0 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  es(pParse, p, pO
1cbd0 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70  uterNC);.  if( p
1cbe0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
1cbf0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1cc00 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1cc10 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
1cc20 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b  Info(pParse, p);
1cc30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
1cc40 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
1cc50 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
1cc60 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61   The aggregate a
1cc70 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20  ccumulator is a 
1cc80 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  set of memory ce
1cc90 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a  lls that hold.**
1cca0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
1ccb0 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63  sults while calc
1ccc0 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65  ulating an aggre
1ccd0 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72  gate.  This.** r
1cce0 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74  outine simply st
1ccf0 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
1cd00 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
1cd10 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  y cells..*/.stat
1cd20 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63  ic void resetAcc
1cd30 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
1cd40 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
1cd50 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
1cd60 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1cd70 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
1cd80 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1cd90 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  _func *pFunc;.  
1cda0 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  if( pAggInfo->nF
1cdb0 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  unc+pAggInfo->nC
1cdc0 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  olumn==0 ){.    
1cdd0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f  return;.  }.  fo
1cde0 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
1cdf0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  o->nColumn; i++)
1ce00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1ce10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1ce20 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d  ll, 0, pAggInfo-
1ce30 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a  >aCol[i].iMem);.
1ce40 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d    }.  for(pFunc=
1ce50 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
1ce60 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
1ce70 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
1ce80 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  unc++){.    sqli
1ce90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1cea0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75   OP_Null, 0, pFu
1ceb0 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69  nc->iMem);.    i
1cec0 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  f( pFunc->iDisti
1ced0 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
1cee0 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63  Expr *pE = pFunc
1cef0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
1cf00 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1cf10 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78  roperty(pE, EP_x
1cf20 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
1cf30 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69     if( pE->x.pLi
1cf40 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70  st==0 || pE->x.p
1cf50 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
1cf60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1cf70 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1cf80 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67 72  , "DISTINCT aggr
1cf90 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76 65  egates must have
1cfa0 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20   exactly one ". 
1cfb0 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75 6d            "argum
1cfc0 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ent");.        p
1cfd0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20  Func->iDistinct 
1cfe0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1cff0 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  e{.        KeyIn
1d000 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b  fo *pKeyInfo = k
1d010 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
1d020 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78  st(pParse, pE->x
1d030 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  .pList);.       
1d040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d050 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
1d060 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69  emeral, pFunc->i
1d070 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  Distinct, 0, 0,.
1d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d090 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
1d0a0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
1d0b0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
1d0c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d0d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
1d0e0 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
1d0f0 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
1d100 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
1d110 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
1d120 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
1d130 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1d140 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
1d150 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
1d160 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
1d170 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
1d180 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1d190 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
1d1a0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
1d1b0 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
1d1c0 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
1d1d0 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
1d1e0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
1d1f0 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
1d200 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
1d210 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
1d220 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
1d230 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1d240 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
1d250 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
1d260 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d270 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p4(v, OP_AggFina
1d280 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
1d290 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
1d2a0 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  r : 0, 0,.      
1d2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2c0 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
1d2d0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
1d2e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
1d2f0 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
1d300 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
1d310 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
1d320 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
1d330 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
1d340 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
1d350 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
1d360 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
1d370 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
1d380 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1d390 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1d3a0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1d3b0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1d3c0 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73  fo_func *pF;.  s
1d3d0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
1d3e0 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e  l *pC;..  pAggIn
1d3f0 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
1d400 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   1;.  for(i=0, p
1d410 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
1d420 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
1d430 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
1d440 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  {.    int nArg;.
1d450 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
1d460 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
1d470 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  gAgg;.    ExprLi
1d480 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
1d490 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
1d4a0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1d4b0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
1d4c0 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
1d4d0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
1d4e0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
1d4f0 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nArg = pList->nE
1d500 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67  xpr;.      regAg
1d510 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1d520 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1d530 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  nArg);.      sql
1d540 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
1d550 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
1d560 73 74 2c 20 72 65 67 41 67 67 2c 20 30 29 3b 0a  st, regAgg, 0);.
1d570 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d580 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20   nArg = 0;.     
1d590 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20   regAgg = 0;.   
1d5a0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69   }.    if( pF->i
1d5b0 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
1d5c0 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20       addrNext = 
1d5d0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1d5e0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
1d5f0 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29  ssert( nArg==1 )
1d600 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  ;.      codeDist
1d610 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
1d620 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
1d630 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
1d640 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d650 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67 73  pF->pFunc->flags
1d660 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
1d670 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
1d680 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
1d690 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63  = 0;.      struc
1d6a0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1d6b0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e  *pItem;.      in
1d6c0 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
1d6d0 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20  t( pList!=0 );  
1d6e0 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70  /* pList!=0 if p
1d6f0 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45  F->pFunc has NEE
1d700 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66  DCOLL */.      f
1d710 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
1d720 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
1d730 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70  & j<nArg; j++, p
1d740 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
1d750 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1d760 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1d770 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
1d780 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d790 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
1d7a0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
1d7b0 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
1d7c0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
1d7d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d7e0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
1d7f0 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  Seq, 0, 0, 0, (c
1d800 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
1d810 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a  COLLSEQ);.    }.
1d820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d830 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53  ddOp4(v, OP_AggS
1d840 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20  tep, 0, regAgg, 
1d850 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20  pF->iMem,.      
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d870 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
1d880 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
1d890 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1d8a0 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41  angeP5(v, (u8)nA
1d8b0 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
1d8c0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1d8d0 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
1d8e0 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
1d8f0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1d900 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1d910 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
1d920 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65  ;.    if( addrNe
1d930 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  xt ){.      sqli
1d940 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1d950 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29  bel(v, addrNext)
1d960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
1d970 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
1d980 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
1d990 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
1d9a0 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
1d9b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1d9c0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
1d9d0 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
1d9e0 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
1d9f0 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
1da00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1da10 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
1da20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1da30 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70  t given in the p
1da40 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a   argument.  .**.
1da50 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
1da60 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69  re distributed i
1da70 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64  n various ways d
1da80 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a  epending on the.
1da90 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1daa0 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74  he SelectDest st
1dab0 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
1dac0 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70  to by argument p
1dad0 44 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f  Dest.** as follo
1dae0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44  ws:.**.**     pD
1daf0 65 73 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65  est->eDest    Re
1db00 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d  sult.**     ----
1db10 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
1db20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1db30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1db40 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53  -------.**     S
1db50 52 54 5f 4f 75 74 70 75 74 20 20 20 20 20 20 47  RT_Output      G
1db60 65 6e 65 72 61 74 65 20 61 20 72 6f 77 20 6f 66  enerate a row of
1db70 20 6f 75 74 70 75 74 20 28 75 73 69 6e 67 20 74   output (using t
1db80 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a  he OP_ResultRow.
1db90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1dba0 20 20 20 20 20 20 20 6f 70 63 6f 64 65 29 20 66         opcode) f
1dbb0 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74  or each row in t
1dbc0 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
1dbd0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d  *.**     SRT_Mem
1dbe0 20 20 20 20 20 20 20 20 20 4f 6e 6c 79 20 76 61           Only va
1dbf0 6c 69 64 20 69 66 20 74 68 65 20 72 65 73 75 6c  lid if the resul
1dc00 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 63 6f  t is a single co
1dc10 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  lumn..**        
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f               Sto
1dc30 72 65 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c  re the first col
1dc40 75 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74  umn of the first
1dc50 20 72 65 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20   result row.**  
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc70 20 20 20 69 6e 20 72 65 67 69 73 74 65 72 20 70     in register p
1dc80 44 65 73 74 2d 3e 69 50 61 72 6d 20 74 68 65 6e  Dest->iParm then
1dc90 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 65 73   abandon the res
1dca0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1dcb0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1dcc0 71 75 65 72 79 2e 20 20 54 68 69 73 20 64 65 73  query.  This des
1dcd0 74 69 6e 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73  tination implies
1dce0 20 22 4c 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a   "LIMIT 1"..**.*
1dcf0 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20 20  *     SRT_Set   
1dd00 20 20 20 20 20 20 54 68 65 20 72 65 73 75 6c 74        The result
1dd10 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c   must be a singl
1dd20 65 20 63 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65  e column.  Store
1dd30 20 65 61 63 68 0a 2a 2a 20 20 20 20 20 20 20 20   each.**        
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 77               row
1dd50 20 6f 66 20 72 65 73 75 6c 74 20 61 73 20 74 68   of result as th
1dd60 65 20 6b 65 79 20 69 6e 20 74 61 62 6c 65 20 70  e key in table p
1dd70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a  Dest->iParm. .**
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd90 20 20 20 20 20 41 70 70 6c 79 20 74 68 65 20 61       Apply the a
1dda0 66 66 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61  ffinity pDest->a
1ddb0 66 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20 73  ffinity before s
1ddc0 74 6f 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  toring.**       
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1dde0 73 75 6c 74 73 2e 20 20 55 73 65 64 20 74 6f 20  sults.  Used to 
1ddf0 69 6d 70 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53  implement "IN (S
1de00 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a  ELECT ...)"..**.
1de10 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e  **     SRT_Union
1de20 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
1de30 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e  ults as a key in
1de40 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
1de50 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e  le pDest->iParm.
1de60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
1de70 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76  xcept      Remov
1de80 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74  e results from t
1de90 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1dea0 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e  le pDest->iParm.
1deb0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54  .**.**     SRT_T
1dec0 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65  able       Store
1ded0 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70   results in temp
1dee0 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73  orary table pDes
1def0 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 20 20 20 20  t->iParm..**    
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df10 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52   This is like SR
1df20 54 5f 45 70 68 65 6d 54 61 62 20 65 78 63 65 70  T_EphemTab excep
1df30 74 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  t that the table
1df40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1df50 20 20 20 20 20 20 20 20 69 73 20 61 73 73 75 6d          is assum
1df60 65 64 20 74 6f 20 61 6c 72 65 61 64 79 20 62 65  ed to already be
1df70 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   open..**.**    
1df80 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20 20   SRT_EphemTab   
1df90 20 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70 6f   Create an tempo
1dfa0 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
1dfb0 2d 3e 69 50 61 72 6d 20 61 6e 64 20 73 74 6f 72  ->iParm and stor
1dfc0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1dfd0 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73           the res
1dfe0 75 6c 74 20 74 68 65 72 65 2e 20 54 68 65 20 63  ult there. The c
1dff0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 6f 70  ursor is left op
1e000 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20  en after.**     
1e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e020 72 65 74 75 72 6e 69 6e 67 2e 20 20 54 68 69 73  returning.  This
1e030 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 54 61 62   is like SRT_Tab
1e040 6c 65 20 65 78 63 65 70 74 20 74 68 61 74 0a 2a  le except that.*
1e050 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e060 20 20 20 20 20 20 74 68 69 73 20 64 65 73 74 69        this desti
1e070 6e 61 74 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f  nation uses OP_O
1e080 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 6f 20  penEphemeral to 
1e090 63 72 65 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  create.**       
1e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
1e0b0 65 20 74 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a  e table first..*
1e0c0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f 72  *.**     SRT_Cor
1e0d0 6f 75 74 69 6e 65 20 20 20 47 65 6e 65 72 61 74  outine   Generat
1e0e0 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  e a co-routine t
1e0f0 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65  hat returns a ne
1e100 77 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20  w row of.**     
1e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e120 72 65 73 75 6c 74 73 20 65 61 63 68 20 74 69 6d  results each tim
1e130 65 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e  e it is invoked.
1e140 20 20 54 68 65 20 65 6e 74 72 79 20 70 6f 69 6e    The entry poin
1e150 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1e160 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1e170 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73 20 73 74  co-routine is st
1e180 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
1e190 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
1e1a0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 69  *.**     SRT_Exi
1e1b0 73 74 73 20 20 20 20 20 20 53 74 6f 72 65 20 61  sts      Store a
1e1c0 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c   1 in memory cel
1e1d0 6c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 69  l pDest->iParm i
1e1e0 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  f the result.** 
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e200 20 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65      set is not e
1e210 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mpty..**.**     
1e220 53 52 54 5f 44 69 73 63 61 72 64 20 20 20 20 20  SRT_Discard     
1e230 54 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74  Throw the result
1e240 73 20 61 77 61 79 2e 20 20 54 68 69 73 20 69 73  s away.  This is
1e250 20 75 73 65 64 20 62 79 20 53 45 4c 45 43 54 0a   used by SELECT.
1e260 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1e270 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
1e280 73 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72  s within trigger
1e290 73 20 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72  s whose only pur
1e2a0 70 6f 73 65 20 69 73 0a 2a 2a 20 20 20 20 20 20  pose is.**      
1e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1e2c0 68 65 20 73 69 64 65 2d 65 66 66 65 63 74 73 20  he side-effects 
1e2d0 6f 66 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a  of functions..**
1e2e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e2f0 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
1e300 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
1e310 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
1e320 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
1e330 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
1e340 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
1e350 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
1e360 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
1e370 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
1e380 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
1e390 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
1e3a0 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
1e3b0 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
1e3c0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
1e3d0 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
1e3e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
1e3f0 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
1e400 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
1e410 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
1e420 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
1e430 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1e440 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
1e450 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
1e460 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ded. */.  Select
1e470 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
1e480 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
1e490 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65  ith the query re
1e4a0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
1e4b0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
1e4c0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1e4d0 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
1e4e0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
1e4f0 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
1e500 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1e510 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
1e520 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1e530 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
1e540 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
1e550 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1e560 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
1e570 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
1e580 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
1e590 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
1e5a0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1e5b0 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  EList;      /* L
1e5c0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
1e5d0 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
1e5e0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
1e5f0 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
1e600 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
1e610 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
1e620 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
1e630 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1e640 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
1e650 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
1e660 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
1e670 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
1e680 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
1e690 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
1e6a0 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
1e6b0 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
1e6c0 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
1e6d0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
1e6e0 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
1e6f0 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
1e700 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
1e710 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
1e720 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  isDistinct;     
1e730 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1e740 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
1e750 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
1e760 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b  .  int distinct;
1e770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1e780 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  le to use for th
1e790 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a  e distinct set *
1e7a0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
1e7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1e7c0 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
1e7d0 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
1e7e0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f   */.  int addrSo
1e7f0 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20  rtIndex;     /* 
1e800 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50  Address of an OP
1e810 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
1e820 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1e830 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
1e840 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
1e850 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
1e860 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
1e870 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
1e880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1e890 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
1e8a0 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
1e8b0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
1e8c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e8d0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1e8e0 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d  ction */..  db =
1e8f0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1e900 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  f( p==0 || db->m
1e910 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
1e920 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
1e930 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1e940 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
1e950 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1e960 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
1e970 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
1e980 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41   1;.  memset(&sA
1e990 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ggInfo, 0, sizeo
1e9a0 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20  f(sAggInfo));.. 
1e9b0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
1e9c0 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 49  OrderBy;.  if( I
1e9d0 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
1e9e0 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 2d  pDest) ){.    p-
1e9f0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a  >pOrderBy = 0;..
1ea00 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 73 65 20      /* In these 
1ea10 63 61 73 65 73 20 74 68 65 20 44 49 53 54 49 4e  cases the DISTIN
1ea20 43 54 20 6f 70 65 72 61 74 6f 72 20 6d 61 6b 65  CT operator make
1ea30 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
1ea40 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  to the.    ** re
1ea50 73 75 6c 74 73 2c 20 73 6f 20 72 65 6d 6f 76 65  sults, so remove
1ea60 20 69 74 20 69 66 20 69 74 20 77 65 72 65 20 73   it if it were s
1ea70 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f  pecified..    */
1ea80 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73  .    assert(pDes
1ea90 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
1eaa0 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ists || pDest->e
1eab0 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest==SRT_Union 
1eac0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  || .           p
1ead0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1eae0 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74  _Except || pDest
1eaf0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
1eb00 63 61 72 64 29 3b 0a 20 20 20 20 70 2d 3e 73 65  card);.    p->se
1eb10 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
1eb20 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71  stinct;.  }.  sq
1eb30 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
1eb40 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20  pParse, p, 0);. 
1eb50 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
1eb60 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
1eb70 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
1eb80 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
1eb90 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1eba0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  d ){.    goto se
1ebb0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
1ebc0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
1ebd0 72 64 65 72 42 79 3b 0a 20 20 69 73 41 67 67 20  rderBy;.  isAgg 
1ebe0 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
1ebf0 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
1ec00 30 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  0;.  if( pEList=
1ec10 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
1ec20 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  _end;..  /* .  *
1ec30 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74  * Do not even at
1ec40 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74  tempt to generat
1ec50 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65  e any code if we
1ec60 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65   have already se
1ec70 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62  en.  ** errors b
1ec80 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
1ec90 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a  ne starts..  */.
1eca0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1ecb0 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  rr>0 ) goto sele
1ecc0 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 4f 52  ct_end;..  /* OR
1ecd0 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65  DER BY is ignore
1ece0 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69  d for some desti
1ecf0 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nations..  */.  
1ed00 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64  if( IgnorableOrd
1ed10 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
1ed20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
1ed30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
1ed40 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   generating code
1ed50 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
1ed60 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1ed70 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
1ed80 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1ed90 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  d;..  /* Generat
1eda0 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73  e code for all s
1edb0 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68  ub-queries in th
1edc0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
1edd0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1ede0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1edf0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1ee00 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1ee10 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21  EW).  for(i=0; !
1ee20 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70  p->pPrior && i<p
1ee30 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1ee40 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
1ee50 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1ee60 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
1ee70 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
1ee80 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
1ee90 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
1eea0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
1eeb0 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b     int isAggSub;
1eec0 0a 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  ..    if( pSub==
1eed0 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f  0 || pItem->isPo
1eee0 70 75 6c 61 74 65 64 20 29 20 63 6f 6e 74 69 6e  pulated ) contin
1eef0 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72  ue;..    /* Incr
1ef00 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
1ef10 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
1ef20 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
1ef30 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
1ef40 2a 2a 20 74 72 65 65 20 72 65 66 65 72 65 64 20  ** tree refered 
1ef50 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
1ef60 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
1ef70 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
1ef80 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
1ef90 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
1efa0 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
1efb0 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
1efc0 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
1efd0 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
1efe0 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
1eff0 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
1f000 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
1f010 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
1f020 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
1f030 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
1f040 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
1f050 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
1f060 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
1f070 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
1f080 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
1f090 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1f0a0 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1f0b0 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
1f0c0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e  into the parent.
1f0d0 20 2a 2f 0a 20 20 20 20 69 73 41 67 67 53 75 62   */.    isAggSub
1f0e0 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61   = (pSub->selFla
1f0f0 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
1f100 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66  e)!=0;.    if( f
1f110 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
1f120 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41  Parse, p, i, isA
1f130 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b  gg, isAggSub) ){
1f140 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67  .      if( isAgg
1f150 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Sub ){.        i
1f160 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
1f170 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
1f180 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
1f190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
1f1a0 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
1f1b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
1f1c0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
1f1d0 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
1f1e0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
1f1f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f200 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74  pItem->isPopulat
1f210 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ed==0 );.      s
1f220 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1f230 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
1f240 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
1f250 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b  isPopulated = 1;
1f260 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1f270 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
1f280 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1f290 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
1f2a0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
1f2b0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
1f2c0 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65  ght -= sqlite3Se
1f2d0 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
1f2e0 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20  );.    pTabList 
1f2f0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
1f300 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64  f( !IgnorableOrd
1f310 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
1f320 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
1f330 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
1f340 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
1f350 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e  = p->pEList;.#en
1f360 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70  dif.  pWhere = p
1f370 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
1f380 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1f390 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
1f3a0 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
1f3b0 44 69 73 74 69 6e 63 74 20 3d 20 28 70 2d 3e 73  Distinct = (p->s
1f3c0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1f3d0 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e  tinct)!=0;..#ifn
1f3e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f3f0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
1f400 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1f410 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20   are a sequence 
1f420 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74  of queries, do t
1f430 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20  he earlier ones 
1f440 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  first..  */.  if
1f450 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
1f460 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74     if( p->pRight
1f470 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  most==0 ){.     
1f480 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20   Select *pLoop, 
1f490 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  *pRight = 0;.   
1f4a0 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
1f4b0 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65        int mxSele
1f4c0 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c  ct;.      for(pL
1f4d0 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
1f4e0 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
1f4f0 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20  r, cnt++){.     
1f500 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74     pLoop->pRight
1f510 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  most = p;.      
1f520 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d    pLoop->pNext =
1f530 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
1f540 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b   pRight = pLoop;
1f550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
1f560 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c  xSelect = db->aL
1f570 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
1f580 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
1f590 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  T];.      if( mx
1f5a0 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d 78  Select && cnt>mx
1f5b0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
1f5c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1f5d0 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
1f5e0 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d  any terms in com
1f5f0 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a  pound SELECT");.
1f600 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
1f610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f620 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
1f630 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
1f640 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 23 65  , pDest);.  }.#e
1f650 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 72  ndif..  /* If wr
1f660 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
1f670 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
1f680 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
1f690 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
1f6a0 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
1f6b0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1f6c0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1f6d0 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
1f6e0 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
1f6f0 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
1f700 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
1f710 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
1f720 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
1f730 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f  ndif..  /* If po
1f740 73 73 69 62 6c 65 2c 20 72 65 77 72 69 74 65 20  ssible, rewrite 
1f750 74 68 65 20 71 75 65 72 79 20 74 6f 20 75 73 65  the query to use
1f760 20 47 52 4f 55 50 20 42 59 20 69 6e 73 74 65 61   GROUP BY instea
1f770 64 20 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a 20  d of DISTINCT.. 
1f780 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d 69 67   ** GROUP BY mig
1f790 68 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2c  ht use an index,
1f7a0 20 44 49 53 54 49 4e 43 54 20 6e 65 76 65 72 20   DISTINCT never 
1f7b0 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  does..  */.  if(
1f7c0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1f7d0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1f7e0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
1f7f0 44 69 73 74 69 6e 63 74 20 26 26 20 21 70 2d 3e  Distinct && !p->
1f800 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
1f810 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
1f820 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1f830 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
1f840 30 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79  0);.    pGroupBy
1f850 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
1f860 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
1f870 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
1f880 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20  .    isDistinct 
1f890 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
1f8a0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
1f8b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
1f8c0 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67  hen this sorting
1f8d0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68  .  ** index migh
1f8e0 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75  t end up being u
1f8f0 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74  nused if the dat
1f900 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65  a can be .  ** e
1f910 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d  xtracted in pre-
1f920 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49  sorted order.  I
1f930 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
1f940 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  se, then the.  *
1f950 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  * OP_OpenEphemer
1f960 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  al instruction w
1f970 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74  ill be changed t
1f980 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63  o an OP_Noop onc
1f990 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65  e.  ** we figure
1f9a0 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f   out that the so
1f9b0 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e  rting index is n
1f9c0 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20  ot needed.  The 
1f9d0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20  addrSortIndex.  
1f9e0 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  ** variable is u
1f9f0 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74  sed to facilitat
1fa00 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  e that change.. 
1fa10 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
1fa20 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
1fa30 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
1fa40 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
1fa50 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
1fa60 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
1fa70 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  );.    pOrderBy-
1fa80 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  >iECursor = pPar
1fa90 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1faa0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
1fab0 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64  2] = addrSortInd
1fac0 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  ex =.      sqlit
1fad0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1fae0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1faf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72               pOr
1fb10 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
1fb20 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
1fb30 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  +2, 0,.         
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb50 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
1fb60 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
1fb70 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b  NDOFF);.  }else{
1fb80 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64  .    addrSortInd
1fb90 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
1fba0 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
1fbb0 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
1fbc0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
1fbd0 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
1fbe0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
1fbf0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1fc00 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
1fc10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fc20 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
1fc30 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e  hemeral, pDest->
1fc40 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  iParm, pEList->n
1fc50 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
1fc60 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
1fc70 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
1fc80 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1fc90 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75  abel(v);.  compu
1fca0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
1fcb0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64  (pParse, p, iEnd
1fcc0 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20  );..  /* Open a 
1fcd0 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
1fce0 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
1fcf0 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
1fd00 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
1fd10 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
1fd20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61  *pKeyInfo;.    a
1fd30 73 73 65 72 74 28 20 69 73 41 67 67 20 7c 7c 20  ssert( isAgg || 
1fd40 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20 20  pGroupBy );.    
1fd50 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  distinct = pPars
1fd60 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70  e->nTab++;.    p
1fd70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
1fd80 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
1fd90 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29  arse, p->pEList)
1fda0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1fdb0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
1fdc0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 69 73  enEphemeral, dis
1fdd0 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdf0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1fe00 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
1fe10 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
1fe20 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74  se{.    distinct
1fe30 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
1fe40 20 41 67 67 72 65 67 61 74 65 20 61 6e 64 20 6e   Aggregate and n
1fe50 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
1fe60 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65 64  ries are handled
1fe70 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a   differently */.
1fe80 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20    if( !isAgg && 
1fe90 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
1fea0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
1feb0 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65  is for non-aggre
1fec0 67 61 74 65 20 71 75 65 72 69 65 73 0a 20 20 20  gate queries.   
1fed0 20 2a 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   ** Begin the da
1fee0 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 20 20  tabase scan.    
1fef0 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  */.    pWInfo = 
1ff00 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1ff10 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
1ff20 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f 72  st, pWhere, &pOr
1ff30 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20  derBy, 0, 0);.  
1ff40 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
1ff50 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1ff60 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f  d;..    /* If so
1ff70 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
1ff80 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
1ff90 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
1ffa0 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
1ffb0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
1ffc0 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
1ffd0 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
1ffe0 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
1fff0 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
20000 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
20010 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
20020 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
20030 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
20040 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20050 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
20060 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
20070 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  x, 1);.      p->
20080 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
20090 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  = -1;.    }..   
200a0 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
200b0 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a  dard inner loop.
200c0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
200d0 74 28 21 69 73 44 69 73 74 69 6e 63 74 29 3b 0a  t(!isDistinct);.
200e0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
200f0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
20100 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
20110 64 65 72 42 79 2c 20 2d 31 2c 20 70 44 65 73 74  derBy, -1, pDest
20120 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20130 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43        pWInfo->iC
20140 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d  ontinue, pWInfo-
20150 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 20 20 2f  >iBreak);..    /
20160 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
20170 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
20180 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
20190 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
201a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
201b0 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 70 72  * This is the pr
201c0 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67  ocessing for agg
201d0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
201e0 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
201f0 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
20200 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
20210 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
20220 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
20230 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
20240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
20250 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
20260 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
20270 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
20280 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
20290 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
202a0 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
202b0 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
202c0 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
202d0 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
202e0 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
202f0 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
20300 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
20310 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
20320 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
20330 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
20340 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
20350 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
20360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20370 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
20380 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
20390 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
203a0 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
203b0 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
203c0 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
203d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
203e0 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
203f0 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
20400 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
20410 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
20420 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
20430 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
20440 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
20450 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
20460 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64  * Remove any and
20470 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74   all aliases bet
20480 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  ween the result 
20490 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20  set and the.    
204a0 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  ** GROUP BY clau
204b0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
204c0 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
204d0 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20       int k;     
204e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204f0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
20500 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  er */.      stru
20510 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
20520 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72   *pItem;  /* For
20530 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78   looping over ex
20540 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69  pression in a li
20550 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  st */..      for
20560 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  (k=p->pEList->nE
20570 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45  xpr, pItem=p->pE
20580 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  List->a; k>0; k-
20590 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
205a0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69       pItem->iAli
205b0 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
205c0 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f        for(k=pGro
205d0 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74  upBy->nExpr, pIt
205e0 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20  em=pGroupBy->a; 
205f0 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
20600 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
20610 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->iAlias = 0;. 
20620 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 0a       }.    }.. .
20630 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
20640 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
20650 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
20660 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79   abort the query
20670 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20   */.    addrEnd 
20680 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
20690 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
206a0 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f  /* Convert TK_CO
206b0 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20  LUMN nodes into 
206c0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e  TK_AGG_COLUMN an
206d0 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69  d make entries i
206e0 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66  n.    ** sAggInf
206f0 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47  o for all TK_AGG
20700 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
20710 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  in expressions o
20720 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c  f the.    ** SEL
20730 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
20740 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
20750 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
20760 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
20770 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
20780 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
20790 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
207a0 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d    sNC.pAggInfo =
207b0 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20   &sAggInfo;.    
207c0 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
207d0 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70  gColumn = pGroup
207e0 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By ? pGroupBy->n
207f0 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20  Expr+1 : 0;.    
20800 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
20810 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
20820 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
20830 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
20840 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
20850 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
20860 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
20870 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
20880 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
20890 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
208a0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
208b0 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a  &sNC, pHaving);.
208c0 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
208d0 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
208e0 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
208f0 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  mn;.    for(i=0;
20900 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
20910 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  c; i++){.      a
20920 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
20930 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f  roperty(sAggInfo
20940 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c  .aFunc[i].pExpr,
20950 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
20960 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
20970 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
20980 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
20990 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
209a0 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
209b0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
209c0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
209d0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
209e0 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20    /* Processing 
209f0 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77  for aggregates w
20a00 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20  ith GROUP BY is 
20a10 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61  very different a
20a20 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d  nd.    ** much m
20a30 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e  ore complex than
20a40 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
20a50 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
20a60 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
20a70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
20a80 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
20a90 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
20aa0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
20ab0 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
20ac0 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
20ad0 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  j1;             
20ae0 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72  /* A-vs-B compar
20af0 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20  ision jump */.  
20b00 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70      int addrOutp
20b10 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74  utRow;  /* Start
20b20 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74   of subroutine t
20b30 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65  hat outputs a re
20b40 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
20b50 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52    int regOutputR
20b60 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ow;   /* Return 
20b70 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
20b80 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72   for output subr
20b90 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20  outine */.      
20ba0 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74  int addrSetAbort
20bb0 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61  ;   /* Set the a
20bc0 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65  bort flag and re
20bd0 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  turn */.      in
20be0 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b  t addrTopOfLoop;
20bf0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
20c00 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
20c10 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74      int addrSort
20c20 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f  ingIdx; /* The O
20c30 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
20c40 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  for the sorting 
20c50 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
20c60 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20  nt addrReset;   
20c70 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
20c80 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74   for resetting t
20c90 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a  he accumulator *
20ca0 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
20cb0 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  eset;       /* R
20cc0 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
20cd0 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74  gister for reset
20ce0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a   subroutine */..
20cf0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
20d00 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20  e is a GROUP BY 
20d10 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20  clause we might 
20d20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69  need a sorting i
20d30 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ndex to.      **
20d40 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20   implement it.  
20d50 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f  Allocate that so
20d60 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e  rting index now.
20d70 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75    If it turns ou
20d80 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
20d90 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69  we do not need i
20da0 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65  t after all, the
20db0 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
20dc0 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20  nstruction.     
20dd0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76   ** will be conv
20de0 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f  erted into a Noo
20df0 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  p.  .      */.  
20e00 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
20e10 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65  tingIdx = pParse
20e20 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
20e30 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
20e40 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
20e50 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29  Parse, pGroupBy)
20e60 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
20e70 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ingIdx = sqlite3
20e80 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
20e90 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
20ea0 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
20eb0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
20ec0 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
20ed0 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20  gColumn, .      
20ee0 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b      0, (char*)pK
20ef0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
20f00 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20  FO_HANDOFF);..  
20f10 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
20f20 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
20f30 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
20f40 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
20f50 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
20f60 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
20f70 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
20f80 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  m;.      iAbortF
20f90 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
20fa0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f  nMem;.      regO
20fb0 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61  utputRow = ++pPa
20fc0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
20fd0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
20fe0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
20ff0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
21000 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61  regReset = ++pPa
21010 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
21020 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
21030 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
21040 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65  l(v);.      iAMe
21050 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
21060 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
21070 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
21080 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
21090 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
210a0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
210b0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
210c0 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
210d0 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
210e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
210f0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41  P_Integer, 0, iA
21100 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
21110 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
21120 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c   "clear abort fl
21130 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
21140 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21150 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
21160 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
21170 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
21180 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75  , "indicate accu
21190 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29  mulator empty"))
211a0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
211b0 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
211c0 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
211d0 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
211e0 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
211f0 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
21200 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
21210 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
21220 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
21230 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
21240 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
21250 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
21260 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
21270 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
21280 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  ormation.      *
21290 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f  * in the right o
212a0 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69  rder to begin wi
212b0 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  th..      */.   
212c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
212d0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
212e0 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
212f0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57  Reset);.      pW
21300 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
21310 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
21320 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
21330 65 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30 2c  e, &pGroupBy, 0,
21340 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
21350 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
21360 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
21370 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d    if( pGroupBy==
21380 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
21390 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
213a0 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
213b0 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
213c0 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
213d0 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
213e0 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
213f0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
21400 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ral table will b
21410 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
21420 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63  celled later bec
21430 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65  ause we still ne
21440 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b  ed to use the pK
21450 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a  eyInfo.        *
21460 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f 75 70  /.        pGroup
21470 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
21480 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  ;.        groupB
21490 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  ySort = 0;.     
214a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
214b0 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69  /* Rows are comi
214c0 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65  ng out in undete
214d0 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57  rmined order.  W
214e0 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20  e have to push. 
214f0 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72         ** each r
21500 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ow into a sortin
21510 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61  g index, termina
21520 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f  te the first loo
21530 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  p,.        ** th
21540 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65  en loop over the
21550 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
21560 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
21570 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20  he output.      
21580 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f    ** in sorted o
21590 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a  rder.        */.
215a0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42          int regB
215b0 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ase;.        int
215c0 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20   regRecord;.    
215d0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
215e0 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70        int nGroup
215f0 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f  By;..        gro
21600 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20  upBySort = 1;.  
21610 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d        nGroupBy =
21620 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
21630 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d  ;.        nCol =
21640 20 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20   nGroupBy + 1;. 
21650 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
21660 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66  pBy+1;.        f
21670 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
21680 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
21690 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
216a0 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
216b0 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  .iSorterColumn>=
216c0 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
216d0 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   nCol++;.       
216e0 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
216f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
21700 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
21710 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
21720 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
21730 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
21740 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
21750 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
21760 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20  oupBy, regBase, 
21770 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
21780 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21790 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41   OP_Sequence, sA
217a0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
217b0 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f 75 70  x,regBase+nGroup
217c0 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  By);.        j =
217d0 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20   nGroupBy+1;.   
217e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
217f0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
21800 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
21810 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
21820 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41  _col *pCol = &sA
21830 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a  ggInfo.aCol[i];.
21840 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
21850 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
21860 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
21870 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b      int r1 = j +
21880 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
21890 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20        int r2;.. 
218a0 20 20 20 20 20 20 20 20 20 20 20 72 32 20 3d 20             r2 = 
218b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
218c0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
218d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218f0 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f   pCol->pTab, pCo
21900 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c  l->iColumn, pCol
21910 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20 30 29  ->iTable, r1, 0)
21920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21930 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20  ( r1!=r2 ){.    
21940 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21950 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21960 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29  P_SCopy, r2, r1)
21970 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
21980 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
21990 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
219a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
219b0 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
219c0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
219d0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
219e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
219f0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
21a00 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c  , regBase, nCol,
21a10 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
21a20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21a30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
21a40 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f  Insert, sAggInfo
21a50 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67  .sortingIdx, reg
21a60 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
21a70 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
21a80 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
21a90 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
21aa0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
21ab0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
21ac0 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  e, regBase, nCol
21ad0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21ae0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
21af0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
21b00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21b10 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e   OP_Sort, sAggIn
21b20 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
21b30 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  ddrEnd);.       
21b40 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
21b50 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22   "GROUP BY sort"
21b60 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  ));.        sAgg
21b70 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
21b80 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  dx = 1;.      }.
21b90 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61  .      /* Evalua
21ba0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  te the current G
21bb0 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e  ROUP BY terms an
21bc0 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62  d store in b0, b
21bd0 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, b2....      *
21be0 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20  * (b0 is memory 
21bf0 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30  location iBMem+0
21c00 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c  , b1 is iBMem+1,
21c10 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20   and so forth). 
21c20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d       ** Then com
21c30 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  pare the current
21c40 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
21c50 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55  against the GROU
21c60 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20  P BY terms.     
21c70 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65   ** from the pre
21c80 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e  vious row curren
21c90 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30  tly stored in a0
21ca0 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20  , a1, a2....    
21cb0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54    */.      addrT
21cc0 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  opOfLoop = sqlit
21cd0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
21ce0 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  r(v);.      for(
21cf0 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d  j=0; j<pGroupBy-
21d00 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
21d10 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
21d20 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
21d30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21d40 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
21d50 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  n, sAggInfo.sort
21d60 69 6e 67 49 64 78 2c 20 6a 2c 20 69 42 4d 65 6d  ingIdx, j, iBMem
21d70 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +j);.        }el
21d80 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41  se{.          sA
21d90 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64  ggInfo.directMod
21da0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
21db0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21dc0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
21dd0 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69  y->a[j].pExpr, i
21de0 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
21df0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
21e00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21e10 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
21e20 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20  , iAMem, iBMem, 
21e30 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
21e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21e50 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
21e60 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
21e70 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a  EYINFO);.      j
21e80 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
21e90 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
21ea0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21eb0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
21ec0 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31  p, j1+1, 0, j1+1
21ed0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
21ee0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
21ef0 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68  runs whenever th
21f00 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67  e GROUP BY chang
21f10 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61  es..      ** Cha
21f20 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55  nges in the GROU
21f30 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65  P BY are detecte
21f40 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
21f50 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20  s code.      ** 
21f60 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65  block.  If there
21f70 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73   were no changes
21f80 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  , this block is 
21f90 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  skipped..      *
21fa0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
21fb0 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72  code copies curr
21fc0 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72  ent group by ter
21fd0 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e  ms in b0,b1,b2,.
21fe0 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  ...      ** over
21ff0 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49   to a0,a1,a2.  I
22000 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65  t then calls the
22010 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
22020 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ne.      ** and 
22030 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65  resets the aggre
22040 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
22050 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72   registers in pr
22060 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20  eparation.      
22070 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ** for the next 
22080 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a  GROUP BY batch..
22090 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
220a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
220b0 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d  ve(pParse, iBMem
220c0 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iAMem, pGroupB
220d0 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  y->nExpr);.     
220e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
220f0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
22100 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
22110 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
22120 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22130 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20  (v, "output one 
22140 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71  row"));.      sq
22150 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22160 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62  v, OP_IfPos, iAb
22170 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64  ortFlag, addrEnd
22180 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
22190 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20  ment((v, "check 
221a0 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
221b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
221c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
221d0 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
221e0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
221f0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
22200 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74  "reset accumulat
22210 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
22220 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
22230 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
22240 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
22250 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
22260 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
22270 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
22280 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
22290 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
222a0 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
222b0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
222c0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
222d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
222e0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
222f0 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 1, iUseFlag);.
22300 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
22310 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
22320 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
22330 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
22340 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
22350 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
22360 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
22370 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22380 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22390 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e   OP_Next, sAggIn
223a0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
223b0 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20  ddrTopOfLoop);. 
223c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
223d0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
223e0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
223f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22400 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
22410 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20  addrSortingIdx, 
22420 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
22430 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65     /* Output the
22440 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65   final row of re
22450 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sult.      */.  
22460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22470 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
22480 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
22490 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
224a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
224b0 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66  nt((v, "output f
224c0 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20  inal row"));..  
224d0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72      /* Jump over
224e0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73   the subroutines
224f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22510 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
22520 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20   addrEnd);..    
22530 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
22540 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
22550 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65  outputs a single
22560 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
22570 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e  lt.      ** set.
22580 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e    This subroutin
22590 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74  e first looks at
225a0 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20   the iUseFlag.  
225b0 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20  If iUseFlag.    
225c0 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61    ** is less tha
225d0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
225e0 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ro, the subrouti
225f0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
22600 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  If.      ** the 
22610 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73  processing calls
22620 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74   for the query t
22630 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75  o abort, this su
22640 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
22650 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  * increments the
22660 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f   iAbortFlag memo
22670 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ry location befo
22680 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a  re returning in.
22690 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
226a0 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c  o signal the cal
226b0 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20  ler to abort..  
226c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
226d0 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69  rSetAbort = sqli
226e0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
226f0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
22700 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22710 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
22720 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
22730 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22740 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66  (v, "set abort f
22750 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
22760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
22770 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
22780 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
22790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
227a0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
227b0 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
227c0 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
227d0 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
227e0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
227f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22800 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
22810 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64  os, iUseFlag, ad
22820 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a  drOutputRow+2);.
22830 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
22840 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72  t((v, "Groupby r
22850 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20  esult generator 
22860 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a  entry point"));.
22870 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22880 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
22890 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
228a0 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  ow);.      final
228b0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
228c0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
228d0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  o);.      if( pH
228e0 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  aving ){.       
228f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
22900 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
22910 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  ing, addrOutputR
22920 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  ow+1, SQLITE_JUM
22930 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
22940 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  }.      selectIn
22950 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
22960 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
22970 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20   0, pOrderBy,.  
22980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22990 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20 70 44      distinct, pD
229a0 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
229b0 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f             addrO
229c0 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72  utputRow+1, addr
229d0 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20  SetAbort);.     
229e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
229f0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
22a00 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
22a10 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
22a20 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70  t((v, "end group
22a30 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
22a40 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
22a50 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
22a60 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
22a70 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75  l reset the grou
22a80 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72  p-by accumulator
22a90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22aa0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
22ab0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52  veLabel(v, addrR
22ac0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73  eset);.      res
22ad0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
22ae0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
22af0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22b00 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
22b10 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74  Return, regReset
22b20 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f  );.     .    } /
22b30 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79  * endif pGroupBy
22b40 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20   */.    else {. 
22b50 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
22b60 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  Del = 0;.#ifndef
22b70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
22b80 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61  EECOUNT.      Ta
22b90 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
22ba0 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53   if( (pTab = isS
22bb0 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73  impleCount(p, &s
22bc0 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a  AggInfo))!=0 ){.
22bd0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73          /* If is
22be0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65  SimpleCount() re
22bf0 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
22c00 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  to a Table struc
22c10 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  ture, then.     
22c20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74     ** the SQL st
22c30 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68  atement is of th
22c40 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20  e form:.        
22c50 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
22c60 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
22c70 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20  FROM <tbl>.     
22c80 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
22c90 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65   where the Table
22ca0 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
22cb0 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74  ned represents t
22cc0 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20  able <tbl>..    
22cd0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
22ce0 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
22cf0 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68   is so common th
22d00 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a  at it is optimiz
22d10 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68  ed specially. Th
22d20 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f  e.        ** OP_
22d30 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  Count instructio
22d40 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69  n is executed ei
22d50 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b  ther on the intk
22d60 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20  ey table that.  
22d70 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
22d80 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  s the data for t
22d90 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e  able <tbl> or on
22da0 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65   one of its inde
22db0 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20  xes. It.        
22dc0 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20  ** is better to 
22dd0 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f  execute the op o
22de0 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69  n an index, as i
22df0 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73  ndexes are almos
22e00 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  t.        ** alw
22e10 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73  ays spread acros
22e20 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  s less pages tha
22e30 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f  n their correspo
22e40 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20  nding tables..  
22e50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
22e60 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d   const int iDb =
22e70 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
22e80 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
22e90 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
22ea0 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
22eb0 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73  int iCsr = pPars
22ec0 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
22ed0 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e  * Cursor to scan
22ee0 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20   b-tree */.     
22ef0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f10 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
22f20 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
22f30 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
22f40 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20  *pKeyInfo = 0;  
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f60 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e  Keyinfo for scan
22f70 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ned index */.   
22f80 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73       Index *pBes
22f90 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
22fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73            /* Bes
22fb0 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f  t index found so
22fc0 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
22fd0 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62  int iRoot = pTab
22fe0 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  ->tnum;         
22ff0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
23000 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74  e of scanned b-t
23010 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ree */..        
23020 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
23030 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
23040 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
23050 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
23060 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
23070 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
23080 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20  >zName);..      
23090 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
230a0 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68  the index that h
230b0 61 73 20 74 68 65 20 6c 65 61 73 74 20 61 6d 6f  as the least amo
230c0 75 6e 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 2e 20  unt of columns. 
230d0 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  If.        ** th
230e0 65 72 65 20 69 73 20 73 75 63 68 20 61 6e 20 69  ere is such an i
230f0 6e 64 65 78 2c 20 61 6e 64 20 69 74 20 68 61 73  ndex, and it has
23100 20 6c 65 73 73 20 63 6f 6c 75 6d 6e 73 20 74 68   less columns th
23110 61 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  an the table.   
23120 20 20 20 20 20 2a 2a 20 64 6f 65 73 2c 20 74 68       ** does, th
23130 65 6e 20 77 65 20 63 61 6e 20 61 73 73 75 6d 65  en we can assume
23140 20 74 68 61 74 20 69 74 20 63 6f 6e 73 75 6d 65   that it consume
23150 73 20 6c 65 73 73 20 73 70 61 63 65 20 6f 6e 20  s less space on 
23160 64 69 73 6b 20 61 6e 64 0a 20 20 20 20 20 20 20  disk and.       
23170 20 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 66 6f   ** will therefo
23180 72 65 20 62 65 20 63 68 65 61 70 65 72 20 74 6f  re be cheaper to
23190 20 73 63 61 6e 20 74 6f 20 64 65 74 65 72 6d 69   scan to determi
231a0 6e 65 20 74 68 65 20 71 75 65 72 79 20 72 65 73  ne the query res
231b0 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ult..        ** 
231c0 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 65 74  In this case set
231d0 20 69 52 6f 6f 74 20 74 6f 20 74 68 65 20 72 6f   iRoot to the ro
231e0 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
231f0 66 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72  f the index b-tr
23200 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  ee.        ** an
23210 64 20 70 4b 65 79 49 6e 66 6f 20 74 6f 20 74 68  d pKeyInfo to th
23220 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
23230 75 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  ure required to 
23240 6e 61 76 69 67 61 74 65 20 74 68 65 0a 20 20 20  navigate the.   
23250 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20       ** index.. 
23260 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
23270 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65    ** In practice
23280 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
23290 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20  ucture will not 
232a0 62 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f  be used. It is o
232b0 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  nly .        ** 
232c0 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f  passed to keep O
232d0 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79  P_OpenRead happy
232e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
232f0 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
23300 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
23310 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
23320 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  xt){.          i
23330 66 28 20 21 70 42 65 73 74 20 7c 7c 20 70 49 64  f( !pBest || pId
23340 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 42 65 73 74  x->nColumn<pBest
23350 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
23360 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d           pBest =
23370 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20   pIdx;.         
23380 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
23390 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20 26       if( pBest &
233a0 26 20 70 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e  & pBest->nColumn
233b0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
233c0 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d           iRoot =
233d0 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20   pBest->tnum;.  
233e0 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
233f0 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
23400 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
23410 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Best);.        }
23420 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ..        /* Ope
23430 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  n a read-only cu
23440 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68  rsor, execute th
23450 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73  e OP_Count, clos
23460 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f  e the cursor. */
23470 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23480 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
23490 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c  _OpenRead, iCsr,
234a0 20 69 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20   iRoot, iDb);.  
234b0 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
234c0 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
234d0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
234e0 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
234f0 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f   *)pKeyInfo, P4_
23500 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
23510 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23520 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23530 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e  ddOp2(v, OP_Coun
23540 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66  t, iCsr, sAggInf
23550 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29  o.aFunc[0].iMem)
23560 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
23570 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
23580 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a  P_Close, iCsr);.
23590 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
235a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
235b0 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a  T_BTREECOUNT */.
235c0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
235d0 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
235e0 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20  query is of one 
235f0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
23600 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20   forms:.        
23610 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
23620 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52  SELECT min(x) FR
23630 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
23640 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78  *   SELECT max(x
23650 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
23660 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
23670 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
23680 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ask the code in 
23690 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d  where.c to attem
236a0 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c  pt to sort resul
236b0 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ts.        ** as
236c0 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   if there was an
236d0 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72   "ORDER ON x" or
236e0 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53   "ORDER ON x DES
236f0 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20  C" clause. .    
23700 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e      ** If where.
23710 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f  c is able to pro
23720 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72  duce results sor
23730 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65  ted in this orde
23740 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  r, then.        
23750 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65  ** add vdbe code
23760 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
23770 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
23780 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a  loop after the .
23790 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
237a0 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63   iteration (sinc
237b0 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  e the first iter
237c0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
237d0 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  p is .        **
237e0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f   guaranteed to o
237f0 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f  perate on the ro
23800 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d  w with the minim
23810 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20  um or maximum . 
23820 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
23830 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72  of x, the only r
23840 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20  ow required)..  
23850 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
23860 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c   ** A special fl
23870 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65  ag must be passe
23880 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
23890 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67  eBegin() to slig
238a0 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  htly.        ** 
238b0 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 75 72  modify behaviour
238c0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
238d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
238e0 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75  **   + If the qu
238f0 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54  ery is a "SELECT
23900 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74   min(x)", then t
23910 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79  he loop coded by
23920 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
23930 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e  where.c should n
23940 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ot iterate over 
23950 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20  any values with 
23960 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20  a NULL value.   
23970 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20       **     for 
23980 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
23990 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65        **   + The
239a0 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20   optimizer code 
239b0 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20  in where.c (the 
239c0 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64  thing that decid
239d0 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  es which.       
239e0 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72   **     index or
239f0 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29   indices to use)
23a00 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20   should place a 
23a10 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69  different priori
23a20 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ty on .        *
23a30 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67  *     satisfying
23a40 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20   the 'ORDER BY' 
23a50 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64  clause than it d
23a60 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73  oes in other cas
23a70 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  es..        **  
23a80 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65     Refer to code
23a90 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   and comments in
23aa0 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74   where.c for det
23ab0 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ails..        */
23ac0 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
23ad0 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a  t *pMinMax = 0;.
23ae0 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20          u8 flag 
23af0 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 70 29  = minMaxQuery(p)
23b00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c  ;.        if( fl
23b10 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
23b20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
23b30 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 45 4c 69  Property(p->pELi
23b40 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
23b50 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
23b60 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d  .          pMinM
23b70 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ax = sqlite3Expr
23b80 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
23b90 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
23ba0 72 2d 3e 78 2e 70 4c 69 73 74 2c 30 29 3b 0a 20  r->x.pList,0);. 
23bb0 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20           pDel = 
23bc0 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20  pMinMax;.       
23bd0 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26     if( pMinMax &
23be0 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
23bf0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
23c00 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
23c10 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61  .sortOrder = fla
23c20 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g!=WHERE_ORDERBY
23c30 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20  _MIN ?1:0;.     
23c40 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
23c50 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d  a[0].pExpr->op =
23c60 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
23c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23c80 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
23c90 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
23ca0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
23cb0 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
23cc0 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
23cd0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
23ce0 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c  ng is much simpl
23cf0 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  er since there i
23d00 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
23d10 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  row.        ** o
23d20 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  f output..      
23d30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73    */.        res
23d40 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
23d50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
23d60 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
23d70 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
23d80 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
23d90 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26  bList, pWhere, &
23da0 70 4d 69 6e 4d 61 78 2c 20 66 6c 61 67 2c 20 30  pMinMax, flag, 0
23db0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
23dc0 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  WInfo==0 ){.    
23dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23de0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
23df0 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  pDel);.         
23e00 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
23e10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23e20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
23e30 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
23e40 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
23e50 20 20 69 66 28 20 21 70 4d 69 6e 4d 61 78 20 26    if( !pMinMax &
23e60 26 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  & flag ){.      
23e70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23e80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
23e90 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  , 0, pWInfo->iBr
23ea0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eak);.          
23eb0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
23ec0 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c  "%s() by index",
23ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23ee0 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52   (flag==WHERE_OR
23ef0 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a  DERBY_MIN?"min":
23f00 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20  "max")));.      
23f10 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
23f20 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
23f30 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e  fo);.        fin
23f40 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
23f50 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
23f60 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  nfo);.      }.. 
23f70 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
23f80 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 61  0;.      if( pHa
23f90 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ving ){.        
23fa0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
23fb0 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
23fc0 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c  ng, addrEnd, SQL
23fd0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
23fe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
23ff0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
24000 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
24010 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  ist, 0, 0, 0, -1
24020 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
24030 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c 20           pDest, 
24040 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64  addrEnd, addrEnd
24050 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24060 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
24070 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a  b, pDel);.    }.
24080 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
24090 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
240a0 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20  ddrEnd);.    .  
240b0 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65  } /* endif aggre
240c0 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20  gate query */.. 
240d0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
240e0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
240f0 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64  se, then we need
24100 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73   to sort the res
24110 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65  ults.  ** and se
24120 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63  nd them to the c
24130 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f  allback one by o
24140 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ne..  */.  if( p
24150 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67  OrderBy ){.    g
24160 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
24170 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45  pParse, p, v, pE
24180 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65  List->nExpr, pDe
24190 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  st);.  }..  /* J
241a0 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
241b0 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f   this query.  */
241c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
241d0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45  solveLabel(v, iE
241e0 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  nd);..  /* The S
241f0 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73  ELECT was succes
24200 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20  sfully coded.   
24210 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  Set the return c
24220 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f  ode to 0.  ** to
24230 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72   indicate no err
24240 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ors..  */.  rc =
24250 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f   0;..  /* Contro
24260 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20  l jumps to here 
24270 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
24280 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65  ncountered above
24290 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73  , or upon.  ** s
242a0 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67  uccessful coding
242b0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
242c0 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a    */.select_end:
242d0 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
242e0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
242f0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53  results of the S
24300 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65 20  ELECT are to be 
24310 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  output..  */.  i
24320 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24330 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74   && pDest->eDest
24340 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
24350 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
24360 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
24370 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
24380 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
24390 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
243a0 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71  Info.aCol);.  sq
243b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
243c0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b  sAggInfo.aFunc);
243d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
243e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
243f0 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
24400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 2a  *************.**
24450 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
24460 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ode is used for 
24470 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
24480 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65  gging only.  The
24490 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66 6f   code.** that fo
244a0 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61  llows does not a
244b0 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20  ppear in normal 
244c0 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  builds..**.** Th
244d0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
244e0 20 75 73 65 64 20 74 6f 20 70 72 69 6e 74 20 6f   used to print o
244f0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ut the content o
24500 66 20 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f 66  f all or part of
24510 20 61 20 0a 2a 2a 20 70 61 72 73 65 20 73 74 72   a .** parse str
24520 75 63 74 75 72 65 73 20 73 75 63 68 20 61 73 20  uctures such as 
24530 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72 2e 20  Select or Expr. 
24540 20 53 75 63 68 20 70 72 69 6e 74 6f 75 74 73 20   Such printouts 
24550 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f  are useful.** fo
24560 72 20 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e 64  r helping to und
24570 65 72 73 74 61 6e 64 20 77 68 61 74 20 69 73 20  erstand what is 
24580 68 61 70 70 65 6e 69 6e 67 20 69 6e 73 69 64 65  happening inside
24590 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
245a0 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68  tor.** during th
245b0 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63  e execution of c
245c0 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54 20 73 74  omplex SELECT st
245d0 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
245e0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20 61 72  These routine ar
245f0 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e 79  e not called any
24600 77 68 65 72 65 20 66 72 6f 6d 20 77 69 74 68 69  where from withi
24610 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20  n the normal.** 
24620 63 6f 64 65 20 62 61 73 65 2e 20 20 54 68 65 6e  code base.  Then
24630 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74 6f   are intended to
24640 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
24650 77 69 74 68 69 6e 20 74 68 65 20 64 65 62 75 67  within the debug
24660 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20 74  ger.** or from t
24670 65 6d 70 6f 72 61 72 79 20 22 70 72 69 6e 74 66  emporary "printf
24680 22 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  " statements ins
24690 65 72 74 65 64 20 66 6f 72 20 64 65 62 75 67 67  erted for debugg
246a0 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ing..*/.void sql
246b0 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 45 78  ite3PrintExpr(Ex
246c0 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  pr *p){.  if( p-
246d0 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d 3e 74  >token.z && p->t
246e0 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20 20 20  oken.n>0 ){.    
246f0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24700 74 66 28 22 28 25 2e 2a 73 22 2c 20 70 2d 3e 74  tf("(%.*s", p->t
24710 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b 65 6e  oken.n, p->token
24720 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  .z);.  }else{.  
24730 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24740 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f  intf("(%d", p->o
24750 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  p);.  }.  if( p-
24760 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 73 71  >pLeft ){.    sq
24770 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24780 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  (" ");.    sqlit
24790 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70  e3PrintExpr(p->p
247a0 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Left);.  }.  if(
247b0 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20   p->pRight ){.  
247c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
247d0 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73  intf(" ");.    s
247e0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
247f0 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  p->pRight);.  }.
24800 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24810 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69  intf(")");.}.voi
24820 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78  d sqlite3PrintEx
24830 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
24840 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
24850 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
24860 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
24870 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  ){.    sqlite3Pr
24880 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61  intExpr(pList->a
24890 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
248a0 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  if( i<pList->nEx
248b0 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  pr-1 ){.      sq
248c0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
248d0 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20  (", ");.    }.  
248e0 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
248f0 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c 65  PrintSelect(Sele
24900 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e  ct *p, int inden
24910 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t){.  sqlite3Deb
24920 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53 45 4c  ugPrintf("%*sSEL
24930 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64 65 6e  ECT(%p) ", inden
24940 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c  t, "", p);.  sql
24950 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
24960 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  t(p->pEList);.  
24970 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24980 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20  tf("\n");.  if( 
24990 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 63  p->pSrc ){.    c
249a0 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20  har *zPrefix;.  
249b0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72    int i;.    zPr
249c0 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20  efix = "FROM";. 
249d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
249e0 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
249f0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
24a00 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
24a10 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
24a20 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
24a30 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24a40 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c  %*s ", indent+6,
24a50 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20   zPrefix);.     
24a60 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a 20   zPrefix = "";. 
24a70 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
24a80 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
24a90 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24aa0 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20  rintf("(\n");.  
24ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 69        sqlite3Pri
24ac0 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e  ntSelect(pItem->
24ad0 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b  pSelect, indent+
24ae0 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  10);.        sql
24af0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24b00 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38  "%*s)", indent+8
24b10 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , "");.      }el
24b20 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e  se if( pItem->zN
24b30 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
24b40 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24b50 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  f("%s", pItem->z
24b60 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
24b70 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
24b80 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
24b90 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24ba0 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73 29 22  tf("(table: %s)"
24bb0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
24bc0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
24bd0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
24be0 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
24bf0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24c00 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c 20 70  intf(" AS %s", p
24c10 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
24c20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
24c30 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
24c40 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  -1 ){.        sq
24c50 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24c60 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (",");.      }. 
24c70 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24c80 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
24c90 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
24ca0 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
24cb0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24cc0 74 66 28 22 25 2a 73 20 57 48 45 52 45 20 22 2c  tf("%*s WHERE ",
24cd0 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
24ce0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
24cf0 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pr(p->pWhere);. 
24d00 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24d10 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
24d20 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70  .  if( p->pGroup
24d30 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
24d40 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
24d50 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20 69 6e  s GROUP BY ", in
24d60 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
24d70 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
24d80 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 29  ist(p->pGroupBy)
24d90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
24da0 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
24db0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61    }.  if( p->pHa
24dc0 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  ving ){.    sqli
24dd0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24de0 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20 69 6e  %*s HAVING ", in
24df0 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
24e00 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
24e10 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
24e20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24e30 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
24e40 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
24e50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
24e60 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
24e70 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e 64 65  ORDER BY ", inde
24e80 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
24e90 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
24ea0 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  t(p->pOrderBy);.
24eb0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24ec0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
24ed0 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68  }.}./* End of th
24ee0 65 20 73 74 72 75 63 74 75 72 65 20 64 65 62 75  e structure debu
24ef0 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a  g printing code.
24f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 23  *************/.#
24f50 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
24f60 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
24f70 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
24f80 44 45 42 55 47 29 20 2a 2f 0a                    DEBUG) */.