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

Artifact 84022ec5d41c321e98fa96e4f4d5e44de203a099:


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 31 31  select.c,v 1.511
0200: 20 32 30 30 39 2f 30 35 2f 30 31 20 32 31 3a 31   2009/05/01 21:1
0210: 33 3a 33 37 20 64 72 68 20 45 78 70 20 24 0a 2a  3:37 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 20 20 70 2d 3e 71 75 6f 74 65 64 20 3d 20 30  .  p->quoted = 0
1540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1550: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
1560: 6e 6f 64 65 20 66 6f 72 20 61 6e 20 69 64 65 6e  node for an iden
1570: 74 69 66 69 65 72 20 77 69 74 68 20 74 68 65 20  tifier with the 
1580: 6e 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f  name of zName.*/
1590: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 43 72  .Expr *sqlite3Cr
15a0: 65 61 74 65 49 64 45 78 70 72 28 50 61 72 73 65  eateIdExpr(Parse
15b0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
15c0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
15d0: 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 73  Token dummy;.  s
15e0: 65 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20  etToken(&dummy, 
15f0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
1600: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
1610: 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20  arse, TK_ID, 0, 
1620: 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 2f  0, &dummy);.}../
1630: 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20  *.** Add a term 
1640: 74 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70  to the WHERE exp
1650: 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78  ression in *ppEx
1660: 70 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  pr that requires
1670: 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c   the.** zCol col
1680: 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20  umn to be equal 
1690: 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  in the two table
16a0: 73 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62  s pTab1 and pTab
16b0: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
16c0: 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a  d addWhereTerm(.
16d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
16e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
16f0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1700: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1710: 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Col,        /* N
1720: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
1730: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62  n */.  const Tab
1740: 6c 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20  le *pTab1,      
1750: 2f 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a  /* First table *
1760: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1770: 7a 41 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a 20  zAlias1,     /* 
1780: 41 6c 69 61 73 20 66 6f 72 20 66 69 72 73 74 20  Alias for first 
1790: 74 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e  table.  May be N
17a0: 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  ULL */.  const T
17b0: 61 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20  able *pTab2,    
17c0: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c    /* Second tabl
17d0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
17e0: 72 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20 20  r *zAlias2,     
17f0: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 73 65 63  /* Alias for sec
1800: 6f 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61 79 20  ond table.  May 
1810: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
1820: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
1830: 2c 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75  ,     /* VDBE cu
1840: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 72 69 67  rsor for the rig
1850: 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ht table */.  Ex
1860: 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20  pr **ppExpr,    
1870: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1880: 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
1890: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
18a0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75  on */.  int isOu
18b0: 74 65 72 4a 6f 69 6e 20 20 20 20 20 20 20 20 20  terJoin         
18c0: 20 2f 2a 20 54 72 75 65 20 69 66 20 64 65 61 6c   /* True if deal
18d0: 69 6e 67 20 77 69 74 68 20 61 6e 20 4f 55 54 45  ing with an OUTE
18e0: 52 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 45  R join */.){.  E
18f0: 78 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62  xpr *pE1a, *pE1b
1900: 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20  , *pE1c;.  Expr 
1910: 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70  *pE2a, *pE2b, *p
1920: 45 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b  E2c;.  Expr *pE;
1930: 0a 0a 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74  ..  pE1a = sqlit
1940: 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70  e3CreateIdExpr(p
1950: 50 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20  Parse, zCol);.  
1960: 70 45 32 61 20 3d 20 73 71 6c 69 74 65 33 43 72  pE2a = sqlite3Cr
1970: 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73  eateIdExpr(pPars
1980: 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20  e, zCol);.  if( 
1990: 7a 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20  zAlias1==0 ){.  
19a0: 20 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61 62    zAlias1 = pTab
19b0: 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20  1->zName;.  }.  
19c0: 70 45 31 62 20 3d 20 73 71 6c 69 74 65 33 43 72  pE1b = sqlite3Cr
19d0: 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73  eateIdExpr(pPars
19e0: 65 2c 20 7a 41 6c 69 61 73 31 29 3b 0a 20 20 69  e, zAlias1);.  i
19f0: 66 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29 7b  f( zAlias2==0 ){
1a00: 0a 20 20 20 20 7a 41 6c 69 61 73 32 20 3d 20 70  .    zAlias2 = p
1a10: 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d  Tab2->zName;.  }
1a20: 0a 20 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65  .  pE2b = sqlite
1a30: 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50  3CreateIdExpr(pP
1a40: 61 72 73 65 2c 20 7a 41 6c 69 61 73 32 29 3b 0a  arse, zAlias2);.
1a50: 20 20 70 45 31 63 20 3d 20 73 71 6c 69 74 65 33    pE1c = sqlite3
1a60: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
1a70: 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61  _DOT, pE1b, pE1a
1a80: 2c 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73  , 0);.  pE2c = s
1a90: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1aa0: 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 32 62  se, TK_DOT, pE2b
1ab0: 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45  , pE2a, 0);.  pE
1ac0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1ad0: 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70  pParse, TK_EQ, p
1ae0: 45 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20  E1c, pE2c, 0);. 
1af0: 20 69 66 28 20 70 45 20 26 26 20 69 73 4f 75 74   if( pE && isOut
1b00: 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78  erJoin ){.    Ex
1b10: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
1b20: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
1b30: 20 20 20 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f      pE->iRightJo
1b40: 69 6e 54 61 62 6c 65 20 3d 20 69 52 69 67 68 74  inTable = iRight
1b50: 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  JoinTable;.  }. 
1b60: 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74   *ppExpr = sqlit
1b70: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
1b80: 2d 3e 64 62 2c 2a 70 70 45 78 70 72 2c 20 70 45  ->db,*ppExpr, pE
1b90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
1ba0: 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
1bb0: 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20  property on all 
1bc0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76  terms of the giv
1bd0: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  en expression..*
1be0: 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78  * And set the Ex
1bf0: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
1c00: 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72  le to iTable for
1c10: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
1c20: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
1c30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46  ..**.** The EP_F
1c40: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
1c50: 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d   is used on term
1c60: 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  s of an expressi
1c70: 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68  on to tell.** th
1c80: 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  e LEFT OUTER JOI
1c90: 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  N processing log
1ca0: 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72  ic that this ter
1cb0: 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  m is part of the
1cc0: 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63  .** join restric
1cd0: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69  tion specified i
1ce0: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
1cf0: 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74  G clause and not
1d00: 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68   a part.** of th
1d10: 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57  e more general W
1d20: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68  HERE clause.  Th
1d30: 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f  ese terms are mo
1d40: 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a  ved over to the.
1d50: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
1d60: 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63  during join proc
1d70: 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65  essing but we ne
1d80: 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
1d90: 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67  hat they.** orig
1da0: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
1db0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
1dc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72  ..**.** The Expr
1dd0: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
1de0: 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45   tells the WHERE
1df0: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
1e00: 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65  ng that the.** e
1e10: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64  xpression depend
1e20: 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68  s on table iRigh
1e30: 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20  tJoinTable even 
1e40: 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73  if that table is
1e50: 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74   not.** explicit
1e60: 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  ly mentioned in 
1e70: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
1e80: 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   That informatio
1e90: 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66  n is needed.** f
1ea0: 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68  or cases like th
1eb0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
1ec0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
1ed0: 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
1ee0: 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78  .a=t2.b AND t1.x
1ef0: 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65  =5.**.** The whe
1f00: 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  re clause needs 
1f10: 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  to defer the han
1f20: 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e  dling of the t1.
1f30: 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69  x=5.** term unti
1f40: 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c  l after the t2 l
1f50: 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  oop of the join.
1f60: 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61    In that way, a
1f70: 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20  .** NULL t2 row 
1f80: 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
1f90: 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d   whenever t1.x!=
1fa0: 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  5.  If we do not
1fb0: 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61  .** defer the ha
1fc0: 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35  ndling of t1.x=5
1fd0: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f  , it will be pro
1fe0: 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65  cessed immediate
1ff0: 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20  ly.** after the 
2000: 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73  t1 loop and rows
2010: 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69   with t1.x!=5 wi
2020: 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20  ll never appear 
2030: 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  in.** the output
2040: 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72  , which is incor
2050: 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
2060: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
2070: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54  (Expr *p, int iT
2080: 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20  able){.  while( 
2090: 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  p ){.    ExprSet
20a0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
20b0: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d  romJoin);.    p-
20c0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
20d0: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 73   = iTable;.    s
20e0: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c  etJoinExpr(p->pL
20f0: 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  eft, iTable);.  
2100: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
2110: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  .  } .}../*.** T
2120: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63  his routine proc
2130: 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69  esses the join i
2140: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
2150: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2160: 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49  t..** ON and USI
2170: 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63  NG clauses are c
2180: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78  onverted into ex
2190: 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tra terms of the
21a0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
21b0: 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20  * NATURAL joins 
21c0: 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72  also create extr
21d0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
21e0: 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  erms..**.** The 
21f0: 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20  terms of a FROM 
2200: 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61  clause are conta
2210: 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65  ined in the Sele
2220: 63 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72  ct.pSrc structur
2230: 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d  e..** The left m
2240: 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65  ost table is the
2250: 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
2260: 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68  Select.pSrc.  Th
2270: 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20  e right-most.** 
2280: 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73  table is the las
2290: 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f  t entry.  The jo
22a0: 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68  in operator is h
22b0: 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79  eld in the entry
22c0: 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e   to.** the left.
22d0: 20 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63    Thus entry 0 c
22e0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e  ontains the join
22f0: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68   operator for th
2300: 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a  e join between.*
2310: 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20  * entries 0 and 
2320: 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53  1.  Any ON or US
2330: 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f  ING clauses asso
2340: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2350: 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f  join are.** also
2360: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
2370: 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a   left entry..**.
2380: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2390: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
23a0: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
23b0: 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61  ountered..*/.sta
23c0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72  tic int sqlitePr
23d0: 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20  ocessJoin(Parse 
23e0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
23f0: 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  *p){.  SrcList *
2400: 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  pSrc;           
2410: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61         /* All ta
2420: 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
2430: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
2440: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2460: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
2470: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2480: 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20  t_item *pLeft;  
2490: 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65     /* Left table
24a0: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
24b0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
24c0: 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20  t_item *pRight; 
24d0: 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c     /* Right tabl
24e0: 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a  e being joined *
24f0: 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  /..  pSrc = p->p
2500: 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26  Src;.  pLeft = &
2510: 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52  pSrc->a[0];.  pR
2520: 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d  ight = &pLeft[1]
2530: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2540: 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b  Src->nSrc-1; i++
2550: 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66  , pRight++, pLef
2560: 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  t++){.    Table 
2570: 2a 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66  *pLeftTab = pLef
2580: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62  t->pTab;.    Tab
2590: 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20  le *pRightTab = 
25a0: 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20  pRight->pTab;.  
25b0: 20 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a    int isOuter;..
25c0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c      if( NEVER(pL
25d0: 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69  eftTab==0 || pRi
25e0: 67 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e  ghtTab==0) ) con
25f0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74  tinue;.    isOut
2600: 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 6a 6f  er = (pRight->jo
2610: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
2620: 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57  R)!=0;..    /* W
2630: 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20  hen the NATURAL 
2640: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
2650: 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c  nt, add WHERE cl
2660: 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20  ause terms for. 
2670: 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75     ** every colu
2680: 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  mn that the two 
2690: 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63  tables have in c
26a0: 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ommon..    */.  
26b0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f    if( pRight->jo
26c0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
26d0: 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RAL ){.      if(
26e0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20   pRight->pOn || 
26f0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
2700: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2710: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2720: 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  , "a NATURAL joi
2730: 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22  n may not have "
2740: 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20  .           "an 
2750: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2760: 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  se", 0);.       
2770: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2780: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
2790: 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43  ; j<pLeftTab->nC
27a0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
27b0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
27c0: 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a  pLeftTab->aCol[j
27d0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
27e0: 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   if( columnIndex
27f0: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
2800: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
2810: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
2820: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70  pParse, zName, p
2830: 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e  LeftTab, pLeft->
2840: 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20  zAlias, .       
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2860: 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61 62         pRightTab
2870: 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73  , pRight->zAlias
2880: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c  pRight->iCursor,
28b0: 20 26 70 2d 3e 70 57 68 65 72 65 2c 20 69 73 4f   &p->pWhere, isO
28c0: 75 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  uter);.         
28d0: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
28e0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
28f0: 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20  * Disallow both 
2900: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
2910: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
2920: 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20   join.    */.   
2930: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e   if( pRight->pOn
2940: 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69   && pRight->pUsi
2950: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
2960: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2970: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65  se, "cannot have
2980: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
2990: 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c  NG ".        "cl
29a0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
29b0: 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20  e join");.      
29c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
29d0: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
29e0: 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ON clause to the
29f0: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
2a00: 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63  E clause, connec
2a10: 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e  ted by.    ** an
2a20: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
2a30: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
2a40: 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20  ight->pOn ){.   
2a50: 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20 29     if( isOuter )
2a60: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69   setJoinExpr(pRi
2a70: 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74  ght->pOn, pRight
2a80: 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2a90: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
2aa0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
2ab0: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65  rse->db, p->pWhe
2ac0: 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29  re, pRight->pOn)
2ad0: 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e  ;.      pRight->
2ae0: 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  pOn = 0;.    }..
2af0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78      /* Create ex
2b00: 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  tra terms on the
2b10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
2b20: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61  r each column na
2b30: 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  med.    ** in th
2b40: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20  e USING clause. 
2b50: 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65   Example: If the
2b60: 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62   two tables to b
2b70: 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20  e joined are .  
2b80: 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64    ** A and B and
2b90: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
2ba0: 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e  e names X, Y, an
2bb0: 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68  d Z, then add th
2bc0: 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  is.    ** to the
2bd0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20   WHERE clause:  
2be0: 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e    A.X=B.X AND A.
2bf0: 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e  Y=B.Y AND A.Z=B.
2c00: 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20  Z.    ** Report 
2c10: 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
2c20: 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64  column mentioned
2c30: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
2c40: 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e  ause is.    ** n
2c50: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
2c60: 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62  both tables to b
2c70: 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f  e joined..    */
2c80: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
2c90: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
2ca0: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d   IdList *pList =
2cb0: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b   pRight->pUsing;
2cc0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
2cd0: 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b  j<pList->nId; j+
2ce0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
2cf0: 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d   *zName = pList-
2d00: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
2d10: 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49       if( columnI
2d20: 6e 64 65 78 28 70 4c 65 66 74 54 61 62 2c 20 7a  ndex(pLeftTab, z
2d30: 4e 61 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d  Name)<0 || colum
2d40: 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62  nIndex(pRightTab
2d50: 2c 20 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20  , zName)<0 ){.  
2d60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2d70: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2d80: 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69  "cannot join usi
2d90: 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63  ng column %s - c
2da0: 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20  olumn ".        
2db0: 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74      "not present
2dc0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22   in both tables"
2dd0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
2de0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e00: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61  addWhereTerm(pPa
2e10: 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65 66  rse, zName, pLef
2e20: 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c  tTab, pLeft->zAl
2e30: 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ias, .          
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 20 70 52 69 67 68 74 54 61 62 2c 20 70 52 69    pRightTab, pRi
2e60: 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20  ght->zAlias,.   
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d           pRight-
2e90: 3e 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57  >iCursor, &p->pW
2ea0: 68 65 72 65 2c 20 69 73 4f 75 74 65 72 29 3b 0a  here, isOuter);.
2eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ec0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2ed0: 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f  ./*.** Insert co
2ee0: 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74  de into "v" that
2ef0: 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72   will push the r
2f00: 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f 70  ecord on the top
2f10: 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b   of the.** stack
2f20: 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
2f30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f40: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
2f50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2f60: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
2f70: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
2f80: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2f90: 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy,    /* The O
2fa0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
2fb0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
2fc0: 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ect,       /* Th
2fd0: 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73  e whole SELECT s
2fe0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
2ff0: 74 20 72 65 67 44 61 74 61 20 20 20 20 20 20 20  t regData       
3000: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
3010: 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f   holding data to
3020: 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29 7b   be sorted */.){
3030: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
3040: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
3050: 74 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65 72  t nExpr = pOrder
3060: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e 74  By->nExpr;.  int
3070: 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
3080: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
3090: 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b  Parse, nExpr+2);
30a0: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
30b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
30c0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
30d0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
30e0: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
30f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
3100: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
3110: 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61   pOrderBy, regBa
3120: 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  se, 0);.  sqlite
3130: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3140: 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64  P_Sequence, pOrd
3150: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
3160: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a  regBase+nExpr);.
3170: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3180: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
3190: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
31a0: 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71  Expr+1, 1);.  sq
31b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
31c0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
31d0: 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72  , regBase, nExpr
31e0: 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29   + 2, regRecord)
31f0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3200: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
3210: 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79 2d  nsert, pOrderBy-
3220: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65  >iECursor, regRe
3230: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
3240: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
3250: 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
3260: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
3270: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
3280: 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45  rse, regBase, nE
3290: 78 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53  xpr+2);.  if( pS
32a0: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b  elect->iLimit ){
32b0: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20  .    int addr1, 
32c0: 61 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69  addr2;.    int i
32d0: 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70  Limit;.    if( p
32e0: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20  Select->iOffset 
32f0: 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20  ){.      iLimit 
3300: 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  = pSelect->iOffs
3310: 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  et+1;.    }else{
3320: 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  .      iLimit = 
3330: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b  pSelect->iLimit;
3340: 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31  .    }.    addr1
3350: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3360: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp1(v, OP_IfZer
3370: 6f 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  o, iLimit);.    
3380: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3390: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
33a0: 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20  iLimit, -1);.   
33b0: 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
33c0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
33d0: 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69  _Goto);.    sqli
33e0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
33f0: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
3400: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
3410: 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72  (v, OP_Last, pOr
3420: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29  derBy->iECursor)
3430: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3440: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
3450: 6c 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  lete, pOrderBy->
3460: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  iECursor);.    s
3470: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
3480: 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20  re(v, addr2);.  
3490: 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69    pSelect->iLimi
34a0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 0;.  }.}../*
34b0: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20  .** Add code to 
34c0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46  implement the OF
34d0: 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76  FSET.*/.static v
34e0: 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a  oid codeOffset(.
34f0: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
3500: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
3510: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
3520: 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  M */.  Select *p
3530: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
3540: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3550: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
3560: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20    int iContinue 
3570: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
3580: 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72   to skip the cur
3590: 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29  rent record */.)
35a0: 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73  {.  if( p->iOffs
35b0: 65 74 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21  et && iContinue!
35c0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  =0 ){.    int ad
35d0: 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dr;.    sqlite3V
35e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
35f0: 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66 73  AddImm, p->iOffs
3600: 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64  et, -1);.    add
3610: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
3620: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65  ddOp1(v, OP_IfNe
3630: 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a  g, p->iOffset);.
3640: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3650: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
3660: 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , 0, iContinue);
3670: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
3680: 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45  ((v, "skip OFFSE
3690: 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20  T records"));.  
36a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
36b0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
36c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
36d0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
36e0: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  check to make su
36f0: 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65  re the N registe
3700: 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69  rs starting at i
3710: 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69  Mem.** form a di
3720: 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69  stinct entry.  i
3730: 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67  Tab is a sorting
3740: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
3750: 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
3760: 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  seen combination
3770: 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65  s of the N value
3780: 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  s.  A new entry 
3790: 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a  is made in iTab.
37a0: 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ** if the curren
37b0: 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e  t N values are n
37c0: 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70  ew..**.** A jump
37d0: 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69   to addrRepeat i
37e0: 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e  s made and the N
37f0: 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f  +1 values are po
3800: 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  pped from the.**
3810: 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f   stack if the to
3820: 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  p N elements are
3830: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a   not distinct..*
3840: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
3850: 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61  deDistinct(.  Pa
3860: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3870: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
3880: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
3890: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
38a0: 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20   iTab,          
38b0: 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64  /* A sorting ind
38c0: 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  ex used to test 
38d0: 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73  for distinctness
38e0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65   */.  int addrRe
38f0: 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70  peat,    /* Jump
3900: 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20   to here if not 
3910: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e  distinct */.  in
3920: 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
3930: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
3940: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
3950: 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f  iMem           /
3960: 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  * First element 
3970: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  */.){.  Vdbe *v;
3980: 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20  .  int r1;..  v 
3990: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
39a0: 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  .  r1 = sqlite3G
39b0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
39c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
39d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
39e0: 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e  eRecord, iMem, N
39f0: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
3a00: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
3a10: 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64  _Found, iTab, ad
3a20: 64 72 52 65 70 65 61 74 2c 20 72 31 29 3b 0a 20  drRepeat, r1);. 
3a30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3a40: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
3a50: 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20  rt, iTab, r1);. 
3a60: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
3a70: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
3a80: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  1);.}../*.** Gen
3a90: 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  erate an error m
3aa0: 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45  essage when a SE
3ab0: 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74  LECT is used wit
3ac0: 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73  hin a subexpress
3ad0: 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a  ion.** (example:
3ae0: 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20    "a IN (SELECT 
3af0: 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20  * FROM table)") 
3b00: 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20  but it has more 
3b10: 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a  than 1 result.**
3b20: 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20   column.  We do 
3b30: 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75  this in a subrou
3b40: 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65  tine because the
3b50: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
3b60: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c 61   multiple.** pla
3b70: 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ces..*/.static i
3b80: 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  nt checkForMulti
3b90: 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
3ba0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
3bb0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
3bc0: 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20  se context. */. 
3bd0: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
3be0: 73 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  st,   /* Destina
3bf0: 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72  tion of SELECT r
3c00: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
3c10: 6e 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  nExpr           
3c20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
3c30: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74  sult columns ret
3c40: 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20  urned by SELECT 
3c50: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73  */.){.  int eDes
3c60: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
3c70: 3b 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20  ;.  if( nExpr>1 
3c80: 26 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d  && (eDest==SRT_M
3c90: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
3ca0: 5f 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  _Set) ){.    sql
3cb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3cc0: 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e  rse, "only a sin
3cd0: 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
3ce0: 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20  ed for ".       
3cf0: 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  "a SELECT that i
3d00: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
3d10: 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72  ression");.    r
3d20: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65  eturn 1;.  }else
3d30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
3d40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
3d50: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
3d60: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
3d70: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
3d80: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
3d90: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
3da0: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e  .** If srcTab an
3db0: 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f  d nColumn are bo
3dc0: 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  th zero, then th
3dd0: 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  e pEList express
3de0: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
3df0: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
3e00: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
3e10: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
3e20: 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68   nColumn>0.** th
3e30: 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65  en data is pulle
3e40: 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e  d from srcTab an
3e50: 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  d pEList is used
3e60: 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65   only to get the
3e70: 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f  .** datatypes fo
3e80: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
3e90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
3ea0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
3eb0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3ed0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
3ee0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3f00: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
3f10: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
3f20: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
3f30: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
3f40: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3f50: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
3f60: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
3f70: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
3f80: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
3f90: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
3fa0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
3fb0: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
3fc0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
3fd0: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
3fe0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
3ff0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
4000: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
4010: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
4020: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
4030: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
4040: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
4050: 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75   If >=0, make su
4060: 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  re results are d
4070: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 53 65 6c  istinct */.  Sel
4080: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
4090: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
40a0: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
40b0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
40c0: 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20  Continue,       
40d0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
40e0: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
40f0: 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69   next row */.  i
4100: 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
4110: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
4120: 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
4130: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
4140: 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  op */.){.  Vdbe 
4150: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4160: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
4170: 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20  nt hasDistinct; 
4180: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
4190: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
41a0: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
41b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  t */.  int regRe
41c0: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
41d0: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d     /* Start of m
41e0: 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65  emory holding re
41f0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  sult set */.  in
4200: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
4210: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
4220: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
4230: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
4240: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
4250: 50 61 72 6d 3b 20 20 20 2f 2a 20 46 69 72 73 74  Parm;   /* First
4260: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
4270: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
4280: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
4290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
42a0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
42b0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20  t columns */..  
42c0: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 69  assert( v );.  i
42d0: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
42e0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
42f0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
4300: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
4310: 64 69 73 74 69 6e 63 74 3e 3d 30 3b 0a 20 20 69  distinct>=0;.  i
4320: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  f( pOrderBy==0 &
4330: 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29  & !hasDistinct )
4340: 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  {.    codeOffset
4350: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
4360: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c  );.  }..  /* Pul
4370: 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  l the requested 
4380: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20  columns..  */.  
4390: 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b  if( nColumn>0 ){
43a0: 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20  .    nResultCol 
43b0: 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c  = nColumn;.  }el
43c0: 73 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43  se{.    nResultC
43d0: 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
43e0: 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  pr;.  }.  if( pD
43f0: 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a  est->iMem==0 ){.
4400: 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20      pDest->iMem 
4410: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
4420: 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65  ;.    pDest->nMe
4430: 6d 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  m = nResultCol;.
4440: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
4450: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
4460: 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73    }else{ .    as
4470: 73 65 72 74 28 20 70 44 65 73 74 2d 3e 6e 4d 65  sert( pDest->nMe
4480: 6d 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b  m==nResultCol );
4490: 0a 20 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74  .  }.  regResult
44a0: 20 3d 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3b 0a   = pDest->iMem;.
44b0: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
44c0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
44d0: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
44e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
44f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4500: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
4510: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a  , regResult+i);.
4520: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
4530: 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ( eDest!=SRT_Exi
4540: 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sts ){.    /* If
4550: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
4560: 20 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e   is an EXISTS(..
4570: 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  .) expression, t
4580: 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a  he actual.    **
4590: 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
45a0: 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61   by the SELECT a
45b0: 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  re not required.
45c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
45d0: 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
45e0: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73  r(pParse);.    s
45f0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
4600: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
4610: 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74  EList, regResult
4620: 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  , eDest==SRT_Out
4630: 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c  put);.  }.  nCol
4640: 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  umn = nResultCol
4650: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  ;..  /* If the D
4660: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
4670: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
4680: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
4690: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
46a0: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
46b0: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
46c0: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
46d0: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
46e0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
46f0: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
4700: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
4710: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
4720: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
4730: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f  List->nExpr==nCo
4740: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65  lumn );.    code
4750: 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
4760: 20 64 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74   distinct, iCont
4770: 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  inue, nColumn, r
4780: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 69  egResult);.    i
4790: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
47a0: 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73  {.      codeOffs
47b0: 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
47c0: 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ue);.    }.  }..
47d0: 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75    if( checkForMu
47e0: 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
47f0: 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65  rror(pParse, pDe
4800: 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  st, pEList->nExp
4810: 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
4820: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
4830: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a   eDest ){.    /*
4840: 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77   In this mode, w
4850: 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20  rite each query 
4860: 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65  result to the ke
4870: 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  y of the tempora
4880: 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ry.    ** table 
4890: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69  iParm..    */.#i
48a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
48b0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
48c0: 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  T.    case SRT_U
48d0: 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  nion: {.      in
48e0: 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d  t r1;.      r1 =
48f0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
4900: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
4910: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4920: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
4930: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
4940: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20   nColumn, r1);. 
4950: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4960: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
4970: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
4980: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
4990: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
49a0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
49b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
49c0: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  .    /* Construc
49d0: 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  t a record from 
49e0: 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
49f0: 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66  , but instead of
4a00: 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74  .    ** saving t
4a10: 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20  hat record, use 
4a20: 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64  it as a key to d
4a30: 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66  elete elements f
4a40: 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  rom.    ** the t
4a50: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
4a60: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Parm..    */.   
4a70: 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74   case SRT_Except
4a80: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4a90: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4aa0: 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61  P_IdxDelete, iPa
4ab0: 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rm, regResult, n
4ac0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
4ad0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
4ae0: 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  if..    /* Store
4af0: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
4b00: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
4b10: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
4b20: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
4b30: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
4b40: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
4b50: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
4b60: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
4b70: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
4b80: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4b90: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4ba0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
4bb0: 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69  mn, r1);.      i
4bc0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
4bd0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4be0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
4bf0: 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a  rderBy, p, r1);.
4c00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4c10: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
4c20: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
4c30: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
4c40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4c50: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
4c60: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
4c70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4c80: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
4c90: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
4ca0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
4cb0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4cc0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
4cd0: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
4ce0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
4cf0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
4d00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
4d10: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
4d20: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
4d30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4d40: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
4d50: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
4d60: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
4d70: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
4d80: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
4d90: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
4da0: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
4db0: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
4dc0: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
4dd0: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
4de0: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
4df0: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
4e00: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
4e10: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
4e20: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4e30: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
4e40: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
4e50: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==1 );.      p->
4e60: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
4e70: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
4e80: 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  y(pEList->a[0].p
4e90: 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66  Expr, pDest->aff
4ea0: 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 69 66  inity);.      if
4eb0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
4ec0: 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73        /* At firs
4ed0: 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75  t glance you wou
4ee0: 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c  ld think we coul
4ef0: 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74  d optimize out t
4f00: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  he.        ** OR
4f10: 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63  DER BY in this c
4f20: 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ase since the or
4f30: 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  der of entries i
4f40: 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  n the set.      
4f50: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61    ** does not ma
4f60: 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65  tter.  But there
4f70: 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49   might be a LIMI
4f80: 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69  T clause, in whi
4f90: 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ch.        ** ca
4fa0: 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65  se the order doe
4fb0: 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20  s matter */.    
4fc0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
4fd0: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
4fe0: 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  rBy, p, regResul
4ff0: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
5000: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
5010: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
5020: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
5030: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5040: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
5050: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
5060: 6c 74 2c 20 31 2c 20 72 31 2c 20 26 70 2d 3e 61  lt, 1, r1, &p->a
5070: 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
5080: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
5090: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
50a0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
50b0: 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20  esult, 1);.     
50c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
50d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
50e0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29  sert, iParm, r1)
50f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5100: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
5110: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
5120: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
5130: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5140: 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
5150: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
5160: 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
5170: 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
5180: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5190: 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
51a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
51b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
51c0: 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a  ger, 1, iParm);.
51d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
51e0: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
51f0: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
5200: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
5210: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5220: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
5230: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
5240: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
5250: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
5260: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
5270: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
5280: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
5290: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
52a0: 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
52b0: 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
52c0: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
52d0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
52e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
52f0: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
5300: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
5310: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
5320: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
5330: 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65   pOrderBy, p, re
5340: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
5350: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5360: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
5370: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ve(pParse, regRe
5380: 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b  sult, iParm, 1);
5390: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
53a0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
53b0: 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
53c0: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
53d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
53e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
53f0: 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
5400: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
5410: 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  RY */..    /* Se
5420: 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  nd the data to t
5430: 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  he callback func
5440: 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62  tion or to a sub
5450: 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65  routine.  In the
5460: 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20  .    ** case of 
5470: 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68  a subroutine, th
5480: 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73  e subroutine its
5490: 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62  elf is responsib
54a0: 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f  le for.    ** po
54b0: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66  pping the data f
54c0: 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20  rom the stack.. 
54d0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
54e0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 0a 20 20  RT_Coroutine:.  
54f0: 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75    case SRT_Outpu
5500: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
5510: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
5520: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
5530: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5540: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
5550: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5560: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
5570: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  d, regResult, nC
5580: 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20  olumn, r1);.    
5590: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
55a0: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
55b0: 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20  rBy, p, r1);.   
55c0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
55d0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
55e0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65  e, r1);.      }e
55f0: 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53  lse if( eDest==S
5600: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
5610: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5620: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
5630: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50  Yield, pDest->iP
5640: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  arm);.      }els
5650: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
5660: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5670: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65  OP_ResultRow, re
5680: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
5690: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
56a0: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
56b0: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
56c0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
56d0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lumn);.      }. 
56e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
56f0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
5700: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
5710: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
5720: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
5730: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
5740: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
5750: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
5760: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
5770: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
5780: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
5790: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
57a0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
57b0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
57c0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
57d0: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
57e0: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
57f0: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
5800: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
5810: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
5820: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5830: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
5840: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
5850: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5860: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
5870: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
5880: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
5890: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
58a0: 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20   reached..  */. 
58b0: 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
58c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  {.    assert( pO
58d0: 72 64 65 72 42 79 3d 3d 30 20 29 3b 20 20 2f 2a  rderBy==0 );  /*
58e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
58f0: 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 63 61  ORDER BY, the ca
5900: 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ll to.          
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5920: 20 20 2a 2a 20 70 75 73 68 4f 6e 74 6f 53 6f 72    ** pushOntoSor
5930: 74 65 72 28 29 20 77 6f 75 6c 64 20 68 61 76 65  ter() would have
5940: 20 63 6c 65 61 72 65 64 20 70 2d 3e 69 4c 69 6d   cleared p->iLim
5950: 69 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  it */.    sqlite
5960: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5970: 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69  P_AddImm, p->iLi
5980: 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71  mit, -1);.    sq
5990: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
59a0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
59b0: 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29  >iLimit, iBreak)
59c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
59d0: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
59e0: 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74  on list, generat
59f0: 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  e a KeyInfo stru
5a00: 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72  cture that recor
5a10: 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  ds.** the collat
5a20: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
5a30: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
5a40: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
5a50: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
5a60: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
5a70: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
5a80: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
5a90: 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  e then the resul
5aa0: 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ting.** KeyInfo 
5ab0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
5ac0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
5ad0: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
5ae0: 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20  ual index to.** 
5af0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63  implement that c
5b00: 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45  lause.  If the E
5b10: 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72  xprList is the r
5b20: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
5b30: 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68  ELECT.** then th
5b40: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
5b50: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
5b60: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
5b70: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ing a virtual.**
5b80: 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d   index to implem
5b90: 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74  ent a DISTINCT t
5ba0: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  est..**.** Space
5bb0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
5bc0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
5bd0: 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d 61  s obtain from ma
5be0: 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69  lloc.  The calli
5bf0: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ng.** function i
5c00: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
5c10: 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68  r seeing that th
5c20: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
5c30: 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
5c40: 65 65 64 2e 20 20 41 64 64 20 74 68 65 20 4b 65  eed.  Add the Ke
5c50: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5c60: 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c 64 20  to the P4 field 
5c70: 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75 73 69  of an opcode usi
5c80: 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e 46 4f  ng.** P4_KEYINFO
5c90: 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68 65 20  _HANDOFF is the 
5ca0: 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64 65 61  usual way of dea
5cb0: 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73 2e 0a  ling with this..
5cc0: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
5cd0: 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  o *keyInfoFromEx
5ce0: 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50  prList(Parse *pP
5cf0: 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a  arse, ExprList *
5d00: 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65  pList){.  sqlite
5d10: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5d20: 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b  db;.  int nExpr;
5d30: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66  .  KeyInfo *pInf
5d40: 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  o;.  struct Expr
5d50: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
5d60: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
5d70: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
5d80: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
5d90: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
5da0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  o(db, sizeof(*pI
5db0: 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73 69  nfo) + nExpr*(si
5dc0: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
5dd0: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f  ) );.  if( pInfo
5de0: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61   ){.    pInfo->a
5df0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
5e00: 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e  )&pInfo->aColl[n
5e10: 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66 6f  Expr];.    pInfo
5e20: 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
5e30: 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f  nExpr;.    pInfo
5e40: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
5e50: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 64 62 20 3d  .    pInfo->db =
5e60: 20 64 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   db;.    for(i=0
5e70: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
5e80: 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  ; i<nExpr; i++, 
5e90: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
5ea0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
5eb0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
5ec0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
5ed0: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
5ee0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
5ef0: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
5f00: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e      pColl = db->
5f10: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
5f20: 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e   }.      pInfo->
5f30: 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c  aColl[i] = pColl
5f40: 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  ;.      pInfo->a
5f50: 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
5f60: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
5f70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5f80: 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f  urn pInfo;.}.../
5f90: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65  *.** If the inne
5fa0: 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72  r loop was gener
5fb0: 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e  ated using a non
5fc0: 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61  -null pOrderBy a
5fd0: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e  rgument,.** then
5fe0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72   the results wer
5ff0: 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f  e placed in a so
6000: 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65  rter.  After the
6010: 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61   loop is termina
6020: 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74  ted.** we need t
6030: 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72  o run the sorter
6040: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20   and output the 
6050: 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f  results.  The fo
6060: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
6070: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
6080: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
6090: 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74  do that..*/.stat
60a0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
60b0: 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73  SortTail(.  Pars
60c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
60d0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
60e0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
60f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
6100: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
6110: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  */.  Vdbe *v,   
6120: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
6130: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
6140: 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  s VDBE */.  int 
6150: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a  nColumn,      /*
6160: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
6170: 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ns of data */.  
6180: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
6190: 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73  t /* Write the s
61a0: 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65  orted results he
61b0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  re */.){.  int a
61c0: 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
61d0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
61e0: 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  v);     /* Jump 
61f0: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
6200: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
6210: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
6220: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
6230: 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  );  /* Jump here
6240: 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20   for next cycle 
6250: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  */.  int addr;. 
6260: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74   int iTab;.  int
6270: 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a   pseudoTab = 0;.
6280: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
6290: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
62a0: 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73 74  By;..  int eDest
62b0: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
62c0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
62d0: 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20  Dest->iParm;..  
62e0: 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e  int regRow;.  in
62f0: 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69  t regRowid;..  i
6300: 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Tab = pOrderBy->
6310: 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  iECursor;.  if( 
6320: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
6330: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
6340: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
6350: 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70 50 61   pseudoTab = pPa
6360: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
6370: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6380: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
6390: 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  udo, pseudoTab, 
63a0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
63b0: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d  t, nColumn);.  }
63c0: 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71  .  addr = 1 + sq
63d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
63e0: 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62  v, OP_Sort, iTab
63f0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
6400: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
6410: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
6420: 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74    regRow = sqlit
6430: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6440: 72 73 65 29 3b 0a 20 20 72 65 67 52 6f 77 69 64  rse);.  regRowid
6450: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
6460: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
6470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6480: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
6490: 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e  iTab, pOrderBy->
64a0: 6e 45 78 70 72 20 2b 20 31 2c 20 72 65 67 52 6f  nExpr + 1, regRo
64b0: 77 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44  w);.  switch( eD
64c0: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
64d0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
64e0: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
64f0: 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
6500: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
6510: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
6520: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6530: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
6540: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6550: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
6560: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65  Rowid, iParm, re
6570: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
6580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6590: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
65a0: 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65  Parm, regRow, re
65b0: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
65c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
65d0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
65e0: 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61  END);.      brea
65f0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
6600: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
6610: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53  QUERY.    case S
6620: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
6630: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
6640: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
6650: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
6660: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
6670: 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f  regRow, 1, regRo
6680: 77 69 64 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74  wid, &p->affinit
6690: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  y, 1);.      sql
66a0: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
66b0: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
66c0: 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a  se, regRow, 1);.
66d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
66e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
66f0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
6700: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
6710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6720: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
6730: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
6740: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
6750: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
6760: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
6770: 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31  regRow, iParm, 1
6780: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
6790: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
67a0: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
67b0: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
67c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
67d0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
67e0: 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 0a 20 20  e SRT_Output:.  
67f0: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
6800: 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  tine: {.      in
6810: 74 20 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t i;.      testc
6820: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
6830: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
6840: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
6850: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
6860: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6870: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6880: 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 52  Integer, 1, regR
6890: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
68a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
68b0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 73 65  , OP_Insert, pse
68c0: 75 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20  udoTab, regRow, 
68d0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
68e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
68f0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
6900: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f     assert( regRo
6910: 77 21 3d 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69  w!=pDest->iMem+i
6920: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
6930: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6940: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75   OP_Column, pseu
6950: 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74 2d  doTab, i, pDest-
6960: 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 20 20  >iMem+i);.      
6970: 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  }.      if( eDes
6980: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
6990: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
69a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
69b0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73  _ResultRow, pDes
69c0: 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e  t->iMem, nColumn
69d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
69e0: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
69f0: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
6a00: 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e  , pDest->iMem, n
6a10: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
6a20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
6a30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
6a40: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
6a50: 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20  st->iParm);.    
6a60: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6a70: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
6a80: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  lt: {.      /* D
6a90: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
6aa0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6ab0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
6ac0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6ad0: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73  se, regRow);.  s
6ae0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6af0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
6b00: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 4c 49  Rowid);..  /* LI
6b10: 4d 49 54 20 68 61 73 20 62 65 65 6e 20 69 6d 70  MIT has been imp
6b20: 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20  lemented by the 
6b30: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29  pushOntoSorter()
6b40: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20   routine..  */. 
6b50: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 4c 69 6d   assert( p->iLim
6b60: 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54  it==0 );..  /* T
6b70: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
6b80: 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
6b90: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
6ba0: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74  abel(v, addrCont
6bb0: 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
6bc0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6bd0: 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
6be0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
6bf0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
6c00: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69   addrBreak);.  i
6c10: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
6c20: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
6c30: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
6c40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6c50: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
6c60: 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  e, pseudoTab, 0)
6c70: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
6c80: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
6c90: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
6ca0: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
6cb0: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
6cc0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
6cd0: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
6ce0: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
6cf0: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
6d00: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
6d10: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
6d20: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
6d30: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
6d40: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
6d50: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
6d60: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
6d70: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
6d80: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6d90: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
6da0: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
6db0: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
6dc0: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
6dd0: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
6de0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
6df0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
6e00: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
6e10: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
6e20: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
6e30: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
6e40: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
6e50: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
6e60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
6e70: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
6e80: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
6e90: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
6ea0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
6eb0: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
6ec0: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
6ed0: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
6ee0: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
6ef0: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
6f00: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
6f10: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
6f20: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
6f30: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
6f40: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
6f50: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
6f60: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
6f70: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
6f80: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  mn is NULL..*/.s
6f90: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
6fa0: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20   *columnType(.  
6fb0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
6fc0: 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  , .  Expr *pExpr
6fd0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
6fe0: 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63  *pzOriginDb,.  c
6ff0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
7000: 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74  iginTab,.  const
7010: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
7020: 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  Col.){.  char co
7030: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
7040: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
7050: 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63  riginDb = 0;.  c
7060: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
7070: 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61  inTab = 0;.  cha
7080: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e  r const *zOrigin
7090: 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  Col = 0;.  int j
70a0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
70b0: 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73   || pNC->pSrcLis
70c0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
70d0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
70e0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
70f0: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
7100: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
7110: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
7120: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
7130: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
7140: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
7150: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
7160: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
7170: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
7180: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
7190: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
71a0: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
71b0: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
71c0: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
71d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
71e0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
71f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
7200: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
7210: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
7220: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
7230: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
7240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7250: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
7260: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
7270: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
7280: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
7290: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
72a0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
72b0: 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  ab */.      whil
72c0: 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20  e( pNC && !pTab 
72d0: 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69  ){.        SrcLi
72e0: 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
72f0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
7300: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c        for(j=0;j<
7310: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
7320: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
7330: 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d  .iCursor!=pExpr-
7340: 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20  >iTable;j++);.  
7350: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62        if( j<pTab
7360: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  List->nSrc ){.  
7370: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
7380: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
7390: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ab;.          pS
73a0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
73b0: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ].pSelect;.     
73c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
73d0: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
73e0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
73f0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
7400: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
7410: 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a        /* FIX ME:
7420: 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
7430: 20 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20 79   can occurs if y
7440: 6f 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e  ou have somethin
7450: 67 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20 6e  g like "SELECT n
7460: 65 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20 20  ew.x;" inside.  
7470: 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67        ** a trigg
7480: 65 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  er.  In other wo
7490: 72 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66 65  rds, if you refe
74a0: 72 65 6e 63 65 20 74 68 65 20 73 70 65 63 69 61  rence the specia
74b0: 6c 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20 20  l "new".        
74c0: 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ** table in the 
74d0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
74e0: 73 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20 6e  select.  We do n
74f0: 6f 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77  ot have a good w
7500: 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ay.        ** to
7510: 20 66 69 6e 64 20 74 68 65 20 61 63 74 75 61 6c   find the actual
7520: 20 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f 20   table type, so 
7530: 63 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e 20  call it "TEXT". 
7540: 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 0a   This is really.
7550: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74          ** somet
7560: 68 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20 62  hing of a bug, b
7570: 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  ut I do not know
7580: 20 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e 0a   how to fix it..
7590: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
75a0: 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
75b0: 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63 65  does not produce
75c0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
75d0: 77 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70 72  wer - it just pr
75e0: 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a  events.        *
75f0: 2a 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20 53  * a segfault.  S
7600: 65 65 20 74 69 63 6b 65 74 20 23 31 32 32 39 2e  ee ticket #1229.
7610: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
7620: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58      zType = "TEX
7630: 54 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  T";.        brea
7640: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
7650: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 29    assert( pTab )
7660: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29  ;.      if( pS )
7670: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
7680: 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75   "table" is actu
7690: 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63  ally a sub-selec
76a0: 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74  t or a view in t
76b0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
76c0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
76d0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
76e0: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
76f0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
7700: 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20  nd origin.      
7710: 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68    ** data for th
7720: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  e result-set col
7730: 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73  umn of the sub-s
7740: 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  elect..        *
7750: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 41 4c  /.        if( AL
7760: 57 41 59 53 28 69 43 6f 6c 3e 3d 30 20 26 26 20  WAYS(iCol>=0 && 
7770: 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d  iCol<pS->pEList-
7780: 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
7790: 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20       /* If iCol 
77a0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
77b0: 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  o, then the expr
77c0: 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20  ession requests 
77d0: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
77e0: 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75   rowid of the su
77f0: 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
7800: 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  . This expressio
7810: 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20  n is legal (see 
7820: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
7830: 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e  st case misc2.2.
7840: 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65  2) - it always e
7850: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
7860: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
7870: 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e           NameCon
7880: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
7890: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
78a0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
78b0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
78c0: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
78d0: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
78e0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
78f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 0;.          s
7900: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
7910: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
7920: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
7930: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
7940: 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69  zOriginDb, &zOri
7950: 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e  ginTab, &zOrigin
7960: 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d  Col); .        }
7970: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
7980: 20 41 4c 57 41 59 53 28 70 54 61 62 2d 3e 70 53   ALWAYS(pTab->pS
7990: 63 68 65 6d 61 29 20 29 7b 0a 20 20 20 20 20 20  chema) ){.      
79a0: 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c    /* A real tabl
79b0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
79c0: 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20  ert( !pS );.    
79d0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
79e0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
79f0: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Key;.        ass
7a00: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
7a10: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
7a20: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
7a30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
7a40: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
7a50: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
7a60: 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  R";.          zO
7a70: 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69  riginCol = "rowi
7a80: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
7a90: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e{.          zTy
7aa0: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
7ab0: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
7ac0: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f         zOriginCo
7ad0: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
7ae0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
7af0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f      }.        zO
7b00: 72 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62 2d  riginTab = pTab-
7b10: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
7b20: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
7b30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
7b40: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
7b50: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d  hemaToIndex(pNC-
7b60: 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  >pParse->db, pTa
7b70: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
7b80: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44 62         zOriginDb
7b90: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
7ba0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
7bb0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  me;.        }.  
7bc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7bd0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
7be0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
7bf0: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
7c00: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
7c10: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
7c20: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
7c30: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
7c40: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
7c50: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
7c60: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
7c70: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
7c80: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7c90: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
7ca0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
7cb0: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
7cc0: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
7cd0: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
7ce0: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pS = pExpr->x.
7cf0: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45  pSelect;.      E
7d00: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
7d10: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
7d20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
7d30: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7d40: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
7d50: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
7d60: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
7d70: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
7d80: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
7d90: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
7da0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
7db0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
7dc0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
7dd0: 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69  zOriginDb, &zOri
7de0: 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e  ginTab, &zOrigin
7df0: 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65  Col); .      bre
7e00: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
7e10: 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a  .  }.  .  if( pz
7e20: 4f 72 69 67 69 6e 44 62 20 29 7b 0a 20 20 20 20  OriginDb ){.    
7e30: 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 69 6e  assert( pzOrigin
7e40: 54 61 62 20 26 26 20 70 7a 4f 72 69 67 69 6e 43  Tab && pzOriginC
7e50: 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  ol );.    *pzOri
7e60: 67 69 6e 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44  ginDb = zOriginD
7e70: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e  b;.    *pzOrigin
7e80: 54 61 62 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62  Tab = zOriginTab
7e90: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43  ;.    *pzOriginC
7ea0: 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b  ol = zOriginCol;
7eb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54  .  }.  return zT
7ec0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
7ed0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
7ee0: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
7ef0: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
7f00: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
7f10: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
7f20: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
7f30: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
7f40: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
7f50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7f60: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
7f70: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
7f80: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
7f90: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
7fa0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
7fb0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
7fc0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
7fd0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
7fe0: 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  t */.){.#ifndef 
7ff0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
8000: 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d  TYPE.  Vdbe *v =
8010: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
8020: 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
8030: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e  ontext sNC;.  sN
8040: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
8050: 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61  bList;.  sNC.pPa
8060: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
8070: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
8080: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
8090: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
80a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
80b0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
80c0: 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20   *zType;.#ifdef 
80d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
80e0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
80f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
8100: 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63  rigDb = 0;.    c
8110: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
8120: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  Tab = 0;.    con
8130: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f  st char *zOrigCo
8140: 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65  l = 0;.    zType
8150: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
8160: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c  NC, p, &zOrigDb,
8170: 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72   &zOrigTab, &zOr
8180: 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  igCol);..    /* 
8190: 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61  The vdbe must ma
81a0: 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20  ke its own copy 
81b0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79  of the column-ty
81c0: 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20  pe and other .  
81d0: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63    ** column spec
81e0: 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e  ific strings, in
81f0: 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61   case the schema
8200: 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65   is reset before
8210: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72   this.    ** vir
8220: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20  tual machine is 
8230: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
8240: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8250: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8260: 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45  COLNAME_DATABASE
8270: 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54  , zOrigDb, SQLIT
8280: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
8290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
82a0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
82b0: 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72  LNAME_TABLE, zOr
82c0: 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52  igTab, SQLITE_TR
82d0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
82e0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
82f0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8300: 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43  E_COLUMN, zOrigC
8310: 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
8320: 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20  IENT);.#else.   
8330: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
8340: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20  ype(&sNC, p, 0, 
8350: 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
8360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8370: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8380: 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20  LNAME_DECLTYPE, 
8390: 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52  zType, SQLITE_TR
83a0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65  ANSIENT);.  }.#e
83b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
83c0: 4d 49 54 5f 44 45 43 4c 54 59 50 45 20 2a 2f 0a  MIT_DECLTYPE */.
83d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
83e0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
83f0: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
8400: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
8410: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
8420: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
8430: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
8440: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
8450: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
8460: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
8470: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
8480: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
8490: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
84a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
84b0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
84c0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
84d0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
84e0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
84f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
8500: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
8510: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
8520: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
8530: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
8540: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
8550: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
8560: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8570: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
8580: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
8590: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
85a0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
85b0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
85c0: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
85d0: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
85e0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
85f0: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
8600: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
8610: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
8620: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
8630: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45  olNamesSet || NE
8640: 56 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d  VER(v==0) || db-
8650: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
8660: 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65  return;.  pParse
8670: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
8680: 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d  1;.  fullNames =
8690: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
86a0: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
86b0: 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61  s)!=0;.  shortNa
86c0: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
86d0: 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
86e0: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
86f0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
8700: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
8710: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
8720: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
8730: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
8740: 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70  pr *p;.    p = p
8750: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
8760: 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  r;.    if( p==0 
8770: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
8780: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
8790: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
87a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
87b0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
87c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
87d0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
87e0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
87f0: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
8800: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
8810: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
8820: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
8830: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
8840: 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74  UMN) && pTabList
8850: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
8860: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
8870: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
8880: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
8890: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
88a0: 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54  j=0; ALWAYS(j<pT
88b0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a  abList->nSrc); j
88c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
88d0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
88e0: 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62  iCursor==p->iTab
88f0: 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  le ) break;.    
8900: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
8910: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
8920: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
8930: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
8940: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
8950: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
8960: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
8970: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
8980: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
8990: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
89a0: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
89b0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
89c0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
89d0: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
89e0: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
89f0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
8a00: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
8a10: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
8a20: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
8a30: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
8a40: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8a50: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8a60: 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20  AME_NAME, .     
8a70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
8a80: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
8a90: 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  r*)p->span.z, p-
8aa0: 3e 73 70 61 6e 2e 6e 29 2c 20 53 51 4c 49 54 45  >span.n), SQLITE
8ab0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
8ac0: 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e   }else if( fullN
8ad0: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
8ae0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
8af0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
8b00: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8b10: 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  db, "%s.%s", pTa
8b20: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b  b->zName, zCol);
8b30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8b40: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8b50: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
8b60: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
8b70: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
8b80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8b90: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8ba0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8bb0: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20  AME_NAME, zCol, 
8bc0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
8bd0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8be0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
8bf0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8c00: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8c10: 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20  NAME, .         
8c20: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
8c30: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 2d 3e  p(db, (char*)p->
8c40: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
8c50: 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d  n), SQLITE_DYNAM
8c60: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  IC);.    }.  }. 
8c70: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
8c80: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
8c90: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
8ca0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8cb0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
8cc0: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
8cd0: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
8ce0: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
8cf0: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
8d00: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
8d10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
8d20: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
8d30: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
8d40: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
8d50: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
8d60: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
8d70: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
8d80: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
8d90: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
8da0: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
8db0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
8dc0: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
8dd0: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
8de0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
8df0: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
8e00: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
8e10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
8e20: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
8e30: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
8e40: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
8e50: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20 65  .** Given a an e
8e60: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
8e70: 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
8e80: 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
8e90: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
8ea0: 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
8eb0: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
8ec0: 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
8ed0: 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
8ee0: 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
8ef0: 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
8f00: 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
8f10: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
8f20: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
8f30: 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
8f40: 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
8f50: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
8f60: 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
8f70: 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
8f80: 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
8f90: 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
8fa0: 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
8fb0: 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
8fc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
8fd0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
8fe0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
8ff0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
9000: 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
9010: 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
9020: 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
9030: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9040: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9050: 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
9060: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
9070: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9080: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
9090: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
90a0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
90b0: 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73       /* Expr lis
90c0: 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  t from which to 
90d0: 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61  derive column na
90e0: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  mes */.  int *pn
90f0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
9100: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
9110: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
9120: 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  here */.  Column
9130: 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20   **paCol        
9140: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
9150: 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  ew column list h
9160: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
9170: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9180: 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62  ->db;   /* Datab
9190: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
91a0: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91c0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
91d0: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20   */.  int cnt;  
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64    /* Index added
9200: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
9210: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f  e unique */.  Co
9220: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
9230: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  l;        /* For
9240: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65   looping over re
9250: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
9260: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9280: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
9290: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
92a0: 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a   set */.  Expr *
92b0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
92c0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
92d0: 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ion for a single
92e0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a   result column *
92f0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9310: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
9320: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9340: 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20  /* Size of name 
9350: 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20  in zName[] */.. 
9360: 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d   *pnCol = nCol =
9370: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
9380: 20 20 61 43 6f 6c 20 3d 20 2a 70 61 43 6f 6c 20    aCol = *paCol 
9390: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
93a0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
93b0: 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b  (aCol[0])*nCol);
93c0: 0a 20 20 69 66 28 20 61 43 6f 6c 3d 3d 30 20 29  .  if( aCol==0 )
93d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
93e0: 4f 4d 45 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  OMEM;.  for(i=0,
93f0: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43   pCol=aCol; i<nC
9400: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
9410: 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20  {.    /* Get an 
9420: 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65  appropriate name
9430: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a   for the column.
9440: 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70      */.    p = p
9450: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
9460: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
9470: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ->pRight==0 || p
9480: 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e  ->pRight->token.
9490: 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  z==0 || p->pRigh
94a0: 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30  t->token.z[0]!=0
94b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61   );.    if( (zNa
94c0: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
94d0: 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ].zName)!=0 ){. 
94e0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
94f0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
9500: 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68  n "AS <name>" ph
9510: 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e  rase, use <name>
9520: 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   as the name */.
9530: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
9540: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
9550: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
9560: 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
9570: 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20  *pColExpr = p;  
9580: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
9590: 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65  n that is the re
95a0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  sult column name
95b0: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
95c0: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f  *pTab;         /
95d0: 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74  * Table associat
95e0: 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70  ed with this exp
95f0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
9600: 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72   while( pColExpr
9610: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 20 70  ->op==TK_DOT ) p
9620: 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78  ColExpr = pColEx
9630: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
9640: 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e    if( pColExpr->
9650: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
9660: 20 28 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70   (pTab = pColExp
9670: 72 2d 3e 70 54 61 62 29 21 3d 30 20 29 7b 0a 20  r->pTab)!=0 ){. 
9680: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
9690: 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
96a0: 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
96b0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
96c0: 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
96d0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
96e0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
96f0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
9700: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
9710: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
9720: 64 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20  db, "%s",.      
9730: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e             iCol>
9740: 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  =0 ? pTab->aCol[
9750: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72  iCol].zName : "r
9760: 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65  owid");.      }e
9770: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
9780: 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  Use the original
9790: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c   text of the col
97a0: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  umn expression a
97b0: 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  s its name */.  
97c0: 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 6f        Token *pTo
97d0: 6b 65 6e 20 3d 20 28 70 43 6f 6c 45 78 70 72 2d  ken = (pColExpr-
97e0: 3e 73 70 61 6e 2e 7a 3f 26 70 43 6f 6c 45 78 70  >span.z?&pColExp
97f0: 72 2d 3e 73 70 61 6e 3a 26 70 43 6f 6c 45 78 70  r->span:&pColExp
9800: 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  r->token);.     
9810: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
9820: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
9830: 54 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 20  T", pToken);.   
9840: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
9850: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
9860: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  led ){.      sql
9870: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
9880: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
9890: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ak;.    }.    sq
98a0: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
98b0: 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  me);..    /* Mak
98c0: 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d  e sure the colum
98d0: 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  n name is unique
98e0: 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69  .  If the name i
98f0: 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20  s not unique,.  
9900: 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e    ** append a in
9910: 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d  teger to the nam
9920: 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63  e so that it bec
9930: 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20  omes unique..   
9940: 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20   */.    nName = 
9950: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
9960: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  zName);.    for(
9970: 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  j=cnt=0; j<i; j+
9980: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
9990: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f  lite3StrICmp(aCo
99a0: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  l[j].zName, zNam
99b0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
99c0: 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b   char *zNewName;
99d0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e  .        zName[n
99e0: 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20  Name] = 0;.     
99f0: 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71     zNewName = sq
9a00: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
9a10: 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c   "%s:%d", zName,
9a20: 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20   ++cnt);.       
9a30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9a40: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
9a50: 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e     zName = zNewN
9a60: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  ame;.        j =
9a70: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28   -1;.        if(
9a80: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61   zName==0 ) brea
9a90: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9aa0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  .    pCol->zName
9ab0: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20   = zName;.  }.  
9ac0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
9ad0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28  iled ){.    for(
9ae0: 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  j=0; j<i; j++){.
9af0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9b00: 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e  ree(db, aCol[j].
9b10: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
9b20: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9b30: 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a  db, aCol);.    *
9b40: 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a  paCol = 0;.    *
9b50: 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72  pnCol = 0;.    r
9b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
9b70: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
9b80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
9b90: 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e  *.** Add type an
9ba0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
9bb0: 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c  rmation to a col
9bc0: 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f  umn list based o
9bd0: 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74  n.** a SELECT st
9be0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20  atement..** .** 
9bf0: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
9c00: 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20  presumably came 
9c10: 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d  from selectColum
9c20: 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69  nNamesFromExprLi
9c30: 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c  st()..** The col
9c40: 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c  umn list has onl
9c50: 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70  y names, not typ
9c60: 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73  es or collations
9c70: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
9c80: 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20  ne goes through 
9c90: 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70  and adds the typ
9ca0: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
9cb0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
9cc0: 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74  utine requires t
9cd0: 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69  hat all identifi
9ce0: 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ers in the SELEC
9cf0: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62  T.** statement b
9d00: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73  e resolved..*/.s
9d10: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
9d20: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
9d30: 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61  dCollation(.  Pa
9d40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
9d50: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
9d60: 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 69 6e 74  ontexts */.  int
9d70: 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   nCol,          
9d80: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9d90: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f 6c  columns */.  Col
9da0: 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20 20 20 20  umn *aCol,      
9db0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
9dc0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53 65 6c 65 63  lumns */.  Selec
9dd0: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
9de0: 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20   /* SELECT used 
9df0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70  to determine typ
9e00: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
9e10: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
9e20: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9e30: 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  db;.  NameContex
9e40: 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20  t sNC;.  Column 
9e50: 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pCol;.  CollSeq
9e60: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
9e70: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73  ;.  Expr *p;.  s
9e80: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
9e90: 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72  tem *a;..  asser
9ea0: 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  t( pSelect!=0 );
9eb0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c  .  assert( (pSel
9ec0: 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
9ed0: 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20  SF_Resolved)!=0 
9ee0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f  );.  assert( nCo
9ef0: 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  l==pSelect->pELi
9f00: 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d  st->nExpr || db-
9f10: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
9f20: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
9f30: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
9f40: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  ;.  memset(&sNC,
9f50: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
9f60: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
9f70: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
9f80: 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d  ;.  a = pSelect-
9f90: 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f  >pEList->a;.  fo
9fa0: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
9fb0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ; i<nCol; i++, p
9fc0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  Col++){.    p = 
9fd0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
9fe0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71  pCol->zType = sq
9ff0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
a000: 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  , columnType(&sN
a010: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b  C, p, 0, 0, 0));
a020: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
a030: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
a040: 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
a050: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
a060: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
a070: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  rse, p);.    if(
a080: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
a090: 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71  pCol->zColl = sq
a0a0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
a0b0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
a0c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
a0d0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45  .** Given a SELE
a0e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65  CT statement, ge
a0f0: 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73  nerate a Table s
a100: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
a110: 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72  scribes.** the r
a120: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61  esult set of tha
a130: 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62  t SELECT..*/.Tab
a140: 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c  le *sqlite3Resul
a150: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72  tSetOfSelect(Par
a160: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
a170: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
a180: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73  Table *pTab;.  s
a190: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a1a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73  rse->db;.  int s
a1b0: 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61  avedFlags;..  sa
a1c0: 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66  vedFlags = db->f
a1d0: 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  lags;.  db->flag
a1e0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c  s &= ~SQLITE_Ful
a1f0: 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d  lColNames;.  db-
a200: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
a210: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a  _ShortColNames;.
a220: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
a230: 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c  rep(pParse, pSel
a240: 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ect, 0);.  if( p
a250: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
a260: 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28  turn 0;.  while(
a270: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
a280: 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65   ) pSelect = pSe
a290: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
a2a0: 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65  db->flags = save
a2b0: 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d  dFlags;.  pTab =
a2c0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
a2d0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
a2e0: 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  Table) );.  if( 
a2f0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pTab==0 ){.    r
a300: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
a310: 54 61 62 2d 3e 64 62 4d 65 6d 20 3d 20 64 62 2d  Tab->dbMem = db-
a320: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
a330: 6c 65 64 20 3f 20 64 62 20 3a 20 30 3b 0a 20 20  led ? db : 0;.  
a340: 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
a350: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
a360: 30 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d  0;.  selectColum
a370: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
a380: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
a390: 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
a3a0: 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
a3b0: 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f  );.  selectAddCo
a3c0: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
a3d0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
a3e0: 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61  b->nCol, pTab->a
a3f0: 43 6f 6c 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  Col, pSelect);. 
a400: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
a410: 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  1;.  if( db->mal
a420: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
a430: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
a440: 62 6c 65 28 70 54 61 62 29 3b 0a 20 20 20 20 72  ble(pTab);.    r
a450: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
a460: 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
a470: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
a480: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
a490: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
a4a0: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
a4b0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
a4c0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
a4d0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
a4e0: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
a4f0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
a500: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
a510: 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70  GetVdbe(Parse *p
a520: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
a530: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
a540: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
a550: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
a560: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  >pVdbe = sqlite3
a570: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
a580: 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66 20  e->db);.#ifndef 
a590: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
a5a0: 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20  E.    if( v ){. 
a5b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a5c0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61  AddOp0(v, OP_Tra
a5d0: 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ce);.    }.#endi
a5e0: 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  f.  }.  return v
a5f0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
a600: 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
a610: 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
a620: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
a630: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
a640: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
a650: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  et expressions. 
a660: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
a670: 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70  set hold the exp
a680: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
a690: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f   appear in the o
a6a0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
a6b0: 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20  ement after the 
a6c0: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
a6d0: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f  .** keywords.  O
a6e0: 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20  r NULL if those 
a6f0: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
a700: 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64  tted. iLimit and
a710: 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65   iOffset .** are
a720: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d   the integer mem
a730: 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ory register num
a740: 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72  bers for counter
a750: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
a760: 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20  e .** the limit 
a770: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
a780: 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69  there is no limi
a790: 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c  t and/or offset,
a7a0: 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74   then .** iLimit
a7b0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
a7c0: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
a7d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
a7e0: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
a7f0: 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   of iLimit and i
a800: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
a810: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
a820: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
a830: 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  y pLimit and pOf
a840: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
a850: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
a860: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
a870: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
a880: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
a890: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
a8a0: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
a8b0: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
a8c0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
a8d0: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
a8e0: 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
a8f0: 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
a900: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
a910: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
a920: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
a930: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
a940: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
a950: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
a960: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
a970: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
a980: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
a990: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
a9a0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
a9b0: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
a9c0: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
a9d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
a9e0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
a9f0: 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
aa00: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
aa10: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
aa20: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64  ffset;.  int add
aa30: 72 31 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  r1;.  if( p->iLi
aa40: 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  mit ) return;.. 
aa50: 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54   /* .  ** "LIMIT
aa60: 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
aa70: 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
aa80: 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
aa90: 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75  contraversy abou
aaa0: 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
aab0: 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
aac0: 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
aad0: 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
aae0: 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
aaf0: 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
ab00: 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
ab10: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
ab20: 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
ab30: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 70 2d  Parse);.  if( p-
ab40: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
ab50: 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  ->iLimit = iLimi
ab60: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
ab70: 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  em;.    v = sqli
ab80: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
ab90: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
aba0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
abb0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
abc0: 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74  Parse, p->pLimit
abd0: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73  , iLimit);.    s
abe0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
abf0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
ac00: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 56  , iLimit);.    V
ac10: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
ac20: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
ac30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ac40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
ac50: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42  Zero, iLimit, iB
ac60: 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  reak);.  }.  if(
ac70: 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20   p->pOffset ){. 
ac80: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
ac90: 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
aca0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66  se->nMem;.    if
acb0: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
acc0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
acd0: 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  m++;   /* Alloca
ace0: 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67 69  te an extra regi
acf0: 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f  ster for limit+o
ad00: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 7d 0a 20  ffset */.    }. 
ad10: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
ad20: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
ad30: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
ad40: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
ad50: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
ad60: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f  , p->pOffset, iO
ad70: 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
ad80: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
ad90: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
ada0: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 56 64 62  Offset);.    Vdb
adb0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
adc0: 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  FSET counter"));
add0: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
ade0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
adf0: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66  , OP_IfPos, iOff
ae00: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
ae10: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ae20: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f  P_Integer, 0, iO
ae30: 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
ae40: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
ae50: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 69  v, addr1);.    i
ae60: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
ae70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ae80: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64  eAddOp3(v, OP_Ad
ae90: 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73  d, iLimit, iOffs
aea0: 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a  et, iOffset+1);.
aeb0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
aec0: 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46  t((v, "LIMIT+OFF
aed0: 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64  SET"));.      ad
aee0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
aef0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
af00: 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  Pos, iLimit);.  
af10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
af20: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
af30: 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74  ger, -1, iOffset
af40: 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
af50: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
af60: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a  , addr1);.    }.
af70: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
af80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
af90: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
afa0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
afb0: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
afc0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
afd0: 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
afe0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75  n of.** the resu
aff0: 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63  lt set for the c
b000: 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73  ompound-select s
b010: 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52  tatement "p".  R
b020: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a  eturn NULL if.**
b030: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
b040: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
b050: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
b060: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
b070: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
b080: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
b090: 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  ect is taken fro
b0a0: 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  m the.** left-mo
b0b0: 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73  st term of the s
b0c0: 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61  elect that has a
b0d0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
b0e0: 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  nce..*/.static C
b0f0: 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c  ollSeq *multiSel
b100: 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ectCollSeq(Parse
b110: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
b120: 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
b130: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b    CollSeq *pRet;
b140: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
b150: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d   ){.    pRet = m
b160: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
b170: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  q(pParse, p->pPr
b180: 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65  ior, iCol);.  }e
b190: 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  lse{.    pRet = 
b1a0: 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
b1b0: 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69 66   iCol>=0 );.  if
b1c0: 28 20 70 52 65 74 3d 3d 30 20 26 26 20 69 43 6f  ( pRet==0 && iCo
b1d0: 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  l<p->pEList->nEx
b1e0: 70 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  pr ){.    pRet =
b1f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
b200: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
b210: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
b220: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
b230: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn pRet;.}.#end
b240: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b250: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
b260: 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  T */../* Forward
b270: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
b280: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
b290: 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
b2a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
b2b0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
b2c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
b2d0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
b2e0: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
b2f0: 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
b300: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
b310: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
b320: 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
b330: 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
b340: 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a  results */.);...
b350: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b360: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
b370: 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ECT./*.** This r
b380: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
b390: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f   to process a co
b3a0: 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72  mpound query for
b3b0: 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72  m from.** two or
b3c0: 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
b3d0: 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49  ueries using UNI
b3e0: 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45  ON, UNION ALL, E
b3f0: 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54  XCEPT, or.** INT
b400: 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22  ERSECT.**.** "p"
b410: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
b420: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
b430: 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
b440: 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
b450: 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
b460: 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
b470: 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
b480: 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
b490: 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
b4a0: 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
b4b0: 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
b4c0: 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
b4d0: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
b4e0: 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
b4f0: 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
b500: 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
b510: 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
b520: 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
b530: 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
b540: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
b550: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
b560: 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
b570: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
b580: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
b590: 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
b5a0: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
b5b0: 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
b5c0: 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
b5d0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
b5e0: 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
b5f0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
b600: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
b610: 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
b620: 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
b630: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
b660: 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
b670: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
b680: 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
b690: 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
b6a0: 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
b6b0: 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
b6c0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
b6d0: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
b6e0: 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
b6f0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
b700: 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
b710: 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
b720: 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
b730: 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
b740: 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
b750: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
b760: 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
b770: 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
b780: 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
b790: 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
b7a0: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
b7b0: 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
b7c0: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
b7d0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b7e0: 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
b7f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b800: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
b810: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
b820: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
b830: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
b840: 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
b850: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
b860: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
b870: 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
b880: 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
b890: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
b8a0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
b8b0: 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
b8c0: 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
b8d0: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
b8e0: 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
b8f0: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
b900: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
b910: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
b920: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
b930: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
b940: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
b950: 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
b960: 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
b970: 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
b980: 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f   data destinatio
b990: 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
b9a0: 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20  Delete = 0;  /* 
b9b0: 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20  Chain of simple 
b9c0: 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74  selects to delet
b9d0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
b9e0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
b9f0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
ba00: 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b  ion */..  /* Mak
ba10: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
ba20: 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
ba30: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
ba40: 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
ba50: 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
ba60: 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
ba70: 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
ba80: 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
ba90: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
baa0: 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  T..  */.  assert
bab0: 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ( p && p->pPrior
bac0: 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20   );  /* Calling 
bad0: 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74  function guarant
bae0: 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f  ees this much */
baf0: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
bb00: 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  db;.  pPrior = p
bb10: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
bb20: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
bb30: 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29  htmost!=pPrior )
bb40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
bb50: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d  or->pRightmost==
bb60: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b  p->pRightmost );
bb70: 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
bb80: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
bb90: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
bba0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
bbb0: 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59  pParse,"ORDER BY
bbc0: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
bbd0: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
bbe0: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
bbf0: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
bc00: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
bc10: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
bc20: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
bc30: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
bc40: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
bc50: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
bc60: 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73  rse,"LIMIT claus
bc70: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
bc80: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
bc90: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
bca0: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
bcb0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
bcc0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
bcd0: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20  t_end;.  }..  v 
bce0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
bcf0: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
bd00: 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20  rt( v!=0 );  /* 
bd10: 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79  The VDBE already
bd20: 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
bd30: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
bd40: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
bd50: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
bd60: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
bd70: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
bd80: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
bd90: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
bda0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
bdb0: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71  pEList );.    sq
bdc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
bdd0: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
bde0: 72 61 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c  ral, dest.iParm,
bdf0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
be00: 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  r);.    dest.eDe
be10: 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
be20: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
be30: 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
be40: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
be50: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
be60: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
be70: 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
be80: 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
be90: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
bea0: 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
beb0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
bec0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
bed0: 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
bee0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
bef0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
bf00: 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
bf10: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
bf20: 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
bf30: 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
bf40: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
bf50: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
bf60: 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
bf70: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
bf80: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
bf90: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
bfa0: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  d;.  }..  /* Com
bfb0: 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68  pound SELECTs th
bfc0: 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  at have an ORDER
bfd0: 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68   BY clause are h
bfe0: 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
bff0: 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  y..  */.  if( p-
c000: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
c010: 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
c020: 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73  ectOrderBy(pPars
c030: 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
c040: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
c050: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
c060: 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
c070: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
c080: 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70    */.  switch( p
c090: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
c0a0: 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
c0b0: 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20   int addr = 0;. 
c0c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
c0d0: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a  rior->pLimit );.
c0e0: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
c0f0: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
c100: 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
c110: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
c120: 66 73 65 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  fset;.      rc =
c130: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
c140: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
c150: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  dest);.      p->
c160: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
c170: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
c180: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
c190: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
c1a0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c1b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
c1c0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
c1d0: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
c1e0: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
c1f0: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
c200: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
c210: 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  et;.      if( p-
c220: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
c230: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
c240: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c250: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
c260: 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64  mit);.        Vd
c270: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a  beComment((v, "J
c280: 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d  ump ahead if LIM
c290: 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20  IT reached"));. 
c2a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
c2b0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
c2c0: 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
c2d0: 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
c2e0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
c2f0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
c300: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
c310: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
c320: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c330: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
c340: 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
c350: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c360: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
c370: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
c380: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c390: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
c3a0: 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
c3b0: 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
c3c0: 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
c3d0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
c3e0: 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
c3f0: 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
c400: 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
c410: 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
c420: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
c430: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
c440: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
c450: 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
c460: 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
c470: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
c480: 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
c490: 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
c4a0: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
c4b0: 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20  t, *pOffset; /* 
c4c0: 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
c4d0: 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
c4e0: 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
c4f0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
c500: 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69    SelectDest uni
c510: 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 70  ondest;..      p
c520: 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69  riorOp = SRT_Uni
c530: 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65  on;.      if( de
c540: 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f  st.eDest==priorO
c550: 70 20 26 26 20 41 4c 57 41 59 53 28 21 70 2d 3e  p && ALWAYS(!p->
c560: 70 4c 69 6d 69 74 20 26 26 21 70 2d 3e 70 4f 66  pLimit &&!p->pOf
c570: 66 73 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  fset) ){.       
c580: 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65   /* We can reuse
c590: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
c5a0: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  le generated by 
c5b0: 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a  a SELECT to our.
c5c0: 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74          ** right
c5d0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
c5e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c5f0: 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 20 29 3b  pRightmost!=p );
c600: 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61    /* Can only ha
c610: 70 70 65 6e 20 66 6f 72 20 6c 65 66 74 77 61 72  ppen for leftwar
c620: 64 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 20  d elements.     
c630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c650: 2a 2a 20 6f 66 20 61 20 33 2d 77 61 79 20 6f 72  ** of a 3-way or
c660: 20 6d 6f 72 65 20 63 6f 6d 70 6f 75 6e 64 20 2a   more compound *
c670: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
c680: 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29  ( p->pLimit==0 )
c690: 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c  ;      /* Not al
c6a0: 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72  lowed on leftwar
c6b0: 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  d elements */.  
c6c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c6d0: 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  >pOffset==0 );  
c6e0: 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65     /* Not allowe
c6f0: 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c  d on leftward el
c700: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ements */.      
c710: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73    unionTab = des
c720: 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  t.iParm;.      }
c730: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
c740: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
c750: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
c760: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
c770: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
c780: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
c790: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
c7a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c7b0: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
c7c0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
c7d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
c7e0: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
c7f0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
c800: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c810: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
c820: 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
c830: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c840: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
c850: 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
c860: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
c870: 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
c880: 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68          p->pRigh
c890: 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20  tmost->selFlags 
c8a0: 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
c8b0: 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ral;.        ass
c8c0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
c8d0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
c8e0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
c8f0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
c900: 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
c910: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
c920: 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
c930: 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  rBy );.      sql
c940: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
c950: 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
c960: 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
c970: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
c980: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
c990: 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69  se, pPrior, &uni
c9a0: 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69  ondest);.      i
c9b0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
c9c0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
c9d0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
c9e0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
c9f0: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
ca00: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
ca10: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
ca20: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
ca30: 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  ){.        op = 
ca40: 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20  SRT_Except;.    
ca50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ca60: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
ca70: 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
ca80: 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69      op = SRT_Uni
ca90: 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  on;.      }.    
caa0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
cab0: 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
cac0: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
cad0: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
cae0: 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
caf0: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
cb00: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
cb10: 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73  ;.      uniondes
cb20: 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20  t.eDest = op;.  
cb30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cb40: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
cb50: 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
cb60: 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c       /* Query fl
cb70: 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69  attening in sqli
cb80: 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68  te3Select() migh
cb90: 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64  t refill p->pOrd
cba0: 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42  erBy..      ** B
cbb0: 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65  e sure to delete
cbc0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68   p->pOrderBy, th
cbd0: 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69  erefore, to avoi
cbe0: 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e  d a memory leak.
cbf0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
cc00: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
cc10: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
cc20: 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
cc30: 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
cc40: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
cc50: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
cc60: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
cc70: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
cc80: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
cc90: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
cca0: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
ccb0: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
ccc0: 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
ccd0: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b    p->iLimit = 0;
cce0: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
ccf0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
cd00: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
cd10: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
cd20: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a  _end;.      }...
cd30: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
cd40: 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
cd50: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
cd60: 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
cd70: 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  orm.      ** it 
cd80: 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
cd90: 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
cda0: 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20   */      .      
cdb0: 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d  if( dest.eDest!=
cdc0: 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e  priorOp || union
cdd0: 54 61 62 21 3d 64 65 73 74 2e 69 50 61 72 6d 20  Tab!=dest.iParm 
cde0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
cdf0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
ce00: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  tart;.        as
ce10: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
ce20: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
ce30: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
ce40: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
ce50: 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
ce60: 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  t = p;.         
ce70: 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
ce80: 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
ce90: 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
cea0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65  ;.          gene
ceb0: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
cec0: 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
ced0: 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  t->pEList);.    
cee0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42      }.        iB
cef0: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
cf00: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
cf10: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
cf20: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
cf30: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
cf40: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
cf50: 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
cf60: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
cf70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cf80: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
cf90: 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
cfa0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53  eak);.        iS
cfb0: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
cfc0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
cfd0: 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
cfe0: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
cff0: 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
d000: 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c  unionTab, p->pEL
d010: 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74      0, -1, &dest
d040: 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
d050: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d060: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
d070: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
d080: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d090: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
d0a0: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
d0b0: 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  art);.        sq
d0c0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d0d0: 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
d0e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d0f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d100: 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
d110: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
d120: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d130: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
d140: 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20  TERSECT: {.     
d150: 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
d160: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
d170: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
d180: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
d190: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
d1a0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
d1b0: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
d1c0: 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
d1d0: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20        int r1;.. 
d1e0: 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
d1f0: 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
d200: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
d210: 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
d220: 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
d230: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
d240: 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
d250: 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
d260: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
d270: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
d280: 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
d290: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
d2a0: 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
d2b0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
d2c0: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
d2d0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ab++;.      asse
d2e0: 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
d2f0: 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  =0 );..      add
d300: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
d310: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
d320: 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
d330: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
d340: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
d350: 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
d360: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
d370: 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
d380: 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
d390: 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ost->selFlags |=
d3a0: 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
d3b0: 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
d3c0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
d3d0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
d3e0: 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
d3f0: 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
d400: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
d410: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d420: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
d430: 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
d440: 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
d450: 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 72  , tab1);.      r
d460: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
d470: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
d480: 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
d490: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
d4a0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
d4b0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
d4c0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
d4d0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
d4e0: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
d4f0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
d500: 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
d510: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
d520: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d530: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
d540: 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
d550: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
d560: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
d570: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
d580: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
d590: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
d5a0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
d5b0: 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
d5c0: 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
d5d0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
d5e0: 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
d5f0: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
d600: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
d610: 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
d620: 65 73 74 2e 69 50 61 72 6d 20 3d 20 74 61 62 32  est.iParm = tab2
d630: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d640: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
d650: 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74  e, p, &intersect
d660: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 44 65  dest);.      pDe
d670: 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
d680: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
d690: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
d6a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
d6b0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
d6c0: 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
d6d0: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
d6e0: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
d6f0: 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
d700: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
d710: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
d720: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
d730: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
d740: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
d750: 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
d760: 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
d770: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20  porary.      ** 
d780: 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f  tables..      */
d790: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d7a0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
d7b0: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
d7c0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
d7d0: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
d7e0: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
d7f0: 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
d800: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
d810: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
d820: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e  ior;.        gen
d830: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
d840: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
d850: 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
d860: 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
d870: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
d880: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
d890: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
d8a0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d8b0: 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  v);.      comput
d8c0: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
d8d0: 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
d8e0: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
d8f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d900: 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20  P_Rewind, tab1, 
d910: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 72  iBreak);.      r
d920: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
d930: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
d940: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
d950: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d960: 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61  v, OP_RowKey, ta
d970: 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  b1, r1);.      s
d980: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d990: 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
d9a0: 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31   tab2, iCont, r1
d9b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d9c0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
d9d0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
d9e0: 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
d9f0: 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
da00: 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d  pEList, tab1, p-
da10: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65        0, -1, &de
da40: 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
da50: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
da60: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
da70: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
da80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
da90: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
daa0: 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a   tab1, iStart);.
dab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dac0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
dad0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
dae0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
daf0: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
db00: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
db10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
db20: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
db30: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  b1, 0);.      br
db40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
db50: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
db60: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
db70: 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
db80: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
db90: 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
dba0: 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ent the compound
dbb0: 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74   select..  ** At
dbc0: 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f  tach the KeyInfo
dbd0: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c   structure to al
dbe0: 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  l temporary tabl
dbf0: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
dc00: 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
dc10: 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
dc20: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
dc30: 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
dc40: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
dc50: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
dc60: 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
dc70: 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
dc80: 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
dc90: 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
dca0: 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
dcb0: 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
dcc0: 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
dcd0: 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
dce0: 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
dcf0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
dd00: 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70  lags & SF_UsesEp
dd10: 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69  hemeral ){.    i
dd20: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd40: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
dd50: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
dd60: 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
dd70: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
dd80: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
dd90: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
dda0: 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddc0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
ddd0: 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
dde0: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
ddf0: 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c  CollSeq **apColl
de00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
de10: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
de20: 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ough pKeyInfo->a
de30: 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  Coll[] */.    in
de40: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
de50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
de60: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
de70: 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a   in result set *
de80: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
de90: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20  ->pRightmost==p 
dea0: 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
deb0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
dec0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
ded0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
dee0: 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20  ro(db,.         
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
df00: 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b  zeof(*pKeyInfo)+
df10: 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  nCol*(sizeof(Col
df20: 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20  lSeq*) + 1));.  
df30: 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
df40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
df50: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
df60: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
df70: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
df80: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e      pKeyInfo->en
df90: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
dfa0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
dfb0: 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 0a  d = (u16)nCol;..
dfc0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
dfd0: 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
dfe0: 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
dff0: 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
e000: 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
e010: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
e020: 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
e030: 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
e040: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
e050: 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
e060: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
e070: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
e080: 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
e090: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
e0a0: 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
e0b0: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
e0c0: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
e0d0: 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
e0e0: 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
e0f0: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
e100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
e110: 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
e120: 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
e130: 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
e140: 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
e150: 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
e160: 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
e170: 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
e180: 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
e190: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
e1a0: 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
e1b0: 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
e1c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e1d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e1e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
e1f0: 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
e200: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
e210: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
e220: 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
e230: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
e240: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
e250: 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
e260: 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
e270: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
e280: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e290: 20 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a   pKeyInfo);.  }.
e2a0: 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
e2b0: 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d  d:.  pDest->iMem
e2c0: 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b 0a 20 20   = dest.iMem;.  
e2d0: 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65  pDest->nMem = de
e2e0: 73 74 2e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  st.nMem;.  sqlit
e2f0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
e300: 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72  b, pDelete);.  r
e310: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
e320: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
e330: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
e340: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  T */../*.** Code
e350: 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f   an output subro
e360: 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f  utine for a coro
e370: 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61  utine implementa
e380: 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c  tion of a.** SEL
e390: 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a  ECT statment..**
e3a0: 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20  .** The data to 
e3b0: 62 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e  be output is con
e3c0: 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69  tained in pIn->i
e3d0: 4d 65 6d 2e 20 20 54 68 65 72 65 20 61 72 65 0a  Mem.  There are.
e3e0: 2a 2a 20 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c  ** pIn->nMem col
e3f0: 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75  umns to be outpu
e400: 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65  t.  pDest is whe
e410: 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  re the output sh
e420: 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e  ould.** be sent.
e430: 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e  .**.** regReturn
e440: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
e450: 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68  f the register h
e460: 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  olding the subro
e470: 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20  utine.** return 
e480: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  address..**.** I
e490: 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
e4a0: 20 69 74 20 69 73 20 61 20 74 68 65 20 66 69 72   it is a the fir
e4b0: 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61  st register in a
e4c0: 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20   vector that.** 
e4d0: 72 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76  records the prev
e4e0: 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65  ious output.  me
e4f0: 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20  m[regPrev] is a 
e500: 66 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c  flag that is fal
e510: 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68  se.** if there h
e520: 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69  as been no previ
e530: 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20  ous output.  If 
e540: 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63  regPrev>0 then c
e550: 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61  ode is.** genera
e560: 74 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20  ted to suppress 
e570: 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65  duplicates.  pKe
e580: 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f  yInfo is used fo
e590: 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b  r comparing.** k
e5a0: 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eys..**.** If th
e5b0: 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e  e LIMIT found in
e5c0: 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65   p->iLimit is re
e5d0: 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65  ached, jump imme
e5e0: 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42  diately to.** iB
e5f0: 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reak..*/.static 
e600: 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70  int generateOutp
e610: 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20  utSubroutine(.  
e620: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e630: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e640: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e650: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
e660: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
e670: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
e680: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
e690: 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  *pIn,        /* 
e6a0: 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79  Coroutine supply
e6b0: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65  ing data */.  Se
e6c0: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
e6d0: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
e6e0: 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20  o send the data 
e6f0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
e700: 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rn,          /* 
e710: 54 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65  The return addre
e720: 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ss register */. 
e730: 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20   int regPrev,   
e740: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
e750: 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69  ious result regi
e760: 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65  ster.  No unique
e770: 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b  ness if 0 */.  K
e780: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
e790: 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f  ,      /* For co
e7a0: 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65  mparing with pre
e7b0: 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20  vious entry */. 
e7c0: 20 69 6e 74 20 70 34 74 79 70 65 2c 20 20 20 20   int p4type,    
e7d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e7e0: 70 34 20 74 79 70 65 20 66 6f 72 20 70 4b 65 79  p4 type for pKey
e7f0: 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42  Info */.  int iB
e800: 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
e810: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
e820: 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d  f we hit the LIM
e830: 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  IT */.){.  Vdbe 
e840: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
e850: 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69  be;.  int iConti
e860: 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  nue;.  int addr;
e870: 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ..  addr = sqlit
e880: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e890: 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75  r(v);.  iContinu
e8a0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
e8b0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
e8c0: 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70 6c  /* Suppress dupl
e8d0: 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e  icates for UNION
e8e0: 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
e8f0: 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20  TERSECT .  */.  
e900: 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20  if( regPrev ){. 
e910: 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20     int j1, j2;. 
e920: 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
e930: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
e940: 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b  IfNot, regPrev);
e950: 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65  .    j2 = sqlite
e960: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
e970: 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e  P_Compare, pIn->
e980: 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c  iMem, regPrev+1,
e990: 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20   pIn->nMem,.    
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9b0: 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
e9c0: 29 70 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79 70  )pKeyInfo, p4typ
e9d0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
e9e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
e9f0: 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e  Jump, j2+2, iCon
ea00: 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20  tinue, j2+2);.  
ea10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
ea20: 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
ea30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
ea40: 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49  eCopy(pParse, pI
ea50: 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76  n->iMem, regPrev
ea60: 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a  +1, pIn->nMem);.
ea70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ea80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
ea90: 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29  ger, 1, regPrev)
eaa0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
eab0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
eac0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
ead0: 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
eae0: 74 68 65 20 74 68 65 20 66 69 72 73 74 20 4f 46  the the first OF
eaf0: 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20  FSET entries if 
eb00: 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53  there is an OFFS
eb10: 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  ET clause.  */. 
eb20: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
eb30: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20  , iContinue);.. 
eb40: 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e   switch( pDest->
eb50: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
eb60: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
eb70: 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
eb80: 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
eb90: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
eba0: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
ebb0: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
ebc0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
ebd0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
ebe0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
ebf0: 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
ec00: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
ec10: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
ec20: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ec30: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
ec40: 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e  In->iMem, pIn->n
ec50: 4d 65 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Mem, r1);.      
ec60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ec70: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
ec80: 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
ec90: 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
eca0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ecb0: 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74  OP_Insert, pDest
ecc0: 2d 3e 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  ->iParm, r1, r2)
ecd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ece0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
ecf0: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
ed00: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
ed10: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
ed20: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  e, r2);.      sq
ed30: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
ed40: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
ed50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ed60: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
ed70: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
ed80: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
ed90: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
eda0: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
edb0: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
edc0: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
edd0: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
ede0: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
edf0: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
ee00: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
ee10: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
ee20: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
ee30: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
ee40: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
ee50: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
ee60: 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73  int r1;.      as
ee70: 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d  sert( pIn->nMem=
ee80: 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  =1 );.      p->a
ee90: 66 66 69 6e 69 74 79 20 3d 20 0a 20 20 20 20 20  ffinity = .     
eea0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61      sqlite3Compa
eeb0: 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45  reAffinity(p->pE
eec0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
eed0: 2c 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74  , pDest->affinit
eee0: 79 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  y);.      r1 = s
eef0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
ef00: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
ef10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ef20: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
ef30: 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31  rd, pIn->iMem, 1
ef40: 2c 20 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69  , r1, &p->affini
ef50: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ty, 1);.      sq
ef60: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
ef70: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
ef80: 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  rse, pIn->iMem, 
ef90: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
efa0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
efb0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
efc0: 73 74 2d 3e 69 50 61 72 6d 2c 20 72 31 29 3b 0a  st->iParm, r1);.
efd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
efe0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
eff0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
f000: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
f010: 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63   0  /* Never occ
f020: 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20  urs on an ORDER 
f030: 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  BY query */.    
f040: 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
f050: 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
f060: 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
f070: 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
f080: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
f090: 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
f0a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f0b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
f0c0: 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74  nteger, 1, pDest
f0d0: 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  ->iParm);.      
f0e0: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
f0f0: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
f100: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
f110: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
f120: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
f130: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
f140: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
f150: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
f160: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
f170: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
f180: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
f190: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
f1a0: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
f1b0: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
f1c0: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
f1d0: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
f1e0: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
f1f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f200: 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20  In->nMem==1 );. 
f210: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f220: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
f230: 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73   pIn->iMem, pDes
f240: 74 2d 3e 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  t->iParm, 1);.  
f250: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
f260: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
f270: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
f280: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
f290: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
f2a0: 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
f2b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
f2c0: 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
f2d0: 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
f2e0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
f2f0: 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
f300: 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
f310: 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 4d 65  ng at pDest->iMe
f320: 6d 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  m.  Then the co-
f330: 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
f340: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
f350: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
f360: 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
f370: 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20  ->iMem==0 ){.   
f380: 20 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d       pDest->iMem
f390: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
f3a0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
f3b0: 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  In->nMem);.     
f3c0: 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d     pDest->nMem =
f3d0: 20 70 49 6e 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20   pIn->nMem;.    
f3e0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
f3f0: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
f400: 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  arse, pIn->iMem,
f410: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 70 44   pDest->iMem, pD
f420: 65 73 74 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  est->nMem);.    
f430: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f440: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
f450: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a   pDest->iParm);.
f460: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f470: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6c   }..    /* Resul
f480: 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
f490: 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
f4a0: 65 67 69 73 74 65 72 73 2e 20 20 54 68 65 6e 20  egisters.  Then 
f4b0: 74 68 65 0a 20 20 20 20 2a 2a 20 4f 50 5f 52 65  the.    ** OP_Re
f4c0: 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69  sultRow opcode i
f4d0: 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20  s used to cause 
f4e0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74  sqlite3_step() t
f4f0: 6f 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  o return.    ** 
f500: 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  the next row of 
f510: 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20  result..    */. 
f520: 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70     case SRT_Outp
f530: 75 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ut: {.      sqli
f540: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f550: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
f560: 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e  In->iMem, pIn->n
f570: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
f580: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
f590: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
f5a0: 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49  e, pIn->iMem, pI
f5b0: 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20  n->nMem);.      
f5c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
f5d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
f5e0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a  E_OMIT_TRIGGER).
f5f0: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
f600: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
f610: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
f620: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
f630: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
f640: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
f650: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
f660: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
f670: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
f680: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
f690: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
f6a0: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
f6b0: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
f6c0: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
f6d0: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
f6e0: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
f6f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
f700: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72  ault: {.      br
f710: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
f720: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
f730: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
f740: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
f750: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
f760: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
f770: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
f780: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f790: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e  , OP_AddImm, p->
f7a0: 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20  iLimit, -1);.   
f7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f7c0: 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p2(v, OP_IfZero,
f7d0: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
f7e0: 61 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ak);.  }..  /* G
f7f0: 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72  enerate the subr
f800: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20  outine return.  
f810: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
f820: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
f830: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71  iContinue);.  sq
f840: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
f850: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
f860: 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74  gReturn);..  ret
f870: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
f880: 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63  ** Alternative c
f890: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63  ompound select c
f8a0: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f  ode generator fo
f8b0: 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65  r cases when the
f8c0: 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45  re.** is an ORDE
f8d0: 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  R BY clause..**.
f8e0: 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71  ** We assume a q
f8f0: 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c  uery of the foll
f900: 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  owing form:.**.*
f910: 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e  *      <selectA>
f920: 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73    <operator>  <s
f930: 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42  electB>  ORDER B
f940: 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a  Y <orderbylist>.
f950: 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  **.** <operator>
f960: 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e   is one of UNION
f970: 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43   ALL, UNION, EXC
f980: 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
f990: 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20  T.  The idea.** 
f9a0: 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20  is to code both 
f9b0: 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73  <selectA> and <s
f9c0: 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65  electB> with the
f9d0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f9e0: 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e   as.** co-routin
f9f0: 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68  es.  Then run th
fa00: 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e  e co-routines in
fa10: 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65   parallel and me
fa20: 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rge the results.
fa30: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ** into the outp
fa40: 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  ut.  In addition
fa50: 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f   to the two coro
fa60: 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73  utines (called s
fa70: 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65  electA and.** se
fa80: 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65  lectB) there are
fa90: 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a   7 subroutines:.
faa0: 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20  **.**    outA:  
fab0: 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
fac0: 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41  t of the selectA
fad0: 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
fae0: 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
faf0: 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
fb00: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
fb10: 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  .**.**    outB: 
fb20: 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
fb30: 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
fb40: 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  B coroutine into
fb50: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
fb60: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
fb70: 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
fb80: 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74  .  (Only generat
fb90: 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64  ed for UNION and
fba0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
fbb0: 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45  UNION ALL.  EXCE
fbc0: 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43  PT and INSERTSEC
fbd0: 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61  T never output a
fbe0: 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20   row that.**    
fbf0: 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73           appears
fc00: 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a   only in B.).**.
fc10: 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43  **    AltB:    C
fc20: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
fc30: 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
fc40: 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
fc50: 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A<B..**.**    
fc60: 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AeqB:    Called 
fc70: 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
fc80: 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
fc90: 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42  outines and A==B
fca0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a  ..**.**    AgtB:
fcb0: 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
fcc0: 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
fcd0: 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
fce0: 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a  es and A>B..**.*
fcf0: 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61  *    EofA:    Ca
fd00: 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
fd10: 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
fd20: 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20   selectA..**.** 
fd30: 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c     EofB:    Call
fd40: 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
fd50: 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
fd60: 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68  electB..**.** Th
fd70: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
fd80: 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66   of the latter f
fd90: 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20  ive subroutines 
fda0: 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20  depend on which 
fdb0: 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
fdc0: 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a  s used:.**.**.**
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
fde0: 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55  ON ALL         U
fdf0: 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20  NION            
fe00: 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20  EXCEPT          
fe10: 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20  INTERSECT.**    
fe20: 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
fe30: 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
fe40: 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
fe50: 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
fe60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41  ---------.**   A
fe70: 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ltB:   outA, nex
fe80: 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
fe90: 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
fea0: 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
feb0: 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42  xtA.**.**   AeqB
fec0: 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
fed0: 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
fee0: 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20            nextA 
fef0: 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65          outA, ne
ff00: 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42  xtA.**.**   AgtB
ff10: 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
ff20: 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
ff30: 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20            nextB 
ff40: 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42             nextB
ff50: 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20  .**.**   EofA:  
ff60: 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
ff70: 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
ff80: 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20         halt     
ff90: 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
ffa0: 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74  **   EofB:   out
ffb0: 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
ffc0: 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
ffd0: 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
ffe0: 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49      halt.**.** I
fff0: 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42  n the AltB, AeqB
10000 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f  , and AgtB subro
10010 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f  utines, an EOF o
10020 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n A following ne
10030 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e  xtA.** causes an
10040 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
10050 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45  to EofA and an E
10060 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e  OF on B followin
10070 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a  g nextB causes.*
10080 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  * an immediate j
10090 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69  ump to EofB.  Wi
100a0 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f  thin EofA and Eo
100b0 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65  fB, and EOF on e
100c0 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f  ntry or.** follo
100d0 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65  wing nextX cause
100e0 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  s a jump to the 
100f0 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63  end of the selec
10100 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  t processing..**
10110 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65  .** Duplicate re
10120 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49  moval in the UNI
10130 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
10140 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20  INTERSECT cases 
10150 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69  is handled.** wi
10160 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  thin the output 
10170 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
10180 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65   regPrev registe
10190 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20  r set holds the 
101a0 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75  previously.** ou
101b0 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63  tput value.  A c
101c0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64  omparison is mad
101d0 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76  e against this v
101e0 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74  alue and the out
101f0 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65  put.** is skippe
10200 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65  d if the next re
10210 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74  sults would be t
10220 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70  he same as the p
10230 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54  revious..**.** T
10240 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
10250 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70  n plan is to imp
10260 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63  lement the two c
10270 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65  oroutines and se
10280 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e  ven.** subroutin
10290 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70  es first, then p
102a0 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c  ut the control l
102b0 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74  ogic at the bott
102c0 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a  om.  Like this:.
102d0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67  **.**          g
102e0 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20  oto Init.**     
102f0 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coA: coroutine f
10300 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41  or left query (A
10310 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f  ).**     coB: co
10320 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68  routine for righ
10330 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20  t query (B).**  
10340 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f    outA: output o
10350 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20  ne row of A.**  
10360 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f    outB: output o
10370 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49  ne row of B (UNI
10380 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c  ON and UNION ALL
10390 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66   only).**    Eof
103a0 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66  A: ....**    Eof
103b0 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74  B: ....**    Alt
103c0 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71  B: ....**    Aeq
103d0 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74  B: ....**    Agt
103e0 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69  B: ....**    Ini
103f0 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  t: initialize co
10400 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
10410 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  s.**          yi
10420 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20  eld coA.**      
10430 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f      if eof(A) go
10440 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20  to EofA.**      
10450 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a      yield coB.**
10460 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
10470 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a  (B) goto EofB.**
10480 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72      Cmpr: Compar
10490 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20  e A, B.**       
104a0 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65     Jump AltB, Ae
104b0 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20  qB, AgtB.**     
104c0 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57  End: ....**.** W
104d0 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71  e call AltB, Aeq
104e0 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61  B, AgtB, EofA, a
104f0 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74  nd EofB "subrout
10500 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61  ines" but they a
10510 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c  re not.** actual
10520 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20  ly called using 
10530 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64  Gosub and they d
10540 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45  o not Return.  E
10550 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f  ofA and EofB loo
10560 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64  p.** until all d
10570 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
10580 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68   then jump to th
10590 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41  e "end" labe.  A
105a0 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e  ltB, AeqB,.** an
105b0 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65  d AgtB jump to e
105c0 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f  ither L2 or to o
105d0 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f  ne of EofA or Eo
105e0 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  fB..*/.#ifndef S
105f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
10600 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69  UND_SELECT.stati
10610 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
10620 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
10630 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
10640 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
10650 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
10660 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
10670 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
10680 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
10690 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
106a0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
106b0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
106c0 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
106d0 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
106e0 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
106f0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10700 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ers */.  Select 
10710 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
10720 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
10730 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
10740 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
10750 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
10760 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
10770 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
10780 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
10790 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20  t destA;     /* 
107a0 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
107b0 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20  coroutine A */. 
107c0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
107d0 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  B;     /* Destin
107e0 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
107f0 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72  ine B */.  int r
10800 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20  egAddrA;        
10810 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
10820 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
10830 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
10840 20 69 6e 74 20 72 65 67 45 6f 66 41 3b 20 20 20   int regEofA;   
10850 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74         /* Flag t
10860 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20  o indicate when 
10870 73 65 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d 70  select-A is comp
10880 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  lete */.  int re
10890 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20  gAddrB;         
108a0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
108b0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42  ter for select-B
108c0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
108d0 69 6e 74 20 72 65 67 45 6f 66 42 3b 20 20 20 20  int regEofB;    
108e0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f        /* Flag to
108f0 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73   indicate when s
10900 65 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d 70 6c  elect-B is compl
10910 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ete */.  int add
10920 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
10930 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
10940 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
10950 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
10960 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
10970 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
10980 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
10990 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
109a0 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
109b0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
109c0 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
109d0 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
109e0 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
109f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
10a00 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
10a10 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
10a20 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
10a30 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
10a40 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
10a50 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
10a60 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
10a70 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30  int addrOutB = 0
10a80 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
10a90 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
10aa0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
10ab0 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
10ac0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
10ad0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
10ae0 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
10af0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10b00 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20  addrEofB;       
10b10 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10b20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68  the select-B-exh
10b30 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
10b40 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
10b50 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ltB;         /* 
10b60 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
10b70 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  <B subroutine */
10b80 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b  .  int addrAeqB;
10b90 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
10ba0 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20  ess of the A==B 
10bb0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
10bc0 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20  int addrAgtB;   
10bd0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10be0 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72   of the A>B subr
10bf0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10c00 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20  regLimitA;      
10c10 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
10c20 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
10c30 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
10c40 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itB;        /* L
10c50 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
10c60 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
10c70 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20  int regPrev;    
10c80 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65        /* A range
10c90 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
10ca0 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f   hold previous o
10cb0 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73  utput */.  int s
10cc0 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20  avedLimit;      
10cd0 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
10ce0 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a  of p->iLimit */.
10cf0 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65    int savedOffse
10d00 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  t;      /* Saved
10d10 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66   value of p->iOf
10d20 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  fset */.  int la
10d30 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20  belCmpr;        
10d40 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
10d50 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65   start of the me
10d60 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f  rge algorithm */
10d70 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b  .  int labelEnd;
10d80 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
10d90 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  l for the end of
10da0 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c   the overall SEL
10db0 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e  ECT stmt */.  in
10dc0 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20  t j1;           
10dd0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74      /* Jump inst
10de0 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65  ructions that ge
10df0 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f  t retargetted */
10e00 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
10e10 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
10e20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e  of TK_ALL, TK_UN
10e30 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20  ION, TK_EXCEPT, 
10e40 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a  TK_INTERSECT */.
10e50 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44    KeyInfo *pKeyD
10e60 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61  up = 0; /* Compa
10e70 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
10e80 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  n for duplicate 
10e90 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79  removal */.  Key
10ea0 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b  Info *pKeyMerge;
10eb0 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
10ec0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
10ed0 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f   merging rows */
10ee0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
10ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
10f00 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
10f10 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10f20 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68  OrderBy;   /* Th
10f30 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
10f40 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
10f50 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
10f60 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
10f70 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
10f80 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
10f90 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20  *aPermute;      
10fa0 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
10fb0 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  m ORDER BY terms
10fc0 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63   to result set c
10fd0 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73  olumns */..  ass
10fe0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
10ff0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
11000 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f   pKeyDup==0 ); /
11010 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65  * "Managed" code
11020 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69   needs this.  Ti
11030 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20  cket #3382. */. 
11040 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
11050 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
11060 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
11070 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
11080 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6c 61 62 65 6c  E_NOMEM;.  label
11090 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
110a0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
110b0 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c   labelCmpr = sql
110c0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
110d0 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74  l(v);...  /* Pat
110e0 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20  ch up the ORDER 
110f0 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  BY clause.  */. 
11100 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20   op = p->op;  . 
11110 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
11120 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
11130 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d  Prior->pOrderBy=
11140 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79  =0 );.  pOrderBy
11150 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
11160 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
11170 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79  By );.  nOrderBy
11180 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
11190 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70  pr;..  /* For op
111a0 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68  erators other th
111b0 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20  an UNION ALL we 
111c0 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  have to make sur
111d0 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  e that.  ** the 
111e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
111f0 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72  covers every ter
11200 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
11210 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74  set.  Add.  ** t
11220 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45  erms to the ORDE
11230 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e  R BY clause as n
11240 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
11250 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20   if( op!=TK_ALL 
11260 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
11270 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11280 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c  ==0 && i<=p->pEL
11290 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
112a0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
112b0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
112c0 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  tem;.      for(j
112d0 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
112e0 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42  By->a; j<nOrderB
112f0 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; j++, pItem++)
11300 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
11310 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20  ( pItem->iCol>0 
11320 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
11330 49 74 65 6d 2d 3e 69 43 6f 6c 3d 3d 69 20 29 20  Item->iCol==i ) 
11340 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
11350 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64       if( j==nOrd
11360 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
11370 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
11380 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
11390 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c  , TK_INTEGER, 0,
113a0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
113b0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
113c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
113d0 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
113e0 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
113f0 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
11400 4e 65 77 2d 3e 69 54 61 62 6c 65 20 3d 20 69 3b  New->iTable = i;
11410 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
11420 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
11430 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
11440 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77  , pOrderBy, pNew
11450 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  , 0);.        pO
11460 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72  rderBy->a[nOrder
11470 42 79 2b 2b 5d 2e 69 43 6f 6c 20 3d 20 28 75 31  By++].iCol = (u1
11480 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  6)i;.      }.   
11490 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
114a0 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  pute the compari
114b0 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  son permutation 
114c0 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74  and keyinfo that
114d0 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20   is used with.  
114e0 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  ** the permutati
114f0 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  on used to deter
11500 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
11510 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
11520 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
11530 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
11540 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
11550 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
11560 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
11570 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
11580 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
11590 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
115a0 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
115b0 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
115c0 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
115d0 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
115e0 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
115f0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
11600 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
11610 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
11620 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79  of(int)*nOrderBy
11630 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74  );.  if( aPermut
11640 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
11650 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
11660 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Item;.    for(i=
11670 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
11680 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79  y->a; i<nOrderBy
11690 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
116a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
116b0 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 20 26 26  Item->iCol>0  &&
116c0 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3c 3d 70 2d   pItem->iCol<=p-
116d0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
116e0 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65  ;.      aPermute
116f0 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 69 43 6f  [i] = pItem->iCo
11700 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  l - 1;.    }.   
11710 20 70 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20 20   pKeyMerge =.   
11720 20 20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c     sqlite3DbMall
11730 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
11740 28 2a 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f 72  (*pKeyMerge)+nOr
11750 64 65 72 42 79 2a 28 73 69 7a 65 6f 66 28 43 6f  derBy*(sizeof(Co
11760 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 20  llSeq*)+1));.   
11770 20 69 66 28 20 70 4b 65 79 4d 65 72 67 65 20 29   if( pKeyMerge )
11780 7b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67  {.      pKeyMerg
11790 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  e->aSortOrder = 
117a0 28 75 38 2a 29 26 70 4b 65 79 4d 65 72 67 65 2d  (u8*)&pKeyMerge-
117b0 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d  >aColl[nOrderBy]
117c0 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67  ;.      pKeyMerg
117d0 65 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36  e->nField = (u16
117e0 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  )nOrderBy;.     
117f0 20 70 4b 65 79 4d 65 72 67 65 2d 3e 65 6e 63 20   pKeyMerge->enc 
11800 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20  = ENC(db);.     
11810 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
11820 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
11830 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
11840 6c 6c 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  ll;.        Expr
11850 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72   *pTerm = pOrder
11860 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
11870 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
11880 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  m->flags & EP_Ex
11890 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
118a0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 54        pColl = pT
118b0 65 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  erm->pColl;.    
118c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
118d0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c       pColl = mul
118e0 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
118f0 70 50 61 72 73 65 2c 20 70 2c 20 61 50 65 72 6d  pParse, p, aPerm
11900 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ute[i]);.       
11910 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20     pTerm->flags 
11920 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  |= EP_ExpCollate
11930 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  ;.          pTer
11940 6d 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  m->pColl = pColl
11950 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11960 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61      pKeyMerge->a
11970 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b  Coll[i] = pColl;
11980 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72  .        pKeyMer
11990 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ge->aSortOrder[i
119a0 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
119b0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
119c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
119d0 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72  lse{.    pKeyMer
119e0 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ge = 0;.  }..  /
119f0 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f  * Reattach the O
11a00 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
11a10 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  o the query..  *
11a20 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  /.  p->pOrderBy 
11a30 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50  = pOrderBy;.  pP
11a40 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d  rior->pOrderBy =
11a50 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
11a60 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
11a70 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20  pOrderBy, 0);.. 
11a80 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72   /* Allocate a r
11a90 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72  ange of temporar
11aa0 79 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  y registers and 
11ab0 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64  the KeyInfo need
11ac0 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  ed.  ** for the 
11ad0 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76  logic that remov
11ae0 65 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73  es duplicate res
11af0 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68  ult rows when th
11b00 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20  e.  ** operator 
11b10 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  is UNION, EXCEPT
11b20 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28  , or INTERSECT (
11b30 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c  but not UNION AL
11b40 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  L)..  */.  if( o
11b50 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
11b60 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20   regPrev = 0;.  
11b70 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
11b80 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
11b90 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->nExpr;.    ass
11ba0 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e  ert( nOrderBy>=n
11bb0 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  Expr || db->mall
11bc0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
11bd0 72 65 67 50 72 65 76 20 3d 20 73 71 6c 69 74 65  regPrev = sqlite
11be0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
11bf0 61 72 73 65 2c 20 6e 45 78 70 72 2b 31 29 3b 0a  arse, nExpr+1);.
11c00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11c10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
11c20 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29  ger, 0, regPrev)
11c30 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20  ;.    pKeyDup = 
11c40 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
11c50 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20  ero(db,.        
11c60 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
11c70 28 2a 70 4b 65 79 44 75 70 29 20 2b 20 6e 45 78  (*pKeyDup) + nEx
11c80 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  pr*(sizeof(CollS
11c90 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20 69  eq*)+1) );.    i
11ca0 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20  f( pKeyDup ){.  
11cb0 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f      pKeyDup->aSo
11cc0 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
11cd0 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e  pKeyDup->aColl[n
11ce0 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b 65  Expr];.      pKe
11cf0 79 44 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28  yDup->nField = (
11d00 75 31 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 20  u16)nExpr;.     
11d10 20 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d 20   pKeyDup->enc = 
11d20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66  ENC(db);.      f
11d30 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
11d40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
11d50 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d  KeyDup->aColl[i]
11d60 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
11d70 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
11d80 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65   i);.        pKe
11d90 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  yDup->aSortOrder
11da0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
11db0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f  .    }.  }. .  /
11dc0 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c  * Separate the l
11dd0 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68  eft and the righ
11de0 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65  t query from one
11df0 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20   another.  */.  
11e00 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
11e10 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
11e20 6f 73 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ost = 0;.  sqlit
11e30 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
11e40 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
11e50 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
11e60 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
11e70 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
11e80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
11e90 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
11ea0 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
11eb0 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
11ec0 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
11ed0 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
11ee0 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
11ef0 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
11f00 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
11f10 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
11f20 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
11f30 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
11f40 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
11f50 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
11f60 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
11f70 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
11f80 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
11f90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11fa0 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
11fb0 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
11fc0 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ff0 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
12000 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12010 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
12020 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
12030 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
12040 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
12050 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
12060 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
12070 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
12080 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
12090 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
120a0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
120b0 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d  ->pOffset);.  p-
120c0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >pOffset = 0;.. 
120d0 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
120e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
120f0 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65  gEofA = ++pParse
12100 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64  ->nMem;.  regAdd
12110 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rB = ++pParse->n
12120 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d  Mem;.  regEofB =
12130 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
12140 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70  .  regOutA = ++p
12150 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
12160 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73  egOutB = ++pPars
12170 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
12180 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
12190 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72  (&destA, SRT_Cor
121a0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
121b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
121c0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
121d0 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  B, SRT_Coroutine
121e0 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
121f0 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65  /* Jump past the
12200 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74   various subrout
12210 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69  ines and corouti
12220 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a  nes to the main.
12230 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a    ** merge loop.
12240 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69    */.  j1 = sqli
12250 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
12260 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64   OP_Goto);.  add
12270 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74  rSelectA = sqlit
12280 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
12290 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e  r(v);...  /* Gen
122a0 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
122b0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
122c0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
122d0 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
122e0 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
122f0 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
12300 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
12310 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
12320 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
12330 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
12340 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
12350 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
12360 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 73  = regLimitA;.  s
12370 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
12380 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
12390 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  stA);.  sqlite3V
123a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
123b0 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45  Integer, 1, regE
123c0 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
123d0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
123e0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
123f0 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
12400 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72  ent((v, "End cor
12410 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20  outine for left 
12420 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a  SELECT"));..  /*
12430 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
12440 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
12450 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
12460 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20  tement on .  ** 
12470 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20  the right - the 
12480 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a  "B" select.  */.
12490 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20    addrSelectB = 
124a0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
124b0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 56 64 62  ntAddr(v);.  Vdb
124c0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
124d0 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e   "Begin coroutin
124e0 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45  e for right SELE
124f0 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69  CT"));.  savedLi
12500 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
12510 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d  .  savedOffset =
12520 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
12530 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
12540 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  mitB;.  p->iOffs
12550 65 74 20 3d 20 30 3b 20 20 0a 20 20 73 71 6c 69  et = 0;  .  sqli
12560 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
12570 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20  , p, &destB);.  
12580 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65  p->iLimit = save
12590 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66  dLimit;.  p->iOf
125a0 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73  fset = savedOffs
125b0 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  et;.  sqlite3Vdb
125c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
125d0 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66  teger, 1, regEof
125e0 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
125f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
12600 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  eld, regAddrB);.
12610 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12620 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75  t((v, "End corou
12630 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53  tine for right S
12640 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20  ELECT"));..  /* 
12650 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
12660 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
12670 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
12680 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a  ow of the A.  **
12690 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
126a0 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
126b0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
126c0 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64  elect..  */.  Vd
126d0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
126e0 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
126f0 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64  e for A"));.  ad
12700 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74  drOutA = generat
12710 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
12720 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
12730 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
12740 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67  estA, pDest, reg
12750 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20  OutA,.          
12760 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
12770 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49  pKeyDup, P4_KEYI
12780 4e 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62  NFO_HANDOFF, lab
12790 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  elEnd);.  .  /* 
127a0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
127b0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
127c0 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
127d0 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a  ow of the B.  **
127e0 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
127f0 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
12800 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
12810 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elect..  */.  if
12820 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
12830 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
12840 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
12850 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
12860 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29  routine for B"))
12870 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d  ;.    addrOutB =
12880 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
12890 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
128a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
128b0 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44     p, &destB, pD
128c0 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20  est, regOutB,.  
128d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
128e0 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
128f0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54   P4_KEYINFO_STAT
12900 49 43 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  IC, labelEnd);. 
12910 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
12920 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
12930 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
12940 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
12950 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct A.  ** are ex
12960 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
12970 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
12980 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  B remains..  */.
12990 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
129a0 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62  t((v, "eof-A sub
129b0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 69 66  routine"));.  if
129c0 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ( op==TK_EXCEPT 
129d0 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
129e0 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
129f0 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
12a00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
12a10 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29  to, 0, labelEnd)
12a20 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
12a30 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
12a40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12a50 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
12a60 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
12a70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12a80 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
12a90 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
12aa0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12ab0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
12ac0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b  ield, regAddrB);
12ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12ae0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
12af0 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b  o, 0, addrEofA);
12b00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
12b10 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
12b20 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
12b30 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
12b40 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20  lect B.  ** are 
12b50 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
12b60 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
12b70 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t A remains..  *
12b80 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  /.  if( op==TK_I
12b90 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
12ba0 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45  addrEofB = addrE
12bb0 6f 66 41 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  ofA;.  }else{  .
12bc0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
12bd0 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
12be0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
12bf0 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
12c00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12c10 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
12c20 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20  , labelEnd);.   
12c30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12c40 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
12c50 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
12c60 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
12c70 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12c80 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
12c90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12ca0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
12cb0 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29  to, 0, addrEofB)
12cc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
12cd0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
12ce0 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
12cf0 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
12d00 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
12d10 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
12d20 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
12d30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12d40 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
12d50 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
12d60 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
12d70 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12d80 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
12d90 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12da0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
12db0 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
12dc0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
12dd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
12de0 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
12df0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
12e00 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
12e10 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d   the case of A==
12e20 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  B.  */.  if( op=
12e30 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61  =TK_ALL ){.    a
12e40 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
12e50 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  tB;.  }else if( 
12e60 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
12e70 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
12e80 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20   = addrAltB;.   
12e90 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d   addrAltB++;.  }
12ea0 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f  else{.    VdbeNo
12eb0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
12ec0 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -eq-B subroutine
12ed0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71  "));.    addrAeq
12ee0 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B =.    sqlite3V
12ef0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12f00 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
12f10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12f20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
12f30 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
12f40 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ofA);.    sqlite
12f50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12f60 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
12f70 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cmpr);.  }..  /*
12f80 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
12f90 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
12fa0 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20  e of A>B.  */.  
12fb0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
12fc0 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72  (v, "A-gt-B subr
12fd0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
12fe0 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAgtB = sqlite3V
12ff0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
13000 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
13010 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
13020 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
13030 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13040 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
13050 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
13060 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
13070 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
13080 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
13090 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
130a0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
130b0 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  ofB, addrEofB);.
130c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
130d0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
130e0 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  0, labelCmpr);..
130f0 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72    /* This code r
13100 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74  uns once to init
13110 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e  ialize everythin
13120 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g..  */.  sqlite
13130 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
13140 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   j1);.  sqlite3V
13150 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13160 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
13170 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
13180 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13190 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
131a0 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
131b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
131c0 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 41 2c  Gosub, regAddrA,
131d0 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
131e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
131f0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
13200 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 53 65  regAddrB, addrSe
13210 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69 74 65  lectB);.  sqlite
13220 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13230 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61  P_If, regEofA, a
13240 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  ddrEofA);.  sqli
13250 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13260 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
13270 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f   addrEofB);..  /
13280 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
13290 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
132a0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
132b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
132c0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
132d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
132e0 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
132f0 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
13300 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
13310 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
13320 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13330 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
13340 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65 73 74  destA.iMem, dest
13350 42 2e 69 4d 65 6d 2c 20 6e 4f 72 64 65 72 42 79  B.iMem, nOrderBy
13360 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13370 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
13380 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f  *)pKeyMerge, P4_
13390 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
133a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
133b0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
133c0 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72  , addrAltB, addr
133d0 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b  AeqB, addrAgtB);
133e0 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74  ..  /* Release t
133f0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
13400 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  rs.  */.  if( re
13410 67 50 72 65 76 20 29 7b 0a 20 20 20 20 73 71 6c  gPrev ){.    sql
13420 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
13430 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
13440 50 72 65 76 2c 20 6e 4f 72 64 65 72 42 79 2b 31  Prev, nOrderBy+1
13450 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
13460 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f  p to the this po
13470 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  int in order to 
13480 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75  terminate the qu
13490 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ery..  */.  sqli
134a0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
134b0 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29  bel(v, labelEnd)
134c0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
134d0 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
134e0 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
134f0 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
13500 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
13510 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
13520 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  st = pPrior;.   
13530 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
13540 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
13550 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
13560 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  ;.    generateCo
13570 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
13580 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
13590 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
135a0 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63  Reassembly the c
135b0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f  ompound query so
135c0 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
135d0 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79   freed correctly
135e0 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  .  ** by the cal
135f0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
13600 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
13610 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
13620 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
13630 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a  p->pPrior);.  }.
13640 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
13650 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42  rior;..  /*** TB
13660 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f  D:  Insert subro
13670 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63  utine calls to c
13680 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  lose cursors on 
13690 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a  incomplete.  ***
136a0 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a  * subqueries ***
136b0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  */.  return SQLI
136c0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
136d0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
136e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
136f0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
13700 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
13710 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63  )./* Forward Dec
13720 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  larations */.sta
13730 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
13740 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c  prList(sqlite3*,
13750 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c   ExprList*, int,
13760 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
13770 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
13780 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53  lect(sqlite3*, S
13790 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78  elect *, int, Ex
137a0 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a  prList *);../*.*
137b0 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
137c0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
137d0 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
137e0 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
137f0 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
13800 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
13810 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
13820 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
13830 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
13840 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
13850 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
13860 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
13870 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
13880 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13890 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
138a0 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
138b0 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
138c0 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
138d0 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
138e0 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
138f0 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
13900 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
13910 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
13920 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
13930 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
13940 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
13950 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
13960 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
13970 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
13980 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
13990 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
139a0 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
139b0 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
139c0 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
139d0 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
139e0 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
139f0 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
13a00 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
13a10 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
13a20 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
13a30 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65  db,        /* Re
13a40 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
13a50 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65  rs to this conne
13a60 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ction */.  Expr 
13a70 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f  *pExpr,        /
13a80 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20  * Expr in which 
13a90 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63  substitution occ
13aa0 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  urs */.  int iTa
13ab0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ble,         /* 
13ac0 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
13ad0 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
13ae0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
13af0 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65   /* Substitute e
13b00 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b  xpressions */.){
13b10 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
13b20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
13b30 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
13b40 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
13b50 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b  Table==iTable ){
13b60 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
13b70 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
13b80 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
13b90 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
13ba0 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
13bb0 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72  New;.      asser
13bc0 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t( pEList!=0 && 
13bd0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
13be0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
13bf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
13c00 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
13c10 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
13c20 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 );.      pNew 
13c30 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  = pEList->a[pExp
13c40 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
13c50 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
13c60 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20   pNew!=0 );.    
13c70 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e    pExpr->op = pN
13c80 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73  ew->op;.      as
13c90 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
13ca0 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ft==0 );.      p
13cb0 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71  Expr->pLeft = sq
13cc0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
13cd0 20 70 4e 65 77 2d 3e 70 4c 65 66 74 2c 20 30 29   pNew->pLeft, 0)
13ce0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13cf0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
13d00 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
13d10 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
13d20 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65  3ExprDup(db, pNe
13d30 77 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  w->pRight, 0);. 
13d40 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
13d50 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c  le = pNew->iTabl
13d60 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e;.      pExpr->
13d70 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61  pTab = pNew->pTa
13d80 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  b;.      pExpr->
13d90 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e  iColumn = pNew->
13da0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
13db0 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65  Expr->iAgg = pNe
13dc0 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73  w->iAgg;.      s
13dd0 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
13de0 64 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65  db, &pExpr->toke
13df0 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29  n, &pNew->token)
13e00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
13e10 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45  okenCopy(db, &pE
13e20 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77  xpr->span, &pNew
13e30 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 61  ->span);.      a
13e40 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e  ssert( pExpr->x.
13e50 70 4c 69 73 74 3d 3d 30 20 26 26 20 70 45 78 70  pList==0 && pExp
13e60 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30 20  r->x.pSelect==0 
13e70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
13e80 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
13e90 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
13ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
13eb0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73  r->x.pSelect = s
13ec0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
13ed0 64 62 2c 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c  db, pNew->x.pSel
13ee0 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ect, 0);.      }
13ef0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 45  else{.        pE
13f00 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73  xpr->x.pList = s
13f10 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
13f20 70 28 64 62 2c 20 70 4e 65 77 2d 3e 78 2e 70 4c  p(db, pNew->x.pL
13f30 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ist, 0);.      }
13f40 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c  .      pExpr->fl
13f50 61 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67  ags = pNew->flag
13f60 73 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  s;.      pExpr->
13f70 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 65 77 2d  pAggInfo = pNew-
13f80 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
13f90 20 70 4e 65 77 2d 3e 70 41 67 67 49 6e 66 6f 20   pNew->pAggInfo 
13fa0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
13fb0 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  se{.    substExp
13fc0 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  r(db, pExpr->pLe
13fd0 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
13fe0 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
13ff0 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52  pr(db, pExpr->pR
14000 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
14010 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45  List);.    if( E
14020 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
14030 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
14040 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62  ct) ){.      sub
14050 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78  stSelect(db, pEx
14060 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69  pr->x.pSelect, i
14070 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
14080 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14090 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
140a0 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  b, pExpr->x.pLis
140b0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
140c0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
140d0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
140e0 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c  tExprList(.  sql
140f0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
14100 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
14110 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
14120 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
14130 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist,     /* List
14140 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
14150 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
14160 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69  bstitutes */.  i
14170 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
14180 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
14190 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
141a0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
141b0 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
141c0 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
141d0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
141e0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
141f0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
14200 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
14210 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74   i++){.    subst
14220 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Expr(db, pList->
14230 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
14240 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
14250 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
14260 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71  ubstSelect(.  sq
14270 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
14280 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
14290 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20  loc errors here 
142a0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
142b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
142c0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
142d0 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
142e0 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a  ubstitutions */.
142f0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
14300 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
14310 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a  to be replaced *
14320 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
14330 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
14340 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
14350 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
14360 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Src;.  struct Sr
14370 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
14380 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
14390 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
143a0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
143b0 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54  b, p->pEList, iT
143c0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
143d0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
143e0 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
143f0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
14400 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
14410 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
14420 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
14430 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 64  );.  substExpr(d
14440 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  b, p->pHaving, i
14450 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
14460 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
14470 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c  p->pWhere, iTabl
14480 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
14490 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d  bstSelect(db, p-
144a0 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c  >pPrior, iTable,
144b0 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63   pEList);.  pSrc
144c0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
144d0 73 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f  sert( pSrc );  /
144e0 2a 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45  * Even for (SELE
144f0 43 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70  CT 1) we have: p
14500 53 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d  Src!=0 but pSrc-
14510 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66  >nSrc==0 */.  if
14520 28 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29  ( ALWAYS(pSrc) )
14530 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63  {.    for(i=pSrc
14540 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53  ->nSrc, pItem=pS
14550 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  rc->a; i>0; i--,
14560 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
14570 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
14580 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
14590 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
145a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
145b0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
145c0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
145d0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
145e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
145f0 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
14600 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14610 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
14620 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14630 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
14640 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
14650 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
14660 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f   subqueries in o
14670 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a  rder to speed.**
14680 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20   execution.  It 
14690 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
146a0 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
146b0 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
146c0 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  ning.** occurs..
146d0 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
146e0 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
146f0 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
14700 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
14710 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
14720 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
14730 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
14740 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
14750 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
14760 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
14770 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
14780 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
14790 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
147a0 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
147b0 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
147c0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
147d0 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
147e0 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
147f0 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
14800 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
14810 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
14820 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
14830 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
14840 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
14850 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
14860 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
14870 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
14880 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
14890 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
148a0 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
148b0 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
148c0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
148d0 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
148e0 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
148f0 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
14900 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
14910 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
14920 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
14930 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
14940 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
14950 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
14960 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
14970 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
14980 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
14990 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
149a0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
149b0 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
149c0 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
149d0 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
149e0 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
149f0 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
14a00 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
14a10 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
14a20 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
14a30 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
14a40 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
14a50 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
14a60 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
14a70 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
14a80 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
14a90 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
14aa0 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
14ab0 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
14ac0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
14ad0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
14ae0 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
14af0 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
14b00 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
14b10 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
14b20 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
14b30 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
14b40 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
14b50 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a  ft outer join.**
14b60 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61          (Origina
14b70 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e  lly ticket #306.
14b80 20 20 53 74 72 65 6e 67 68 74 65 6e 65 64 20 62    Strenghtened b
14b90 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a  y ticket #3300).
14ba0 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
14bb0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
14bc0 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
14bd0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
14be0 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
14bf0 2a 20 20 20 28 35 29 20 20 54 68 65 20 73 75 62  *   (5)  The sub
14c00 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53  query is not DIS
14c10 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74  TINCT or the out
14c20 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
14c30 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
14c40 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
14c50 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62  *   (6)  The sub
14c60 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
14c70 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
14c80 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14c90 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
14ca0 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a    DISTINCT..**.*
14cb0 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62  *   (7)  The sub
14cc0 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d  query has a FROM
14cd0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
14ce0 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
14cf0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
14d00 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
14d10 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
14d20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
14d30 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
14d40 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
14d50 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
14d60 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
14d70 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
14d80 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
14d90 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71    (10)  The subq
14da0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
14db0 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
14dc0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
14dd0 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
14de0 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a     use LIMIT..**
14df0 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
14e00 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
14e10 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
14e20 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
14e30 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
14e40 2a 0a 2a 2a 20 20 28 31 32 29 20 20 4e 6f 74 20  *.**  (12)  Not 
14e50 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75  implemented.  Su
14e60 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
14e70 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61  riction (3).  Wa
14e80 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
14e90 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74         a separat
14ea0 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65  e restriction de
14eb0 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b  riving from tick
14ec0 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20  et #350..**.**  
14ed0 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
14ee0 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
14ef0 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
14f00 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20  se LIMIT.**.**  
14f10 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (14)  The subque
14f20 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
14f30 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31  OFFSET.**.**  (1
14f40 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  5)  The outer qu
14f50 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20  ery is not part 
14f60 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
14f70 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20  lect or the.**  
14f80 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64        subquery d
14f90 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 62 6f 74  oes not have bot
14fa0 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 61 6e  h an ORDER BY an
14fb0 64 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  d a LIMIT clause
14fc0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
14fd0 20 74 69 63 6b 65 74 20 23 32 33 33 39 29 0a 2a   ticket #2339).*
14fe0 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20  *.**  (16)  The 
14ff0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
15000 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
15010 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20  or the subquery 
15020 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e  does.**        n
15030 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  ot contain ORDER
15040 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32   BY.  (Ticket #2
15050 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20  942)  This used 
15060 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a  to not matter.**
15070 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65          until we
15080 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20   introduced the 
15090 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66  group_concat() f
150a0 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  unction.  .**.**
150b0 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d    (17)  The sub-
150c0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
150d0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
150e0 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e  or it is a UNION
150f0 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20   ALL .**        
15100 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20  compound clause 
15110 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79  made up entirely
15120 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74   of non-aggregat
15130 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a  e queries, and .
15140 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61  **        the pa
15150 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  rent query:.**.*
15160 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
15170 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20  not itself part 
15180 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
15190 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20  lect,.**        
151a0 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67    * is not an ag
151b0 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49  gregate or DISTI
151c0 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a  NCT query, and.*
151d0 2a 20 20 20 20 20 20 20 20 20 20 2a 20 68 61 73  *          * has
151e0 20 6e 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 73   no other tables
151f0 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 73 20   or sub-selects 
15200 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
15210 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se..**.**       
15220 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20   The parent and 
15230 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f  sub-query may co
15240 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ntain WHERE clau
15250 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a  ses. Subject to.
15260 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20  **        rules 
15270 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28  (11), (13) and (
15280 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c  14), they may al
15290 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  so contain ORDER
152a0 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c   BY,.**        L
152b0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
152c0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
152d0 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62  (18)  If the sub
152e0 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
152f0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
15300 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
15310 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44  he.**        ORD
15320 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20  ER by clause of 
15330 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20  the parent must 
15340 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65  be simple refere
15350 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20  nces to .**     
15360 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68     columns of th
15370 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a  e sub-query..**.
15380 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73 75  **  (19)  The su
15390 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
153a0 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
153b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
153c0 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
153d0 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61  have a WHERE cla
153e0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29  use..**.**  (20)
153f0 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
15400 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
15410 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74   select, then it
15420 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a   must not use.**
15430 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52          an ORDER
15440 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63   BY clause.  Tic
15450 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63  ket #3773.  We c
15460 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20  ould relax this 
15470 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20  constraint.**   
15480 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79       somewhat by
15490 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65   saying that the
154a0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
154b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75  DER BY clause mu
154c0 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70  st.**        app
154d0 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65  ear as unmodifie
154e0 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  d result columns
154f0 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
15500 65 72 79 2e 20 20 42 75 74 0a 2a 2a 20 20 20 20  ery.  But.**    
15510 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f      have other o
15520 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20  ptimizations in 
15530 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74  mind to deal wit
15540 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a  h that case..**.
15550 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
15560 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
15570 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
15580 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
15590 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
155a0 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
155b0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
155c0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
155d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
155e0 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
155f0 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
15600 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
15610 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
15620 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
15630 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
15640 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
15650 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
15660 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
15670 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
15680 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
15690 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
156a0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
156b0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
156c0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
156d0 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
156e0 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
156f0 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
15700 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
15710 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
15720 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
15730 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
15740 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
15750 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
15760 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
15770 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
15780 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15790 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
157a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
157b0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
157c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
157d0 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
157e0 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
157f0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
15800 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
15810 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
15820 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
15830 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
15840 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
15850 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
15860 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
15870 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
15880 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
15890 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
158a0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
158b0 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
158c0 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
158d0 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
158e0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
158f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
15900 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
15910 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c  bquery" */.  Sel
15920 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20  ect *pSub1;     
15930 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
15940 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c  he rightmost sel
15950 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79  ect in sub-query
15960 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
15970 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
15980 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
15990 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
159a0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
159b0 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
159c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
159d0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
159e0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
159f0 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
15a00 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
15a10 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
15a20 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
15a30 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
15a40 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
15a50 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
15a60 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
15a70 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
15a80 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
15a90 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
15aa0 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
15ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15ac0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
15ad0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
15ae0 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
15af0 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
15b00 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
15b10 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
15b20 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
15b30 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
15b40 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
15b50 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
15b60 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
15b70 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
15b80 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
15b90 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20  0 );  /* Unable 
15ba0 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f  to flatten compo
15bb0 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  und queries */. 
15bc0 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
15bd0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
15be0 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
15bf0 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
15c00 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
15c10 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
15c20 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
15c30 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
15c40 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65    pSub = pSubite
15c50 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m->pSelect;.  as
15c60 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
15c70 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
15c80 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
15c90 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
15ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
15cb0 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f  triction (1)  */
15cc0 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
15cd0 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53  sAgg && pSrc->nS
15ce0 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  rc>1 ) return 0;
15cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
15d00 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f  triction (2)  */
15d10 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
15d20 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
15d30 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
15d40 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73  /* Prior to vers
15d50 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20  ion 3.1.2, when 
15d60 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
15d70 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c   had to be simpl
15d80 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a  e constants,.  *
15d90 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20  * not arbitrary 
15da0 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65  expresssions, we
15db0 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f   allowed some co
15dc0 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54  mbining of LIMIT
15dd0 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
15de0 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f   because they co
15df0 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
15e00 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
15e10 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54    But when LIMIT
15e20 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
15e30 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72   became arbitrar
15e40 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
15e50 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f  e were forced to
15e60 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e   add restriction
15e70 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20  s (13).  ** and 
15e80 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  (14). */.  if( p
15e90 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
15ea0 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
15eb0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
15ec0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
15ed0 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70   (13) */.  if( p
15ee0 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72  Sub->pOffset ) r
15ef0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f10 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
15f20 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70   (14) */.  if( p
15f30 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20  ->pRightmost && 
15f40 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
15f50 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
15f60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
15f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
15fa0 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
15fb0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
15fc0 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
15fd0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15ff0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
16000 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 28 70 53  )  */.  if( ((pS
16010 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
16020 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
16030 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20  | pSub->pLimit) 
16040 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 53  .         && (pS
16050 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
16060 41 67 67 29 20 29 7b 20 20 20 20 20 20 20 20 20  Agg) ){         
16070 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
16080 20 28 34 29 28 35 29 28 38 29 28 39 29 20 2a 2f   (4)(5)(8)(9) */
16090 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
160a0 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69 66 28        .  }.  if(
160b0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
160c0 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
160d0 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
160e0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
160f0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
16100 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a  striction (6)  *
16110 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  /.  }.  if( p->p
16120 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
16130 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
16140 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
16150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16170 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
16180 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d  tion (11) */.  }
16190 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
161a0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
161b0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
161c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
161d0 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f  triction (16) */
161e0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
161f0 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65  mit && p->pWhere
16200 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
16210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
16220 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f  triction (19) */
16230 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20  ..  /* OBSOLETE 
16240 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20  COMMENT 1:.  ** 
16250 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20  Restriction 3:  
16260 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
16270 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20  is a join, make 
16280 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
16290 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75  y is .  ** not u
162a0 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  sed as the right
162b0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f   operand of an o
162c0 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d  uter join.  Exam
162d0 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
162e0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c  .  ** is not all
162f0 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
16300 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
16310 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
16320 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
16330 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
16340 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
16350 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
16360 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
16370 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
16380 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
16390 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
163a0 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
163b0 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a   thing..  **.  *
163c0 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  * OBSOLETE COMME
163d0 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72  NT 2:.  ** Restr
163e0 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74  iction 12:  If t
163f0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
16400 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
16410 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
16420 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65  .  ** join, make
16430 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
16440 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
16450 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20  clause..  ** An 
16460 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  examples of why 
16470 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  this is not allo
16480 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
16490 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
164a0 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43  UTER JOIN (SELEC
164b0 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T * FROM t2 WHER
164c0 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20  E t2.x>0).  **. 
164d0 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
164e0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
164f0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
16500 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
16510 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
16520 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30  t2) WHERE t2.x>0
16530 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74  .  **.  ** But t
16540 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77  he t2.x>0 test w
16550 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
16560 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66  on a NULL row of
16570 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20   t2, which.  ** 
16580 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76  effectively conv
16590 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a  erts the OUTER J
165a0 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45  OIN into an INNE
165b0 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a  R JOIN..  **.  *
165c0 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53  * THIS OVERRIDES
165d0 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
165e0 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45  TS 1 AND 2 ABOVE
165f0 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33  :.  ** Ticket #3
16600 33 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66  300 shows that f
16610 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69  lattening the ri
16620 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
16630 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20  FT JOIN.  ** is 
16640 66 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e  fraught with dan
16650 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76  ger.  Best to av
16660 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68  oid the whole th
16670 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  ing.  If the.  *
16680 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  * subquery is th
16690 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
166a0 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  a LEFT JOIN, the
166b0 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e  n do not flatten
166c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
166d0 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
166e0 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
166f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
16700 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
16710 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68  iction 17: If th
16720 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
16730 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
16740 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20  , then it must. 
16750 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65   ** use only the
16760 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
16770 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  tor. And none of
16780 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65   the simple sele
16790 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  ct queries.  ** 
167a0 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
167b0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
167c0 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
167d0 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  be aggregate or 
167e0 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75  distinct.  ** qu
167f0 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eries..  */.  if
16800 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  ( pSub->pPrior )
16810 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
16820 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
16830 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
16840 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a  Restriction 20 *
16850 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
16860 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c  isAgg || (p->sel
16870 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
16880 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d  nct)!=0 || pSrc-
16890 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  >nSrc!=1 ){.    
168a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
168b0 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d  }.    for(pSub1=
168c0 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75  pSub; pSub1; pSu
168d0 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  b1=pSub1->pPrior
168e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
168f0 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
16900 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
16910 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20  Aggregate))!=0. 
16920 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d        || (pSub1-
16930 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31  >pPrior && pSub1
16940 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20  ->op!=TK_ALL) . 
16950 20 20 20 20 20 20 7c 7c 20 21 70 53 75 62 31 2d        || !pSub1-
16960 3e 70 53 72 63 20 7c 7c 20 70 53 75 62 31 2d 3e  >pSrc || pSub1->
16970 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 0a 20 20  pSrc->nSrc!=1.  
16980 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72      ){.        r
16990 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
169a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
169b0 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a  estriction 18. *
169c0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72  /.    if( p->pOr
169d0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
169e0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72  nt ii;.      for
169f0 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72  (ii=0; ii<p->pOr
16a00 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69  derBy->nExpr; ii
16a10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
16a20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b   p->pOrderBy->a[
16a30 69 69 5d 2e 69 43 6f 6c 3d 3d 30 20 29 20 72 65  ii].iCol==0 ) re
16a40 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
16a50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a      }.  }..  /**
16a60 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
16a70 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
16a80 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
16a90 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f  ted. *****/..  /
16aa0 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20  * Authorize the 
16ab0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50  subquery */.  pP
16ac0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
16ad0 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a  xt = pSubitem->z
16ae0 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 41  Name;.  sqlite3A
16af0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
16b00 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
16b10 30 2c 20 30 2c 20 30 29 3b 0a 20 20 70 50 61 72  0, 0, 0);.  pPar
16b20 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
16b30 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
16b40 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  text;..  /* If t
16b50 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
16b60 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
16b70 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
16b80 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f  n (by restrictio
16b90 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31  ns.  ** 17 and 1
16ba0 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74  8 above) it must
16bb0 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   be a UNION ALL 
16bc0 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71  and the parent q
16bd0 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20  uery must .  ** 
16be0 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  be of the form:.
16bf0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
16c00 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e  LECT <expr-list>
16c10 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72   FROM (<sub-quer
16c20 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73  y>) <where-claus
16c30 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f  e> .  **.  ** fo
16c40 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52  llowed by any OR
16c50 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e  DER BY, LIMIT an
16c60 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75  d/or OFFSET clau
16c70 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a  ses. This block.
16c80 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31    ** creates N-1
16c90 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
16ca0 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68  arent query with
16cb0 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59  out any ORDER BY
16cc0 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a  , LIMIT or .  **
16cd0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20   OFFSET clauses 
16ce0 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74  and joins them t
16cf0 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d  o the left-hand-
16d00 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67  side of the orig
16d10 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20  inal.  ** using 
16d20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
16d30 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ors. In this cas
16d40 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
16d50 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a  r of simple.  **
16d60 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
16d70 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75  ts in the compou
16d80 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  nd sub-query..  
16d90 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  **.  ** Example:
16da0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
16db0 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28  ELECT a+1 FROM (
16dc0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
16dd0 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20  ECT x FROM tab. 
16de0 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
16df0 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
16e00 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y FROM t
16e10 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
16e20 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
16e30 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
16e40 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20  z*2) FROM tab2. 
16e50 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20   **     ) WHERE 
16e60 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a  a!=5 ORDER BY 1.
16e70 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66    **.  ** Transf
16e80 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  ormed into:.  **
16e90 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
16ea0 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   x+1 FROM tab WH
16eb0 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE x+1!=5.  ** 
16ec0 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
16ed0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b  **     SELECT y+
16ee0 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
16ef0 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   y+1!=5.  **    
16f00 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
16f10 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
16f20 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20  *2)+1 FROM tab2 
16f30 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31  WHERE abs(z*2)+1
16f40 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44  !=5.  **     ORD
16f50 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
16f60 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74  * We call this t
16f70 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  he "compound-sub
16f80 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
16f90 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53  "..  */.  for(pS
16fa0 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b  ub=pSub->pPrior;
16fb0 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62   pSub; pSub=pSub
16fc0 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53  ->pPrior){.    S
16fd0 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20  elect *pNew;.   
16fe0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
16ff0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
17000 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69  y;.    Expr *pLi
17010 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
17020 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72  .    Select *pPr
17030 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
17040 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
17050 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72   = 0;.    p->pSr
17060 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50  c = 0;.    p->pP
17070 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rior = 0;.    p-
17080 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
17090 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   pNew = sqlite3S
170a0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20  electDup(db, p, 
170b0 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69  0);.    p->pLimi
170c0 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
170d0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
170e0 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70  rderBy;.    p->p
170f0 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
17100 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a  p->op = TK_ALL;.
17110 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
17120 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  t = 0;.    if( p
17130 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
17140 70 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20  pNew = pPrior;. 
17150 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17160 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
17170 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65  Prior;.      pNe
17180 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  w->pRightmost = 
17190 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  0;.    }.    p->
171a0 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
171b0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
171c0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
171d0 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   1;.  }..  /* Be
171e0 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  gin flattening t
171f0 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  he iFrom-th entr
17200 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
17210 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68  ause .  ** in th
17220 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
17230 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75   */.  pSub = pSu
17240 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  b1 = pSubitem->p
17250 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65  Select;..  /* De
17260 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65  lete the transie
17270 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
17280 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
17290 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
172a0 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
172b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
172c0 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
172d0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
172e0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
172f0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
17300 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
17310 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
17320 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  .  pSubitem->zDa
17330 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53  tabase = 0;.  pS
17340 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
17350 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
17360 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75  Alias = 0;.  pSu
17370 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  bitem->pSelect =
17380 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20   0;..  /* Defer 
17390 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62  deleting the Tab
173a0 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  le object associ
173b0 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
173c0 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69  ** subquery unti
173d0 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
173e0 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  n is.  ** comple
173f0 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  te, since there 
17400 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20  may still exist 
17410 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65  Expr.pTab entrie
17420 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65  s that.  ** refe
17430 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  r to the subquer
17440 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61  y even after fla
17450 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74  ttening.  Ticket
17460 20 23 33 33 34 36 2e 0a 20 20 2a 2f 0a 20 20 69   #3346..  */.  i
17470 66 28 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  f( pSubitem->pTa
17480 62 21 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c  b!=0 ){.    Tabl
17490 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70  e *pTabToDel = p
174a0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  Subitem->pTab;. 
174b0 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c     if( pTabToDel
174c0 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20  ->nRef==1 ){.   
174d0 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e     pTabToDel->pN
174e0 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 50 61 72  extZombie = pPar
174f0 73 65 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a  se->pZombieTab;.
17500 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 5a        pParse->pZ
17510 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54  ombieTab = pTabT
17520 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  oDel;.    }else{
17530 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
17540 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a  ->nRef--;.    }.
17550 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54      pSubitem->pT
17560 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ab = 0;.  }..  /
17570 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
17580 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66  loop runs once f
17590 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20  or each term in 
175a0 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
175b0 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e  ery.  ** flatten
175c0 69 6e 67 20 28 61 73 20 64 65 73 63 72 69 62 65  ing (as describe
175d0 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65  d above).  If we
175e0 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66   are doing a dif
175f0 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a  ferent kind.  **
17600 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d   of flattening -
17610 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74   a flattening ot
17620 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f  her than a compo
17630 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61  und-subquery fla
17640 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74  ttening -.  ** t
17650 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e  hen this loop on
17660 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20  ly runs once..  
17670 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
17680 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74  p moves all of t
17690 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73  he FROM elements
176a0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
176b0 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74   into the.  ** t
176c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
176d0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
176e0 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  y.  Before doing
176f0 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a   this, remember.
17700 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
17710 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f  number for the o
17720 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75  riginal outer qu
17730 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  ery FROM element
17740 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74   in.  ** iParent
17750 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63  .  The iParent c
17760 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72  ursor will never
17770 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65   be used.  Subse
17780 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20  quent code.  ** 
17790 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73  will scan expres
177a0 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f  sions looking fo
177b0 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65  r iParent refere
177c0 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65  nces and replace
177d0 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65  .  ** those refe
177e0 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72  rences with expr
177f0 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73  essions that res
17800 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71  olve to the subq
17810 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65  uery FROM.  ** e
17820 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e  lements we are n
17830 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20  ow copying in.. 
17840 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e   */.  for(pParen
17850 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50  t=p; pParent; pP
17860 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70  arent=pParent->p
17870 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62  Prior, pSub=pSub
17880 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69  ->pPrior){.    i
17890 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20  nt nSubSrc;.    
178a0 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  u8 jointype = 0;
178b0 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70  .    pSubSrc = p
178c0 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  Sub->pSrc;     /
178d0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
178e0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20   subquery */.   
178f0 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53   nSubSrc = pSubS
17900 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75  rc->nSrc;  /* Nu
17910 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
17920 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63   subquery FROM c
17930 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72  lause */.    pSr
17940 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  c = pParent->pSr
17950 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
17960 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
17970 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20  er query */..   
17980 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20   if( pSrc ){.   
17990 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
179a0 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72  nt==p );  /* Fir
179b0 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20  st time through 
179c0 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  the loop */.    
179d0 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75    jointype = pSu
179e0 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b  bitem->jointype;
179f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17a00 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
17a10 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20  t!=p );  /* 2nd 
17a20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 74  and subsequent t
17a30 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68 65  imes through the
17a40 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70   loop */.      p
17a50 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
17a60 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
17a70 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30  ListAppend(db, 0
17a80 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
17a90 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( pSrc==0 ){.  
17aa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
17ab0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
17ac0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
17ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
17ae0 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75      /* The subqu
17af0 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c  ery uses a singl
17b00 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52  e slot of the FR
17b10 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
17b20 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75   outer.    ** qu
17b30 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75 62  ery.  If the sub
17b40 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74  query has more t
17b50 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20  han one element 
17b60 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75  in its FROM clau
17b70 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  se,.    ** then 
17b80 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72  expand the outer
17b90 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73   query to make s
17ba0 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68  pace for it to h
17bb0 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73  old all elements
17bc0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
17bd0 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a  ubquery..    **.
17be0 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
17bf0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
17c00 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
17c10 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46  abA, (SELECT * F
17c20 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c  ROM sub1, sub2),
17c30 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20   tabB;.    **.  
17c40 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71    ** The outer q
17c50 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73  uery has 3 slots
17c60 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
17c70 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f  use.  One slot o
17c80 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  f the.    ** out
17c90 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d 69  er query (the mi
17ca0 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73  ddle slot) is us
17cb0 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75 65  ed by the subque
17cc0 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20  ry.  The next.  
17cd0 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f    ** block of co
17ce0 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74  de will expand t
17cf0 68 65 20 6f 75 74 20 71 75 65 72 79 20 74 6f 20  he out query to 
17d00 34 20 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69  4 slots.  The mi
17d10 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74  ddle.    ** slot
17d20 20 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20   is expanded to 
17d30 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64  two slots in ord
17d40 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65  er to make space
17d50 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
17d60 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  two elements in 
17d70 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
17d80 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
17d90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17da0 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20  nSubSrc>1 ){.   
17db0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63     pParent->pSrc
17dc0 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65   = pSrc = sqlite
17dd0 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
17de0 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72  db, pSrc, nSubSr
17df0 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20  c-1,iFrom+1);.  
17e00 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
17e10 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
17e20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
17e30 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
17e40 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 46 52   Transfer the FR
17e50 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  OM clause terms 
17e60 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72  from the subquer
17e70 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a  y into the.    *
17e80 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  * outer query.. 
17e90 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
17ea0 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b  0; i<nSubSrc; i+
17eb0 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  +){.      pSrc->
17ec0 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75  a[i+iFrom] = pSu
17ed0 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  bSrc->a[i];.    
17ee0 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72    memset(&pSubSr
17ef0 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65  c->a[i], 0, size
17f00 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  of(pSubSrc->a[i]
17f10 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ));.    }.    pS
17f20 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69  rc->a[iFrom].joi
17f30 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65  ntype = jointype
17f40 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ;.  .    /* Now 
17f50 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69  begin substituti
17f60 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ng subquery resu
17f70 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
17f80 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72  ns for .    ** r
17f90 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
17fa0 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
17fb0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
17fc0 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d   ** .    ** Exam
17fd0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
17fe0 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c  **   SELECT a+5,
17ff0 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45   b*10 FROM (SELE
18000 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31  CT x*3 AS a, y+1
18010 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20  0 AS b FROM t1) 
18020 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a  WHERE a>b;.    *
18030 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
18040 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
18050 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
18060 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
18070 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20         /.    ** 
18080 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
18090 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
180a0 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
180b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
180c0 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20  ____/.    **.   
180d0 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
180e0 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
180f0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
18100 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
18110 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a  ce we see.    **
18120 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75   "a" we substitu
18130 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65  te "x*3" and eve
18140 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20  ry place we see 
18150 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "b" we substitut
18160 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f  e "y+10"..    */
18170 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61  .    pList = pPa
18180 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  rent->pEList;.  
18190 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
181a0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
181b0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
181c0 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  pr;.      if( pL
181d0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d  ist->a[i].zName=
181e0 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d 20 70  =0 && (pExpr = p
181f0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
18200 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a  )->span.z!=0 ){.
18210 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61          pList->a
18220 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 0a 20 20 20  [i].zName = .   
18230 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
18240 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
18250 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 73   (char*)pExpr->s
18260 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70  pan.z, pExpr->sp
18270 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  an.n);.      }. 
18280 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78     }.    substEx
18290 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
182a0 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72  nt->pEList, iPar
182b0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
182c0 74 29 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67  t);.    if( isAg
182d0 67 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  g ){.      subst
182e0 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
182f0 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20  rent->pGroupBy, 
18300 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
18310 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 75  EList);.      su
18320 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
18330 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  ent->pHaving, iP
18340 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
18350 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
18360 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
18370 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  By ){.      asse
18380 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  rt( pParent->pOr
18390 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
183a0 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65    pParent->pOrde
183b0 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
183c0 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62  erBy;.      pSub
183d0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
183e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
183f0 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
18400 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
18410 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
18420 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50  nt->pOrderBy, iP
18430 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
18440 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
18450 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
18460 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65   ){.      pWhere
18470 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
18480 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65  p(db, pSub->pWhe
18490 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  re, 0);.    }els
184a0 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20  e{.      pWhere 
184b0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
184c0 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
184d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
184e0 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  ( pParent->pHavi
184f0 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ng==0 );.      p
18500 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
18510 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  = pParent->pWher
18520 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e;.      pParent
18530 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
18540 65 3b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  e;.      substEx
18550 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
18560 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
18570 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
18580 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
18590 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
185a0 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
185b0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  rent->pHaving, .
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
185f0 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
18600 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61  ng, 0));.      a
18610 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
18620 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
18630 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
18640 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
18650 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
18660 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
18670 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
18680 20 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64       substExpr(d
18690 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  b, pParent->pWhe
186a0 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  re, iParent, pSu
186b0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
186c0 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
186d0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
186e0 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  nd(db, pParent->
186f0 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b  pWhere, pWhere);
18700 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
18710 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
18720 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
18730 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
18740 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20  nner or the.    
18750 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
18760 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20  s distinct. .   
18770 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d   */.    pParent-
18780 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75  >selFlags |= pSu
18790 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
187a0 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20  _Distinct;.  .  
187b0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45    /*.    ** SELE
187c0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
187d0 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
187e0 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
187f0 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20  x OFFSET y;.    
18800 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73  **.    ** One is
18810 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
18820 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
18830 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
18840 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
18850 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
18860 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
18870 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
18880 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18890 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
188a0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
188b0 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
188c0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75  Limit;.      pSu
188d0 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
188e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
188f0 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
18900 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
18910 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
18920 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
18930 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
18940 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
18950 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20  (db, pSub1);..  
18960 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
18970 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
18980 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
18990 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
189a0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
189b0 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  W) */../*.** Ana
189c0 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20  lyze the SELECT 
189d0 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
189e0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
189f0 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20  to see if it.** 
18a00 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61  is a min() or ma
18a10 78 28 29 20 71 75 65 72 79 2e 20 52 65 74 75 72  x() query. Retur
18a20 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
18a30 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44  MIN or WHERE_ORD
18a40 45 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20  ERBY_MAX if .** 
18a50 69 74 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65  it is, or 0 othe
18a60 72 77 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e  rwise. At presen
18a70 74 2c 20 61 20 71 75 65 72 79 20 69 73 20 63 6f  t, a query is co
18a80 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a  nsidered to be.*
18a90 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20  * a min()/max() 
18aa0 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  query if:.**.** 
18ab0 20 20 31 2e 20 54 68 65 72 65 20 69 73 20 61 20    1. There is a 
18ac0 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e  single object in
18ad0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18ae0 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65  ..**.**   2. The
18af0 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65  re is a single e
18b00 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
18b10 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64   result set, and
18b20 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65   it is.**      e
18b30 69 74 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20  ither min(x) or 
18b40 6d 61 78 28 78 29 2c 20 77 68 65 72 65 20 78 20  max(x), where x 
18b50 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65  is a column refe
18b60 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rence..*/.static
18b70 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28   u8 minMaxQuery(
18b80 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78  Select *p){.  Ex
18b90 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70  pr *pExpr;.  Exp
18ba0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
18bb0 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66  p->pEList;..  if
18bc0 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
18bd0 3d 31 20 29 20 72 65 74 75 72 6e 20 57 48 45 52  =1 ) return WHER
18be0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
18bf0 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69  ;.  pExpr = pELi
18c00 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
18c10 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
18c20 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
18c30 78 49 73 53 65 6c 65 63 74 29 20 29 20 72 65 74  xIsSelect) ) ret
18c40 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20  urn 0;.  pEList 
18c50 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
18c60 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
18c70 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
18c80 4f 4e 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30 20  ON || pEList==0 
18c90 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  || pEList->nExpr
18ca0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
18cb0 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
18cc0 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  0].pExpr->op!=TK
18cd0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  _AGG_COLUMN ) re
18ce0 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
18cf0 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66 28  BY_NORMAL;.  if(
18d00 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21   pExpr->token.n!
18d10 3d 33 20 29 20 72 65 74 75 72 6e 20 57 48 45 52  =3 ) return WHER
18d20 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
18d30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
18d40 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70  trNICmp((char*)p
18d50 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
18d60 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  in",3)==0 ){.   
18d70 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   return WHERE_OR
18d80 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c  DERBY_MIN;.  }el
18d90 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
18da0 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45  rNICmp((char*)pE
18db0 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61  xpr->token.z,"ma
18dc0 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  x",3)==0 ){.    
18dd0 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  return WHERE_ORD
18de0 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20  ERBY_MAX;.  }.  
18df0 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  return WHERE_ORD
18e00 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a  ERBY_NORMAL;.}..
18e10 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
18e20 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
18e30 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
18e40 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67  rgument is an ag
18e50 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
18e60 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
18e70 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f  ment is the asso
18e80 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65  ciated aggregate
18e90 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68  -info object. Th
18ea0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
18eb0 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c  tests if the SEL
18ec0 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ECT is of the fo
18ed0 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  rm:.**.**   SELE
18ee0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
18ef0 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65   <tbl>.**.** whe
18f00 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61  re table is a da
18f10 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f  tabase table, no
18f20 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  t a sub-select o
18f30 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71  r view. If the q
18f40 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74  uery.** does mat
18f50 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c  ch this pattern,
18f60 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
18f70 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  to the Table obj
18f80 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ect representing
18f90 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74  .** <tbl> is ret
18fa0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
18fb0 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
18fc0 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65  .*/.static Table
18fd0 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28   *isSimpleCount(
18fe0 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e  Select *p, AggIn
18ff0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
19000 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
19010 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20  Expr *pExpr;..  
19020 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f  assert( !p->pGro
19030 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70  upBy );..  if( p
19040 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70  ->pWhere || p->p
19050 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
19060 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  .   || p->pSrc->
19070 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53  nSrc!=1 || p->pS
19080 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
19090 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
190a0 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d   0;.  }.  pTab =
190b0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
190c0 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Tab;.  pExpr = p
190d0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
190e0 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
190f0 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70  pTab && !pTab->p
19100 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20  Select && pExpr 
19110 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74  );..  if( IsVirt
19120 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
19130 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
19140 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
19150 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
19160 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e  0;.  if( (pAggIn
19170 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75  fo->aFunc[0].pFu
19180 6e 63 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  nc->flags&SQLITE
19190 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20  _FUNC_COUNT)==0 
191a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
191b0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45  ( pExpr->flags&E
191c0 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  P_Distinct ) ret
191d0 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  urn 0;..  return
191e0 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
191f0 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69  If the source-li
19200 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61  st item passed a
19210 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61  s an argument wa
19220 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68  s augmented with
19230 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42   an.** INDEXED B
19240 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
19250 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ry to locate the
19260 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78   specified index
19270 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61  . If there.** wa
19280 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20  s such a clause 
19290 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  and the named in
192a0 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  dex cannot be fo
192b0 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  und, return .** 
192c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64  SQLITE_ERROR and
192d0 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
192e0 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72  in pParse. Other
192f0 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a  wise, populate .
19300 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78  ** pFrom->pIndex
19310 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
19320 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
19330 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f  lite3IndexedByLo
19340 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  okup(Parse *pPar
19350 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
19360 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
19370 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54  .  if( pFrom->pT
19380 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e  ab && pFrom->zIn
19390 64 65 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  dex ){.    Table
193a0 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
193b0 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a  pTab;.    char *
193c0 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e  zIndex = pFrom->
193d0 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65  zIndex;.    Inde
193e0 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
193f0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
19400 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  ex; .        pId
19410 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  x && sqlite3StrI
19420 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  Cmp(pIdx->zName,
19430 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20   zIndex); .     
19440 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e     pIdx=pIdx->pN
19450 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ext.    );.    i
19460 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20  f( !pIdx ){.    
19470 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19480 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
19490 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a  ch index: %s", z
194a0 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20  Index, 0);.     
194b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
194c0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
194d0 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20  pFrom->pIndex = 
194e0 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pIdx;.  }.  retu
194f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19500 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19510 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20  ine is a Walker 
19520 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78  callback for "ex
19530 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43  panding" a SELEC
19540 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
19550 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e  "Expanding" mean
19560 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c  s to do the foll
19570 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
19580 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
19590 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
195a0 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
195b0 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
195c0 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
195d0 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
195e0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
195f0 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
19600 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
19610 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
19620 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
19630 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
19640 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
19650 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
19660 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
19670 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
19680 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
19690 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
196a0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
196b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
196c0 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
196d0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
196e0 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
196f0 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
19700 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
19710 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
19720 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
19730 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
19740 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
19750 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
19760 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
19770 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
19780 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74  p the presistent
19790 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
197a0 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
197b0 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
197c0 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
197d0 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
197e0 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  use to accomodat
197f0 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  e the NATURAL ke
19800 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20  yword.**        
19810 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68   on joins and th
19820 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
19830 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a  lause of joins..
19840 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63  **.**    (4)  Sc
19850 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  an the list of c
19860 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
19870 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74  sult set (pEList
19880 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20  ) looking.**    
19890 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63       for instanc
198a0 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70  es of the "*" op
198b0 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41  erator or the TA
198c0 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  BLE.* operator..
198d0 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f  **         If fo
198e0 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68  und, expand each
198f0 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79   "*" to be every
19900 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79   column in every
19910 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
19920 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f    and TABLE.* to
19930 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
19940 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f   in TABLE..**.*/
19950 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
19960 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65  ctExpander(Walke
19970 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
19980 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
19990 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
199a0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  r->pParse;.  int
199b0 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c   i, j, k;.  SrcL
199c0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
199d0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
199e0 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
199f0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
19a00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
19a10 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
19a20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
19a30 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74  iled  ){.    ret
19a40 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
19a50 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63   }.  if( p->pSrc
19a60 3d 3d 30 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c  ==0 || (p->selFl
19a70 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
19a80 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  d)!=0 ){.    ret
19a90 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
19aa0 20 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73   }.  p->selFlags
19ab0 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b   |= SF_Expanded;
19ac0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
19ad0 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
19ae0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  = p->pEList;..  
19af0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72  /* Make sure cur
19b00 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
19b10 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
19b20 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  o all entries in
19b30 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
19b40 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
19b50 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
19b60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63   */.  sqlite3Src
19b70 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
19b80 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
19b90 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  st);..  /* Look 
19ba0 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e  up every table n
19bb0 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
19bc0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
19bd0 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20  elect.  If.  ** 
19be0 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
19bf0 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61  FROM clause is a
19c00 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61   subquery instea
19c10 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  d of a table or 
19c20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  view,.  ** then 
19c30 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65  create a transie
19c40 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
19c50 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  re to describe t
19c60 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a  he subquery..  *
19c70 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  /.  for(i=0, pFr
19c80 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
19c90 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
19ca0 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
19cb0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
19cc0 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
19cd0 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20  >pTab!=0 ){.    
19ce0 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d    /* This statem
19cf0 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  ent has already 
19d00 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20  been prepared.  
19d10 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
19d20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20  .      ** to go 
19d30 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  further. */.    
19d40 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29    assert( i==0 )
19d50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
19d60 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
19d70 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
19d80 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Name==0 ){.#ifnd
19d90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
19da0 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65  UBQUERY.      Se
19db0 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
19dc0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
19dd0 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
19de0 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
19df0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
19e00 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
19e10 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20  ( pSel!=0 );.   
19e20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
19e30 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
19e40 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
19e50 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
19e60 65 6c 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  el);.      pFrom
19e70 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
19e80 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
19e90 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
19ea0 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66  able));.      if
19eb0 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
19ec0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
19ed0 20 20 20 20 70 54 61 62 2d 3e 64 62 4d 65 6d 20      pTab->dbMem 
19ee0 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  = db->lookaside.
19ef0 62 45 6e 61 62 6c 65 64 20 3f 20 64 62 20 3a 20  bEnabled ? db : 
19f00 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  0;.      pTab->n
19f10 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Ref = 1;.      p
19f20 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
19f30 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
19f40 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79  "sqlite_subquery
19f50 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 54  _%p_", (void*)pT
19f60 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ab);.      while
19f70 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
19f80 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  { pSel = pSel->p
19f90 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73  Prior; }.      s
19fa0 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d  electColumnsFrom
19fb0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
19fc0 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26   pSel->pEList, &
19fd0 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  pTab->nCol, &pTa
19fe0 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20  b->aCol);.      
19ff0 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
1a000 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61  ;.      pTab->ta
1a010 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68  bFlags |= TF_Eph
1a020 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20  emeral;.#endif. 
1a030 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a040 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
1a050 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
1a060 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
1a070 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ause */.      as
1a080 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
1a090 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
1a0a0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
1a0b0 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69   = .        sqli
1a0c0 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
1a0d0 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a  Parse,0,pFrom->z
1a0e0 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74  Name,pFrom->zDat
1a0f0 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66  abase);.      if
1a100 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
1a110 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1a120 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
1a130 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
1a140 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1a150 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
1a160 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1a170 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
1a180 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
1a190 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  || IsVirtual(pTa
1a1a0 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  b) ){.        /*
1a1b0 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69   We reach here i
1a1c0 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
1a1d0 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20  e is a really a 
1a1e0 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20  view */.        
1a1f0 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
1a200 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
1a210 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65  arse, pTab) ) re
1a220 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
1a230 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70  .        /* If p
1a240 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30  From->pSelect!=0
1a250 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
1a260 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a   dealing with a.
1a270 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20          ** view 
1a280 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20  within a view.  
1a290 54 68 65 20 53 45 4c 45 43 54 20 73 74 72 75 63  The SELECT struc
1a2a0 74 75 72 65 20 68 61 73 20 61 6c 72 65 61 64 79  ture has already
1a2b0 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   been.        **
1a2c0 20 63 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f   copied by the o
1a2d0 75 74 65 72 20 76 69 65 77 20 73 6f 20 77 65 20  uter view so we 
1a2e0 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70  can skip the cop
1a2f0 79 20 73 74 65 70 20 68 65 72 65 0a 20 20 20 20  y step here.    
1a300 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
1a310 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20  ner view..      
1a320 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
1a330 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d   pFrom->pSelect=
1a340 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1a350 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
1a360 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
1a370 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c  p(db, pTab->pSel
1a380 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
1a390 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
1a3a0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46  lect(pWalker, pF
1a3b0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
1a3c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a3d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
1a3e0 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65     /* Locate the
1a3f0 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20   index named by 
1a400 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
1a410 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a  lause, if any. *
1a420 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
1a430 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
1a440 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
1a450 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1a460 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
1a470 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
1a480 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
1a490 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
1a4a0 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
1a4b0 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
1a4c0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1a4d0 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f  led || sqlitePro
1a4e0 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
1a4f0 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
1a500 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
1a510 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
1a520 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
1a530 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
1a540 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
1a550 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
1a560 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
1a570 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
1a580 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
1a590 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
1a5a0 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
1a5b0 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
1a5c0 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
1a5d0 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
1a5e0 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
1a5f0 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70  th the TK_ALL op
1a600 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
1a610 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
1a620 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
1a630 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66  list..  ** The f
1a640 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
1a650 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
1a660 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72   the TK_ALL expr
1a670 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
1a680 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65  nd.  ** each one
1a690 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
1a6a0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
1a6b0 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
1a6c0 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
1a6d0 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
1a6e0 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
1a6f0 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
1a700 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
1a710 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
1a720 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
1a730 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
1a740 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   k++){.    Expr 
1a750 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  *pE = pEList->a[
1a760 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
1a770 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ( pE->op==TK_ALL
1a780 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
1a790 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
1a7a0 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26   && pE->pRight &
1a7b0 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
1a7c0 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20  ==TK_ALL.       
1a7d0 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26    && pE->pLeft &
1a7e0 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
1a7f0 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a  =TK_ID ) break;.
1a800 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69    }.  if( k<pELi
1a810 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
1a820 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65   /*.    ** If we
1a830 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61   get here it mea
1a840 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ns the result se
1a850 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  t contains one o
1a860 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a  r more "*".    *
1a870 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  * operators that
1a880 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
1a890 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f  nded.  Loop thro
1a8a0 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
1a8b0 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ion.    ** in th
1a8c0 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
1a8d0 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65   expand them one
1a8e0 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a   by one..    */.
1a8f0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
1a900 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45  ist_item *a = pE
1a910 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70  List->a;.    Exp
1a920 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b  rList *pNew = 0;
1a930 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
1a940 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
1a950 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67  gs;.    int long
1a960 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26  Names = (flags &
1a970 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
1a980 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20  ames)!=0.       
1a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1a9a0 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  & (flags & SQLIT
1a9b0 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
1a9c0 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d  ==0;..    for(k=
1a9d0 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
1a9e0 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
1a9f0 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e  Expr *pE = a[k].
1aa00 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
1aa10 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20   pE->op!=TK_ALL 
1aa20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70  &&.           (p
1aa30 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
1aa40 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c   pE->pRight==0 |
1aa50 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  | pE->pRight->op
1aa60 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20  !=TK_ALL) ){.   
1aa70 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
1aa80 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
1aa90 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
1aaa0 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
1aab0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1aac0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1aad0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1aae0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61  (pParse, pNew, a
1aaf0 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  [k].pExpr, 0);. 
1ab00 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
1ab10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
1ab20 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
1ab30 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d  -1].zName = a[k]
1ab40 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
1ab50 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
1ab60 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
1ab70 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
1ab80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ab90 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
1aba0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
1abb0 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
1abc0 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
1abd0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
1abe0 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
1abf0 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
1ac00 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
1ac10 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
1ac20 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
1ac30 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
1ac40 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1ac50 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20  text of name of 
1ac60 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20  TABLE */.       
1ac70 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
1ac80 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  DOT && pE->pLeft
1ac90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
1aca0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1acb0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1acc0 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  &pE->pLeft->toke
1acd0 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
1ace0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  e{.          zTN
1acf0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
1ad00 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
1ad10 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
1ad20 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
1ad30 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
1ad40 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  rom++){.        
1ad50 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1ad60 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
1ad70 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
1ad80 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
1ad90 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
1ada0 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
1adb0 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d   || zTabName[0]=
1adc0 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  =0 ){ .         
1add0 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
1ade0 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
1adf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ae00 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1ae10 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
1ae20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
1ae30 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ame && sqlite3St
1ae40 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54  rICmp(zTName, zT
1ae50 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  abName)!=0 ){.  
1ae60 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1ae70 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
1ae80 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
1ae90 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
1aea0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
1aeb0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
1aed0 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68 74   *pExpr, *pRight
1aee0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
1aef0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
1af00 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
1af10 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ..            /*
1af20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20   If a column is 
1af30 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65  marked as 'hidde
1af40 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e  n' (currently on
1af50 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  ly possible.    
1af60 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76          ** for v
1af70 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20  irtual tables), 
1af80 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69  do not include i
1af90 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65  t in the expande
1afa0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
1afb0 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
1afc0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
1afd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1afe0 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28   IsHiddenColumn(
1aff0 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20  &pTab->aCol[j]) 
1b000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1b010 20 61 73 73 65 72 74 28 49 73 56 69 72 74 75 61   assert(IsVirtua
1b020 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20  l(pTab));.      
1b030 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1b040 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1b050 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1b060 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d   i>0 && zTName==
1b070 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1b080 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1b090 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20  t_item *pLeft = 
1b0a0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31  &pTabList->a[i-1
1b0b0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
1b0c0 20 69 66 28 20 28 70 4c 65 66 74 5b 31 5d 2e 6a   if( (pLeft[1].j
1b0d0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
1b0e0 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20  URAL)!=0 &&.    
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b100 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28      columnIndex(
1b110 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61  pLeft->pTab, zNa
1b120 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
1b130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
1b140 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
1b150 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
1b160 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
1b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b180 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  ** table on the 
1b190 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20  right */.       
1b1a0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1b1b0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1b1c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1b1d0 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69   if( sqlite3IdLi
1b1e0 73 74 49 6e 64 65 78 28 70 4c 65 66 74 5b 31 5d  stIndex(pLeft[1]
1b1f0 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e  .pUsing, zName)>
1b200 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1b210 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f        /* In a jo
1b220 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20  in with a USING 
1b230 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c  clause, omit col
1b240 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
1b250 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
1b260 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
1b270 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
1b280 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
1b290 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1b2a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1b2b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1b2c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1b2d0 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
1b2e0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
1b2f0 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
1b300 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1b310 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b  Right==0 ) break
1b320 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ;.            se
1b330 74 54 6f 6b 65 6e 28 26 70 52 69 67 68 74 2d 3e  tToken(&pRight->
1b340 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20  token, zName);. 
1b350 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
1b360 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62  ongNames || pTab
1b370 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a  List->nSrc>1 ){.
1b380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
1b390 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69  pr *pLeft = sqli
1b3a0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
1b3b0 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29   TK_ID, 0, 0, 0)
1b3c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b3d0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
1b3e0 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1b3f0 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  DOT, pLeft, pRig
1b400 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
1b410 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 3d        if( pExpr=
1b420 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1b430 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b            setTok
1b440 65 6e 28 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  en(&pLeft->token
1b450 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
1b460 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f             setTo
1b470 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73 70 61 6e  ken(&pExpr->span
1b480 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1b490 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
1b4a0 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
1b4b0 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
1b4c0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
1b4d0 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79    pExpr->span.dy
1b4e0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
1b4f0 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
1b500 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.z = 0;.       
1b510 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
1b520 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ken.n = 0;.     
1b530 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1b540 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20  token.dyn = 0;. 
1b550 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1b560 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b570 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
1b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1b590 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70  xpr->span = pExp
1b5a0 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  r->token;.      
1b5b0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
1b5c0 70 61 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  pan.dyn = 0;.   
1b5d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1b5e0 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
1b5f0 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
1b600 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
1b610 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
1b620 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
1b630 20 70 45 78 70 72 2c 20 26 70 45 78 70 72 2d 3e   pExpr, &pExpr->
1b640 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  span);.         
1b650 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b660 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
1b670 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
1b680 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
1b690 77 2c 20 70 45 78 70 72 2c 20 26 70 52 69 67 68  w, pExpr, &pRigh
1b6a0 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  t->token);.     
1b6b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b6c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1b6d0 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
1b6e0 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
1b6f0 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
1b700 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1b710 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1b720 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
1b730 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
1b740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1b750 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1b760 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1b770 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
1b780 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
1b790 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
1b7b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1b7c0 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  zTName);.      }
1b7d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1b7e0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
1b7f0 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  (db, pEList);.  
1b800 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
1b810 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  ew;.  }.#if SQLI
1b820 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
1b830 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  if( p->pEList &&
1b840 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
1b850 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
1b860 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
1b870 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
1b880 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1b890 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
1b8a0 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
1b8b0 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ");.  }.#endif. 
1b8c0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1b8d0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
1b8e0 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
1b8f0 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
1b900 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  walker..**.** Wh
1b910 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1b920 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45  is the Walker.xE
1b930 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
1b940 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1b950 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20  s.** are walked 
1b960 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69  without any acti
1b970 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20  ons being taken 
1b980 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50  at each node.  P
1b990 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68  resumably,.** wh
1b9a0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1b9b0 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b  is used for Walk
1b9c0 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
1b9d0 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72   then .** Walker
1b9e0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
1b9f0 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f   is set to do so
1ba00 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66  mething useful f
1ba10 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62  or every .** sub
1ba20 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
1ba30 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61  ser tree..*/.sta
1ba40 74 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b  tic int exprWalk
1ba50 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
1ba60 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55  Used, Expr *NotU
1ba70 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
1ba80 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
1ba90 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
1baa0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1bab0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
1bac0 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
1bad0 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
1bae0 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
1baf0 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
1bb00 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
1bb10 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
1bb20 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
1bb30 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
1bb40 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
1bb50 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
1bb60 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
1bb70 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
1bb80 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
1bb90 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
1bba0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1bbb0 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
1bbc0 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
1bbd0 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
1bbe0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
1bbf0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1bc00 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
1bc10 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
1bc20 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
1bc30 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
1bc40 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
1bc50 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
1bc60 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
1bc70 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
1bc80 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
1bc90 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
1bca0 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
1bcb0 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
1bcc0 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
1bcd0 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
1bce0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
1bcf0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1bd00 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
1bd10 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
1bd20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
1bd30 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
1bd40 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
1bd50 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e  ck = selectExpan
1bd60 64 65 72 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  der;.  w.xExprCa
1bd70 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
1bd80 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
1bd90 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
1bda0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1bdb0 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a  &w, pSelect);.}.
1bdc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1bdd0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
1bde0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57  *.** This is a W
1bdf0 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
1be00 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66  lback callback f
1be10 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65  or the sqlite3Se
1be20 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a  lectTypeInfo().*
1be30 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  * interface..**.
1be40 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d  ** For each FROM
1be50 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79  -clause subquery
1be60 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79  , add Column.zTy
1be70 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43  pe and Column.zC
1be80 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  oll.** informati
1be90 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  on to the Table 
1bea0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
1beb0 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
1bec0 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74  sult set.** of t
1bed0 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a  hat subquery..**
1bee0 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
1bef0 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
1bf00 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
1bf10 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74  lt set was const
1bf20 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c  ructed.** by sel
1bf30 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75  ectExpander() bu
1bf40 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63  t the type and c
1bf50 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  ollation informa
1bf60 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64  tion was omitted
1bf70 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e  .** at that poin
1bf80 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69  t because identi
1bf90 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65  fiers had not ye
1bfa0 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  t been resolved.
1bfb0 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
1bfc0 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
1bfd0 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73  r identifier res
1bfe0 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
1bff0 69 63 20 69 6e 74 20 73 65 6c 65 63 74 41 64 64  ic int selectAdd
1c000 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
1c010 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
1c020 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1c030 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
1c040 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
1c050 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  t *pTabList;.  s
1c060 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1c070 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73  em *pFrom;..  as
1c080 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
1c090 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
1c0a0 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  );.  if( (p->sel
1c0b0 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
1c0c0 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20  peInfo)==0 ){.  
1c0d0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
1c0e0 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b   SF_HasTypeInfo;
1c0f0 0a 20 20 20 20 70 50 61 72 73 65 20 3d 20 70 57  .    pParse = pW
1c100 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
1c110 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
1c120 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69  >pSrc;.    for(i
1c130 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
1c140 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
1c150 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
1c160 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61  rom++){.      Ta
1c170 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
1c180 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  m->pTab;.      i
1c190 66 28 20 70 54 61 62 20 26 26 20 28 70 54 61 62  f( pTab && (pTab
1c1a0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
1c1b0 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b  Ephemeral)!=0 ){
1c1c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 75  .        /* A su
1c1d0 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
1c1e0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
1c1f0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
1c200 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
1c210 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
1c220 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c230 20 70 53 65 6c 20 29 3b 0a 20 20 20 20 20 20 20   pSel );.       
1c240 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
1c250 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53  rior ) pSel = pS
1c260 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
1c270 20 20 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c      selectAddCol
1c280 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
1c290 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
1c2a0 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43  ->nCol, pTab->aC
1c2b0 6f 6c 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20  ol, pSel);.     
1c2c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1c2d0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1c2e0 75 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  ue;.}.#endif.../
1c2f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c300 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20  e adds datatype 
1c310 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
1c320 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69  quence informati
1c330 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62  on to.** the Tab
1c340 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  le structures of
1c350 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
1c360 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61   subqueries in a
1c370 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
1c380 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  ment..**.** Use 
1c390 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74  this routine aft
1c3a0 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  er name resoluti
1c3b0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1c3c0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
1c3d0 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73  AddTypeInfo(Pars
1c3e0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
1c3f0 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66  t *pSelect){.#if
1c400 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c410 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b  _SUBQUERY.  Walk
1c420 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63  er w;.  w.xSelec
1c430 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65  tCallback = sele
1c440 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
1c450 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72  eInfo;.  w.xExpr
1c460 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57  Callback = exprW
1c470 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
1c480 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
1c490 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
1c4a0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
1c4b0 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
1c4c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
1c4d0 74 73 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  ts of a SELECT s
1c4e0 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
1c4f0 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  cessing.  The.**
1c500 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63   following is ac
1c510 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a  complished:.**.*
1c520 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75  *     *  VDBE Cu
1c530 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65  rsor numbers are
1c540 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
1c550 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72   FROM-clause ter
1c560 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70  ms..**     *  Ep
1c570 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62  hemeral Table ob
1c580 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
1c590 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  d for all FROM-c
1c5a0 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
1c5b0 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61  ..**     *  ON a
1c5c0 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1c5d0 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74   are shifted int
1c5e0 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e  o WHERE statemen
1c5f0 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c  ts.**     *  Wil
1c600 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22  dcards "*" and "
1c610 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75  TABLE.*" in resu
1c620 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61  lt sets are expa
1c630 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  nded..**     *  
1c640 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65  Identifiers in e
1c650 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61  xpression are ma
1c660 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e  tched to tables.
1c670 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1c680 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69  ine acts recursi
1c690 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71  vely on all subq
1c6a0 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68  ueries within th
1c6b0 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
1c6c0 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  d sqlite3SelectP
1c6d0 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rep(.  Parse *pP
1c6e0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
1c6f0 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
1c700 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
1c710 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1c720 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
1c730 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
1c740 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
1c750 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
1c760 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
1c770 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a   for container *
1c780 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
1c790 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  db;.  if( p==0 )
1c7a0 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
1c7b0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1c7c0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
1c7d0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
1c7e0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
1c7f0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
1c800 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c810 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1c820 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
1c830 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
1c840 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1c850 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1c860 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
1c870 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
1c880 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
1c890 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
1c8a0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1c8b0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1c8c0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
1c8d0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
1c8e0 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73  ddTypeInfo(pPars
1c8f0 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, p);.}../*.** 
1c900 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
1c910 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
1c920 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
1c930 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
1c940 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
1c950 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
1c960 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
1c970 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
1c980 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
1c990 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
1c9a0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d  s.** routine sim
1c9b0 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  ply stores NULLs
1c9c0 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
1c9d0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a   memory cells..*
1c9e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
1c9f0 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
1ca00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
1ca10 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
1ca20 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1ca30 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1ca40 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
1ca50 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
1ca60 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e  nc;.  if( pAggIn
1ca70 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e  fo->nFunc+pAggIn
1ca80 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29  fo->nColumn==0 )
1ca90 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1caa0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
1cab0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
1cac0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1cad0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1cae0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67   OP_Null, 0, pAg
1caf0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
1cb00 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Mem);.  }.  for(
1cb10 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
1cb20 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
1cb30 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
1cb40 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
1cb50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cb60 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1cb70 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b  0, pFunc->iMem);
1cb80 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
1cb90 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
1cba0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
1cbb0 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
1cbc0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1cbd0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1cbe0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1cbf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
1cc00 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
1cc10 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
1cc20 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
1cc30 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1cc40 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
1cc50 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
1cc60 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
1cc70 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
1cc80 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
1cc90 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
1cca0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
1ccb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ccc0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1ccd0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
1cce0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1ccf0 20 70 45 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20   pE->x.pList);. 
1cd00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1cd10 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
1cd20 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46  penEphemeral, pF
1cd30 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20  unc->iDistinct, 
1cd40 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd60 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
1cd70 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
1cd80 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OFF);.      }.  
1cd90 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1cda0 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
1cdb0 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
1cdc0 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
1cdd0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
1cde0 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
1cdf0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1ce00 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
1ce10 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
1ce20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
1ce30 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1ce40 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1ce50 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1ce60 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1ce70 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
1ce80 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
1ce90 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
1cea0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
1ceb0 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
1cec0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
1ced0 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
1cee0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
1cef0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1cf00 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
1cf10 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1cf20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1cf30 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
1cf40 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
1cf50 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
1cf60 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a  ->nExpr : 0, 0,.
1cf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf80 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
1cf90 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
1cfa0 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
1cfb0 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
1cfc0 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
1cfd0 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
1cfe0 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
1cff0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
1d000 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
1d010 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1d020 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
1d030 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d040 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1d050 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
1d060 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1d070 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1d080 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
1d090 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
1d0a0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
1d0b0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
1d0c0 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 73 71 6c 69  Mode = 1;.  sqli
1d0d0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
1d0e0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
1d0f0 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
1d100 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
1d110 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
1d120 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  , pF++){.    int
1d130 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61   nArg;.    int a
1d140 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ddrNext = 0;.   
1d150 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20   int regAgg;.   
1d160 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1d170 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
1d180 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
1d190 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1d1a0 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
1d1b0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
1d1c0 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
1d1d0 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c  .      nArg = pL
1d1e0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
1d1f0 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74    regAgg = sqlit
1d200 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
1d210 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20  Parse, nArg);.  
1d220 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1d230 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
1d240 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67  se, pList, regAg
1d250 67 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g, 0);.    }else
1d260 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
1d270 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
1d280 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1d290 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
1d2a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
1d2b0 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
1d2c0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1d2d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
1d2e0 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63  rg==1 );.      c
1d2f0 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
1d300 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  se, pF->iDistinc
1d310 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
1d320 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  regAgg);.    }. 
1d330 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
1d340 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1d350 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
1d360 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
1d370 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
1d380 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1d390 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1d3a0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1d3b0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
1d3c0 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
1d3d0 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20  =0 if pF->pFunc 
1d3e0 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a  has NEEDCOLL */.
1d3f0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
1d400 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
1d410 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
1d420 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
1d430 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1d440 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1d450 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
1d460 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
1d470 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
1d480 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
1d490 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
1d4a0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
1d4b0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1d4c0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1d4d0 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
1d4e0 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
1d4f0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
1d500 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d510 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1d520 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72  OP_AggStep, 0, r
1d530 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c  egAgg, pF->iMem,
1d540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d550 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
1d560 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
1d570 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  DEF);.    sqlite
1d580 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1d590 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20   (u8)nArg);.    
1d5a0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1d5b0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1d5c0 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20  regAgg, nArg);. 
1d5d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1d5e0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1d5f0 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
1d600 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28  , nArg);.    if(
1d610 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20   addrNext ){.   
1d620 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1d630 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
1d640 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73  drNext);.      s
1d650 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
1d660 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
1d670 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
1d680 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pC=pAggInfo->
1d690 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f  aCol; i<pAggInfo
1d6a0 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20  ->nAccumulator; 
1d6b0 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20  i++, pC++){.    
1d6c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1d6d0 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70  pParse, pC->pExp
1d6e0 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20  r, pC->iMem);.  
1d6f0 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  }.  pAggInfo->di
1d700 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  rectMode = 0;.  
1d710 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1d720 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 7d  Clear(pParse);.}
1d730 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1d740 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45   code for the SE
1d750 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67  LECT statement g
1d760 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72  iven in the p ar
1d770 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  gument.  .**.** 
1d780 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
1d790 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76  distributed in v
1d7a0 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65  arious ways depe
1d7b0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
1d7c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1d7d0 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
1d7e0 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
1d7f0 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73  by argument pDes
1d800 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t.** as follows:
1d810 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74  .**.**     pDest
1d820 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73 75 6c  ->eDest    Resul
1d830 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  t.**     -------
1d840 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
1d850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d870 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ----.**     SRT_
1d880 4f 75 74 70 75 74 20 20 20 20 20 20 47 65 6e 65  Output      Gene
1d890 72 61 74 65 20 61 20 72 6f 77 20 6f 66 20 6f 75  rate a row of ou
1d8a0 74 70 75 74 20 28 75 73 69 6e 67 20 74 68 65 20  tput (using the 
1d8b0 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20  OP_ResultRow.** 
1d8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8d0 20 20 20 20 6f 70 63 6f 64 65 29 20 66 6f 72 20      opcode) for 
1d8e0 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
1d8f0 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a  result set..**.*
1d900 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20  *     SRT_Mem   
1d910 20 20 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64        Only valid
1d920 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 69   if the result i
1d930 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  s a single colum
1d940 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  n..**           
1d950 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20            Store 
1d960 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  the first column
1d970 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65   of the first re
1d980 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20  sult row.**     
1d990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9a0 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73  in register pDes
1d9b0 74 2d 3e 69 50 61 72 6d 20 74 68 65 6e 20 61 62  t->iParm then ab
1d9c0 61 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a  andon the rest.*
1d9d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1d9e0 20 20 20 20 20 20 6f 66 20 74 68 65 20 71 75 65        of the que
1d9f0 72 79 2e 20 20 54 68 69 73 20 64 65 73 74 69 6e  ry.  This destin
1da00 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c  ation implies "L
1da10 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20  IMIT 1"..**.**  
1da20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20     SRT_Set      
1da30 20 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 75     The result mu
1da40 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63  st be a single c
1da50 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61  olumn.  Store ea
1da60 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ch.**           
1da70 20 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f 66            row of
1da80 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 6b   result as the k
1da90 65 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65 73  ey in table pDes
1daa0 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20  t->iParm. .**   
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dac0 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66 69    Apply the affi
1dad0 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66 69  nity pDest->affi
1dae0 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74 6f 72  nity before stor
1daf0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1db00 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
1db10 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d 70  ts.  Used to imp
1db20 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c 45  lement "IN (SELE
1db30 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20  CT ...)"..**.** 
1db40 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20      SRT_Union   
1db50 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
1db60 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  s as a key in a 
1db70 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1db80 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
1db90 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
1dba0 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
1dbb0 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
1dbc0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1dbd0 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
1dbe0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c  .**     SRT_Tabl
1dbf0 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  e       Store re
1dc00 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61  sults in tempora
1dc10 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
1dc20 69 50 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20 20  iParm..**       
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
1dc40 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 45  is is like SRT_E
1dc50 70 68 65 6d 54 61 62 20 65 78 63 65 70 74 20 74  phemTab except t
1dc60 68 61 74 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a  hat the table.**
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc80 20 20 20 20 20 69 73 20 61 73 73 75 6d 65 64 20       is assumed 
1dc90 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20 6f 70  to already be op
1dca0 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  en..**.**     SR
1dcb0 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43 72  T_EphemTab    Cr
1dcc0 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72  eate an temporar
1dcd0 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
1dce0 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a  Parm and store.*
1dcf0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1dd00 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c 74        the result
1dd10 20 74 68 65 72 65 2e 20 54 68 65 20 63 75 72 73   there. The curs
1dd20 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20  or is left open 
1dd30 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  after.**        
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1dd50 75 72 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73  urning.  This is
1dd60 20 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20   like SRT_Table 
1dd70 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20  except that.**  
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd90 20 20 20 74 68 69 73 20 64 65 73 74 69 6e 61 74     this destinat
1dda0 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e  ion uses OP_Open
1ddb0 45 70 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65  Ephemeral to cre
1ddc0 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ate.**          
1ddd0 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74             the t
1dde0 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a  able first..**.*
1ddf0 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74  *     SRT_Corout
1de00 69 6e 65 20 20 20 47 65 6e 65 72 61 74 65 20 61  ine   Generate a
1de10 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
1de20 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72   returns a new r
1de30 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  ow of.**        
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
1de50 75 6c 74 73 20 65 61 63 68 20 74 69 6d 65 20 69  ults each time i
1de60 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54  t is invoked.  T
1de70 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a  he entry point.*
1de80 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1de90 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d        of the co-
1dea0 72 6f 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65  routine is store
1deb0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44  d in register pD
1dec0 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
1ded0 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74 73  *     SRT_Exists
1dee0 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31 20        Store a 1 
1def0 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70  in memory cell p
1df00 44 65 73 74 2d 3e 69 50 61 72 6d 20 69 66 20 74  Dest->iParm if t
1df10 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20  he result.**    
1df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df30 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d 70 74   set is not empt
1df40 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  y..**.**     SRT
1df50 5f 44 69 73 63 61 72 64 20 20 20 20 20 54 68 72  _Discard     Thr
1df60 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  ow the results a
1df70 77 61 79 2e 20 20 54 68 69 73 20 69 73 20 75 73  way.  This is us
1df80 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a 2a 20  ed by SELECT.** 
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfa0 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73 20 77      statements w
1dfb0 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 20 77  ithin triggers w
1dfc0 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73  hose only purpos
1dfd0 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  e is.**         
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
1dff0 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f 66 20  side-effects of 
1e000 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  functions..**.**
1e010 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1e020 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
1e030 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
1e040 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
1e050 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
1e060 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
1e070 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
1e080 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
1e090 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
1e0a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1e0b0 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
1e0c0 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
1e0d0 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
1e0e0 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
1e0f0 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
1e100 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69  to do that..*/.i
1e110 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
1e120 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1e130 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
1e140 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
1e150 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1e160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e170 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
1e180 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
1e190 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
1e1a0 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a  t *pDest      /*
1e1b0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
1e1c0 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
1e1d0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
1e1e0 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
1e1f0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1e200 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  rs */.  WhereInf
1e210 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f  o *pWInfo;     /
1e220 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71  * Return from sq
1e230 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1e240 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ) */.  Vdbe *v; 
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e260 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
1e270 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
1e280 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
1e290 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20   isAgg;         
1e2a0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
1e2b0 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
1e2c0 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
1e2d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1e2e0 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
1e2f0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
1e300 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
1e310 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
1e320 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
1e330 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
1e340 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
1e350 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
1e360 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1e370 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
1e380 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
1e390 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f   *pOrderBy;    /
1e3a0 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
1e3b0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
1e3c0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
1e3d0 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
1e3e0 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
1e3f0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
1e400 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
1e410 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
1e420 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
1e430 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
1e440 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  ULL */.  int isD
1e450 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
1e460 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
1e470 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
1e480 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
1e490 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20  int distinct;   
1e4a0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1e4b0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
1e4c0 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20  istinct set */. 
1e4d0 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
1e4e0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1e4f0 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
1e500 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
1e510 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49  .  int addrSortI
1e520 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64  ndex;     /* Add
1e530 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70  ress of an OP_Op
1e540 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
1e550 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67  ruction */.  Agg
1e560 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20  Info sAggInfo;  
1e570 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
1e580 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65  on used by aggre
1e590 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
1e5a0 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20    int iEnd;     
1e5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1e5c0 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f  ess of the end o
1e5d0 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
1e5e0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
1e5f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1e600 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1e610 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50  on */..  db = pP
1e620 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
1e630 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
1e640 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
1e650 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
1e660 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
1e670 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1e680 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1e690 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
1e6a0 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
1e6b0 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49  .  memset(&sAggI
1e6c0 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  nfo, 0, sizeof(s
1e6d0 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 70 4f  AggInfo));..  pO
1e6e0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
1e6f0 65 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f  erBy;.  if( Igno
1e700 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
1e710 73 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f  st) ){.    p->pO
1e720 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 20  rderBy = 0;..   
1e730 20 2f 2a 20 49 6e 20 74 68 65 73 65 20 63 61 73   /* In these cas
1e740 65 73 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  es the DISTINCT 
1e750 6f 70 65 72 61 74 6f 72 20 6d 61 6b 65 73 20 6e  operator makes n
1e760 6f 20 64 69 66 66 65 72 65 6e 63 65 20 74 6f 20  o difference to 
1e770 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  the.    ** resul
1e780 74 73 2c 20 73 6f 20 72 65 6d 6f 76 65 20 69 74  ts, so remove it
1e790 20 69 66 20 69 74 20 77 65 72 65 20 73 70 65 63   if it were spec
1e7a0 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ified..    */.  
1e7b0 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e    assert(pDest->
1e7c0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74  eDest==SRT_Exist
1e7d0 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  s || pDest->eDes
1e7e0 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20  t==SRT_Union || 
1e7f0 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
1e800 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
1e810 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65  cept || pDest->e
1e820 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
1e830 64 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c  d);.    p->selFl
1e840 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
1e850 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
1e860 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
1e870 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70 54  rse, p, 0);.  pT
1e880 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
1e890 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
1e8a0 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 50  pEList;.  if( pP
1e8b0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
1e8c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1e8d0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
1e8e0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e  t_end;.  }.  p->
1e8f0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
1e900 72 42 79 3b 0a 20 20 69 73 41 67 67 20 3d 20 28  rBy;.  isAgg = (
1e910 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1e920 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
1e930 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
1e940 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1e950 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44  d;..  /* .  ** D
1e960 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d  o not even attem
1e970 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  pt to generate a
1e980 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61  ny code if we ha
1e990 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a  ve already seen.
1e9a0 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f    ** errors befo
1e9b0 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
1e9c0 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69  starts..  */.  i
1e9d0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  f( pParse->nErr>
1e9e0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
1e9f0 65 6e 64 3b 0a 0a 20 20 2f 2a 20 4f 52 44 45 52  end;..  /* ORDER
1ea00 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66   BY is ignored f
1ea10 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74  or some destinat
1ea20 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
1ea30 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62   IgnorableOrderb
1ea40 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
1ea50 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1ea60 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
1ea70 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
1ea80 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1ea90 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1eaa0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
1eab0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1eac0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1ead0 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
1eae0 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
1eaf0 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
1eb00 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1eb10 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1eb20 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1eb30 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1eb40 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e  .  for(i=0; !p->
1eb50 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62  pPrior && i<pTab
1eb60 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
1eb70 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1eb80 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1eb90 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1eba0 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65  i];.    SelectDe
1ebb0 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c  st dest;.    Sel
1ebc0 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65  ect *pSub = pIte
1ebd0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
1ebe0 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20  int isAggSub;.. 
1ebf0 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c     if( pSub==0 |
1ec00 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c  | pItem->isPopul
1ec10 61 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ated ) continue;
1ec20 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
1ec30 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74  nt Parse.nHeight
1ec40 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f   by the height o
1ec50 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78  f the largest ex
1ec60 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
1ec70 74 72 65 65 20 72 65 66 65 72 65 64 20 74 6f 20  tree refered to 
1ec80 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
1ec90 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
1eca0 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
1ecb0 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
1ecc0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
1ecd0 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
1ece0 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
1ecf0 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
1ed00 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
1ed10 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
1ed20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
1ed30 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
1ed40 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
1ed50 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
1ed60 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
1ed70 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
1ed80 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
1ed90 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
1eda0 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
1edb0 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ght(p);..    /* 
1edc0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1edd0 74 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  the subquery can
1ede0 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
1edf0 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f  o the parent. */
1ee00 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20  .    isAggSub = 
1ee10 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
1ee20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
1ee30 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74  =0;.    if( flat
1ee40 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72  tenSubquery(pPar
1ee50 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c  se, p, i, isAgg,
1ee60 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20   isAggSub) ){.  
1ee70 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62      if( isAggSub
1ee80 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67   ){.        isAg
1ee90 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  g = 1;.        p
1eea0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
1eeb0 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20  _Aggregate;.    
1eec0 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31    }.      i = -1
1eed0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1eee0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
1eef0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
1ef00 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
1ef10 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
1ef20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1ef30 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3d  em->isPopulated=
1ef40 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1ef50 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
1ef60 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
1ef70 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 50        pItem->isP
1ef80 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20 20  opulated = 1;.  
1ef90 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72    }.    if( pPar
1efa0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
1efb0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1efc0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
1efd0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
1efe0 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
1eff0 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   -= sqlite3Selec
1f000 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
1f010 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
1f020 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
1f030 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
1f040 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
1f050 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
1f060 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
1f070 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
1f080 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66  ->pEList;.#endif
1f090 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
1f0a0 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
1f0b0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
1f0c0 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
1f0d0 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73  pHaving;.  isDis
1f0e0 74 69 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46  tinct = (p->selF
1f0f0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1f100 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66  ct)!=0;..#ifndef
1f110 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
1f120 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
1f130 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
1f140 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
1f150 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
1f160 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
1f170 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
1f180 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1f190 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
1f1a0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65  t==0 ){.      Se
1f1b0 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52  lect *pLoop, *pR
1f1c0 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ight = 0;.      
1f1d0 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
1f1e0 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b     int mxSelect;
1f1f0 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  .      for(pLoop
1f200 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
1f210 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20  =pLoop->pPrior, 
1f220 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  cnt++){.        
1f230 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73  pLoop->pRightmos
1f240 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70  t = p;.        p
1f250 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52  Loop->pNext = pR
1f260 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52  ight;.        pR
1f270 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20  ight = pLoop;.  
1f280 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65      }.      mxSe
1f290 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  lect = db->aLimi
1f2a0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
1f2b0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b  OMPOUND_SELECT];
1f2c0 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c  .      if( mxSel
1f2d0 65 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c  ect && cnt>mxSel
1f2e0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
1f2f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1f300 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
1f310 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75   terms in compou
1f320 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20  nd SELECT");.   
1f330 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1f340 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1f350 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
1f360 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
1f370 44 65 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Dest);.  }.#endi
1f380 66 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  f..  /* If writi
1f390 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
1f3a0 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
1f3b0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
1f3c0 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
1f3d0 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23  e output..  */.#
1f3e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f3f0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
1f400 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
1f410 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
1f420 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
1f430 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
1f440 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
1f450 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
1f460 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73 69  f..  /* If possi
1f470 62 6c 65 2c 20 72 65 77 72 69 74 65 20 74 68 65  ble, rewrite the
1f480 20 71 75 65 72 79 20 74 6f 20 75 73 65 20 47 52   query to use GR
1f490 4f 55 50 20 42 59 20 69 6e 73 74 65 61 64 20 6f  OUP BY instead o
1f4a0 66 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a  f DISTINCT..  **
1f4b0 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20   GROUP BY might 
1f4c0 75 73 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49  use an index, DI
1f4d0 53 54 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65  STINCT never doe
1f4e0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  s..  */.  if( (p
1f4f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1f500 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1f510 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
1f520 74 69 6e 63 74 20 26 26 20 21 70 2d 3e 70 47 72  tinct && !p->pGr
1f530 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 70 2d 3e  oupBy ){.    p->
1f540 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
1f550 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
1f560 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b  , p->pEList, 0);
1f570 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
1f580 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
1f590 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
1f5a0 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
1f5b0 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30    isDistinct = 0
1f5c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1f5d0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
1f5e0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
1f5f0 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20   this sorting.  
1f600 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65  ** index might e
1f610 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73  nd up being unus
1f620 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63  ed if the data c
1f630 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72  an be .  ** extr
1f640 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72  acted in pre-sor
1f650 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74  ted order.  If t
1f660 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c  hat is the case,
1f670 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f   then the.  ** O
1f680 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
1f690 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c  instruction will
1f6a0 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
1f6b0 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20  n OP_Noop once. 
1f6c0 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75   ** we figure ou
1f6d0 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69  t that the sorti
1f6e0 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ng index is not 
1f6f0 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64  needed.  The add
1f700 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20  rSortIndex.  ** 
1f710 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
1f720 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
1f730 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f  hat change..  */
1f740 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
1f750 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
1f760 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b  pKeyInfo;.    pK
1f770 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
1f780 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
1f790 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  rse, pOrderBy);.
1f7a0 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45      pOrderBy->iE
1f7b0 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
1f7c0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e  >nTab++;.    p->
1f7d0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
1f7e0 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  = addrSortIndex 
1f7f0 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  =.      sqlite3V
1f800 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1f810 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f830 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
1f840 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f  By->iECursor, pO
1f850 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
1f860 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1f880 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
1f890 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
1f8a0 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FF);.  }else{.  
1f8b0 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20    addrSortIndex 
1f8c0 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
1f8d0 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
1f8e0 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
1f8f0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
1f900 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
1f910 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
1f920 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
1f930 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
1f940 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f950 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
1f960 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61  eral, pDest->iPa
1f970 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
1f980 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  r);.  }..  /* Se
1f990 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
1f9a0 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
1f9b0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1f9c0 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
1f9d0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
1f9e0 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
1f9f0 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72  .  /* Open a vir
1fa00 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73  tual index to us
1fa10 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
1fa20 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
1fa30 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b  f( isDistinct ){
1fa40 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
1fa50 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65  eyInfo;.    asse
1fa60 72 74 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72  rt( isAgg || pGr
1fa70 6f 75 70 42 79 20 29 3b 0a 20 20 20 20 64 69 73  oupBy );.    dis
1fa80 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
1fa90 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79  nTab++;.    pKey
1faa0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
1fab0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
1fac0 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  e, p->pEList);. 
1fad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1fae0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
1faf0 70 68 65 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e  phemeral, distin
1fb00 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
1fb30 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
1fb40 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b  NDOFF);.  }else{
1fb50 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
1fb60 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67  -1;.  }..  /* Ag
1fb70 67 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d  gregate and non-
1fb80 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
1fb90 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69  s are handled di
1fba0 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69  fferently */.  i
1fbb0 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72  f( !isAgg && pGr
1fbc0 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
1fbd0 2f 2a 20 54 68 69 73 20 63 61 73 65 20 69 73 20  /* This case is 
1fbe0 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  for non-aggregat
1fbf0 65 20 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2a  e queries.    **
1fc00 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
1fc10 61 73 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a  ase scan.    */.
1fc20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
1fc30 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
1fc40 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
1fc50 20 70 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72   pWhere, &pOrder
1fc60 42 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  By, 0);.    if( 
1fc70 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
1fc80 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
1fc90 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
1fca0 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
1fcb0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
1fcc0 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  r OP_OpenEphemer
1fcd0 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  al .    ** instr
1fce0 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20  uction ended up 
1fcf0 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64  not being needed
1fd00 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  , then change th
1fd10 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
1fd20 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
1fd30 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
1fd40 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f  /.    if( addrSo
1fd50 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f  rtIndex>=0 && pO
1fd60 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
1fd70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1fd80 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
1fd90 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 31 29 3b  drSortIndex, 1);
1fda0 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
1fdb0 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a  enEphm[2] = -1;.
1fdc0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
1fdd0 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
1fde0 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f  nner loop.    */
1fdf0 0a 20 20 20 20 61 73 73 65 72 74 28 21 69 73 44  .    assert(!isD
1fe00 69 73 74 69 6e 63 74 29 3b 0a 20 20 20 20 73 65  istinct);.    se
1fe10 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
1fe20 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
1fe30 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
1fe40 20 2d 31 2c 20 70 44 65 73 74 2c 0a 20 20 20 20   -1, pDest,.    
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe60 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
1fe70 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
1fe80 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  k);..    /* End 
1fe90 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
1fea0 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
1feb0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1fec0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
1fed0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
1fee0 20 69 73 20 74 68 65 20 70 72 6f 63 65 73 73 69   is the processi
1fef0 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
1ff00 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20   queries */.    
1ff10 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
1ff20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
1ff30 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ext for processi
1ff40 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66  ng aggregate inf
1ff50 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
1ff60 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20  int iAMem;      
1ff70 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
1ff80 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f   address for sto
1ff90 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f  ring current GRO
1ffa0 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
1ffb0 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iBMem;         
1ffc0 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
1ffd0 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f  dress for previo
1ffe0 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  us GROUP BY */. 
1fff0 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b     int iUseFlag;
20000 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64         /* Mem ad
20010 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c  dress holding fl
20020 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ag indicating th
20030 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20  at at least.    
20040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20050 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f      ** one row o
20060 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74  f the input to t
20070 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61  he aggregator ha
20080 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20  s been.         
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
200a0 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  * processed */. 
200b0 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61     int iAbortFla
200c0 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64  g;     /* Mem ad
200d0 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73  dress which caus
200e0 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69  es query abort i
200f0 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20  f positive */.  
20100 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72    int groupBySor
20110 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f  t;    /* Rows co
20120 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69  me from source i
20130 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
20140 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
20150 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  End;        /* E
20160 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67  nd of processing
20170 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
20180 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f   */..    /* Remo
20190 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61  ve any and all a
201a0 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20 74  liases between t
201b0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
201c0 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f  d the.    ** GRO
201d0 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  UP BY clause..  
201e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
201f0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69  oupBy ){.      i
20200 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  nt k;           
20210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20220 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
20230 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
20240 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
20250 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  m;  /* For loopi
20260 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73 69  ng over expressi
20270 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a  on in a list */.
20280 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e  .      for(k=p->
20290 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
202a0 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Item=p->pEList->
202b0 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74  a; k>0; k--, pIt
202c0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
202d0 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30  Item->iAlias = 0
202e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
202f0 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e  for(k=pGroupBy->
20300 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72  nExpr, pItem=pGr
20310 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  oupBy->a; k>0; k
20320 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
20330 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c        pItem->iAl
20340 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
20350 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a  .    }.. .    /*
20360 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20   Create a label 
20370 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20  to jump to when 
20380 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74  we want to abort
20390 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
203a0 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69    addrEnd = sqli
203b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
203c0 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  (v);..    /* Con
203d0 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  vert TK_COLUMN n
203e0 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47  odes into TK_AGG
203f0 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65  _COLUMN and make
20400 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20   entries in.    
20410 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20  ** sAggInfo for 
20420 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  all TK_AGG_FUNCT
20430 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70  ION nodes in exp
20440 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ressions of the.
20450 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74      ** SELECT st
20460 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a  atement..    */.
20470 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
20480 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
20490 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
204a0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
204b0 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
204c0 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e  abList;.    sNC.
204d0 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67  pAggInfo = &sAgg
204e0 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e  Info;.    sAggIn
204f0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
20500 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
20510 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31  GroupBy->nExpr+1
20520 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
20530 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
20540 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69  roupBy;.    sqli
20550 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
20560 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
20570 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
20580 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
20590 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42  st(&sNC, pOrderB
205a0 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76  y);.    if( pHav
205b0 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
205c0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
205d0 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
205e0 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a  pHaving);.    }.
205f0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63      sAggInfo.nAc
20600 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67  cumulator = sAgg
20610 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Info.nColumn;.  
20620 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
20630 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b  gInfo.nFunc; i++
20640 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
20650 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
20660 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  y(sAggInfo.aFunc
20670 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49  [i].pExpr, EP_xI
20680 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
20690 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
206a0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
206b0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
206c0 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  [i].pExpr->x.pLi
206d0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
206e0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
206f0 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
20700 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50  t_end;..    /* P
20710 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
20720 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52  gregates with GR
20730 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64  OUP BY is very d
20740 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20  ifferent and.   
20750 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f   ** much more co
20760 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65  mplex than aggre
20770 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20  gates without a 
20780 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f  GROUP BY..    */
20790 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
207a0 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e  y ){.      KeyIn
207b0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f  fo *pKeyInfo;  /
207c0 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61  * Keying informa
207d0 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f  tion for the gro
207e0 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
207f0 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20        int j1;   
20800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76            /* A-v
20810 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20  s-B comparision 
20820 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  jump */.      in
20830 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b  t addrOutputRow;
20840 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75    /* Start of su
20850 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
20860 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72  tputs a result r
20870 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ow */.      int 
20880 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20  regOutputRow;   
20890 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
208a0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f  s register for o
208b0 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
208c0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
208d0 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a  drSetAbort;   /*
208e0 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66   Set the abort f
208f0 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  lag and return *
20900 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
20910 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54  TopOfLoop;  /* T
20920 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  op of the input 
20930 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  loop */.      in
20940 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  t addrSortingIdx
20950 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e  ; /* The OP_Open
20960 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68  Ephemeral for th
20970 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
20980 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
20990 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
209a0 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72  Subroutine for r
209b0 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63  esetting the acc
209c0 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20  umulator */.    
209d0 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20    int regReset; 
209e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
209f0 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
20a00 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f   for reset subro
20a10 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20  utine */..      
20a20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
20a30 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
20a40 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61   we might need a
20a50 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
20a60 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  o.      ** imple
20a70 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61  ment it.  Alloca
20a80 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  te that sorting 
20a90 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69  index now.  If i
20aa0 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20  t turns out.    
20ab0 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
20ac0 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65  not need it afte
20ad0 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 45  r all, the OpenE
20ae0 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
20af0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69  tion.      ** wi
20b00 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
20b10 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20  into a Noop.  . 
20b20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41       */.      sA
20b30 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
20b40 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
20b50 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  ++;.      pKeyIn
20b60 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
20b70 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
20b80 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20   pGroupBy);.    
20b90 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78    addrSortingIdx
20ba0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
20bb0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
20bc0 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20  phemeral, .     
20bd0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
20be0 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e  rtingIdx, sAggIn
20bf0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
20c00 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c  n, .          0,
20c10 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
20c20 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
20c30 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  DOFF);..      /*
20c40 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
20c50 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65  ry locations use
20c60 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67  d by GROUP BY ag
20c70 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69  gregate processi
20c80 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ng.      */.    
20c90 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70    iUseFlag = ++p
20ca0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
20cb0 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20     iAbortFlag = 
20cc0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
20cd0 20 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52        regOutputR
20ce0 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ow = ++pParse->n
20cf0 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  Mem;.      addrO
20d00 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
20d10 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
20d20 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73  v);.      regRes
20d30 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
20d40 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52  Mem;.      addrR
20d50 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64  eset = sqlite3Vd
20d60 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
20d70 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50        iAMem = pP
20d80 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
20d90 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
20da0 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
20db0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d  nExpr;.      iBM
20dc0 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
20dd0 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
20de0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
20df0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
20e00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20e10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
20e20 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c  ger, 0, iAbortFl
20e30 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
20e40 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61  omment((v, "clea
20e50 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  r abort flag"));
20e60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
20e70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
20e80 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46  nteger, 0, iUseF
20e90 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
20ea0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
20eb0 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  icate accumulato
20ec0 72 20 65 6d 70 74 79 22 29 29 3b 0a 0a 20 20 20  r empty"));..   
20ed0 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
20ee0 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
20ef0 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
20f00 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
20f10 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
20f20 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
20f30 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
20f40 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
20f50 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
20f60 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
20f70 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
20f80 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
20f90 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
20fa0 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
20fb0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
20fc0 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
20fd0 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
20fe0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
20ff0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21000 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
21010 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
21020 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
21030 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
21040 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
21050 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 47  ist, pWhere, &pG
21060 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20  roupBy, 0);.    
21070 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
21080 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
21090 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72  d;.      if( pGr
210a0 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
210b0 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d      /* The optim
210c0 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20  izer is able to 
210d0 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
210e0 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73  group by order s
210f0 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20  o.        ** we 
21100 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73  do not have to s
21110 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65  ort.  The OP_Ope
21120 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65  nEphemeral table
21130 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
21140 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61   ** cancelled la
21150 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73  ter because we s
21160 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65  till need to use
21170 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20   the pKeyInfo.  
21180 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21190 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
211a0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
211b0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30   groupBySort = 0
211c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
211d0 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61         /* Rows a
211e0 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e  re coming out in
211f0 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72   undetermined or
21200 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  der.  We have to
21210 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a   push.        **
21220 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61   each row into a
21230 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20   sorting index, 
21240 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69  terminate the fi
21250 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20  rst loop,.      
21260 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f    ** then loop o
21270 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  ver the sorting 
21280 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74  index in order t
21290 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74  o get the output
212a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73  .        ** in s
212b0 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20  orted order.    
212c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
212d0 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20  nt regBase;.    
212e0 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72      int regRecor
212f0 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
21300 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Col;.        int
21310 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20   nGroupBy;..    
21320 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
21330 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72  = 1;.        nGr
21340 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
21350 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
21360 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79   nCol = nGroupBy
21370 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20   + 1;.        j 
21380 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20  = nGroupBy+1;.  
21390 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
213a0 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
213b0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
213c0 20 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e     if( sAggInfo.
213d0 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43  aCol[i].iSorterC
213e0 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
213f0 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a          nCol++;.
21400 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
21410 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
21430 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33  egBase = sqlite3
21440 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
21450 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  rse, nCol);.    
21460 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21470 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
21480 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21490 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
214a0 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
214b0 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29  pBy, regBase, 0)
214c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
214d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
214e0 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67  P_Sequence, sAgg
214f0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
21500 72 65 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79  regBase+nGroupBy
21510 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  );.        j = n
21520 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20  GroupBy+1;.     
21530 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
21540 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
21550 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
21560 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
21570 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67  ol *pCol = &sAgg
21580 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  Info.aCol[i];.  
21590 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
215a0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ->iSorterColumn>
215b0 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
215c0 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72    int r1 = j + r
215d0 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
215e0 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20      int r2;..   
215f0 20 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71           r2 = sq
21600 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
21610 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a  Column(pParse, .
21620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21640 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d  Col->pTab, pCol-
21650 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e  >iColumn, pCol->
21660 69 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a  iTable, r1, 0);.
21670 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21680 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20  r1!=r2 ){.      
21690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
216a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
216b0 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a  SCopy, r2, r1);.
216c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
216d0 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
216e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
216f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
21700 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
21710 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
21720 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
21730 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
21740 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
21750 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72  regBase, nCol, r
21760 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
21770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21780 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
21790 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  sert, sAggInfo.s
217a0 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65  ortingIdx, regRe
217b0 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
217c0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
217d0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
217e0 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
217f0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
21800 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
21810 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b   regBase, nCol);
21820 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21830 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
21840 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21850 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21860 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f  P_Sort, sAggInfo
21870 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
21880 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56  rEnd);.        V
21890 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
218a0 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29  GROUP BY sort"))
218b0 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
218c0 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  fo.useSortingIdx
218d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   = 1;.        sq
218e0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
218f0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
21900 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
21910 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72  valuate the curr
21920 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
21930 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ms and store in 
21940 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20  b0, b1, b2....  
21950 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65      ** (b0 is me
21960 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42  mory location iB
21970 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d  Mem+0, b1 is iBM
21980 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72  em+1, and so for
21990 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  th).      ** The
219a0 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75  n compare the cu
219b0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
219c0 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65  erms against the
219d0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a   GROUP BY terms.
219e0 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
219f0 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63  e previous row c
21a00 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
21a10 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e  in a0, a1, a2...
21a20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21a30 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20  addrTopOfLoop = 
21a40 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
21a50 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
21a60 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
21a70 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
21a80 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
21a90 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
21aa0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
21ab0 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
21ac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
21ad0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
21ae0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67  , OP_Column, sAg
21af0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
21b00 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  , j, iBMem+j);. 
21b10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21b20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
21b30 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  .directMode = 1;
21b40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21b50 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
21b60 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a  e, pGroupBy->a[j
21b70 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a  ].pExpr, iBMem+j
21b80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
21b90 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
21ba0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
21bb0 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65  OP_Compare, iAMe
21bc0 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iBMem, pGroup
21bd0 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  By->nExpr,.     
21be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bf0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
21c00 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
21c10 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71  );.      j1 = sq
21c20 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
21c30 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
21c40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
21c50 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b  (v, OP_Jump, j1+
21c60 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20  1, 0, j1+1);..  
21c70 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
21c80 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  code that runs w
21c90 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55  henever the GROU
21ca0 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20  P BY changes..  
21cb0 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69      ** Changes i
21cc0 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  n the GROUP BY a
21cd0 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74  re detected by t
21ce0 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
21cf0 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e  .      ** block.
21d00 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20    If there were 
21d10 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73  no changes, this
21d20 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65   block is skippe
21d30 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
21d40 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63    ** This code c
21d50 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72  opies current gr
21d60 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20  oup by terms in 
21d70 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20  b0,b1,b2,....   
21d80 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30     ** over to a0
21d90 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e  ,a1,a2.  It then
21da0 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75   calls the outpu
21db0 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  t subroutine.   
21dc0 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73     ** and resets
21dd0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
21de0 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
21df0 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74  ters in preparat
21e00 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ion.      ** for
21e10 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20   the next GROUP 
21e20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20  BY batch..      
21e30 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
21e40 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
21e50 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65  rse, iBMem, iAMe
21e60 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
21e70 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
21e80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21e90 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
21ea0 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
21eb0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
21ec0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
21ed0 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29  utput one row"))
21ee0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21ef0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21f00 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61  IfPos, iAbortFla
21f10 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  g, addrEnd);.   
21f20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
21f30 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20  v, "check abort 
21f40 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
21f50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21f60 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
21f70 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
21f80 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
21f90 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74  mment((v, "reset
21fa0 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
21fb0 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
21fc0 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
21fd0 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73  accumulators bas
21fe0 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
21ff0 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  t of.      ** th
22000 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20  e current row.  
22010 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
22020 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
22030 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75  (v, j1);.      u
22040 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
22050 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
22060 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
22070 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22080 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
22090 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
220a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
220b0 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69  "indicate data i
220c0 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  n accumulator"))
220d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;..      /* End 
220e0 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20  of the loop.    
220f0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67    */.      if( g
22100 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
22110 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22120 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
22130 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  xt, sAggInfo.sor
22140 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70  tingIdx, addrTop
22150 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d  OfLoop);.      }
22160 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
22170 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
22180 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
22190 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
221a0 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
221b0 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a 20 20  rtingIdx, 1);.  
221c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
221d0 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c  Output the final
221e0 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20   row of result. 
221f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
22200 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22210 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
22220 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
22230 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
22240 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
22250 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72   "output final r
22260 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ow"));..      /*
22270 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73   Jump over the s
22280 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20  ubroutines.     
22290 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
222a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
222b0 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
222c0 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  nd);..      /* G
222d0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
222e0 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
222f0 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
22300 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
22310 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73     ** set.  This
22320 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73   subroutine firs
22330 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69  t looks at the i
22340 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73  UseFlag.  If iUs
22350 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69  eFlag.      ** i
22360 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
22370 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
22380 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20  e subroutine is 
22390 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20  a no-op.  If.   
223a0 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
223b0 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74  sing calls for t
223c0 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72  he query to abor
223d0 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  t, this subrouti
223e0 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72  ne.      ** incr
223f0 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72  ements the iAbor
22400 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63  tFlag memory loc
22410 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74  ation before ret
22420 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20  urning in.      
22430 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e  ** order to sign
22440 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  al the caller to
22450 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f   abort..      */
22460 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62  .      addrSetAb
22470 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ort = sqlite3Vdb
22480 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
22490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
224a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
224b0 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72  nteger, 1, iAbor
224c0 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
224d0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
224e0 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  et abort flag"))
224f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22500 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
22510 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
22520 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c  tRow);.      sql
22530 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
22540 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70  abel(v, addrOutp
22550 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64  utRow);.      ad
22560 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
22570 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
22580 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
22590 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
225a0 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55  (v, OP_IfPos, iU
225b0 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70  seFlag, addrOutp
225c0 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20  utRow+2);.      
225d0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
225e0 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20  "Groupby result 
225f0 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20  generator entry 
22600 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20  point"));.      
22610 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22620 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
22630 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
22640 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
22650 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
22660 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
22670 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
22680 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22690 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
226a0 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
226b0 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20  ddrOutputRow+1, 
226c0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
226d0 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  L);.      }.    
226e0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
226f0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
22700 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
22710 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
22720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
22730 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
22740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22750 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
22760 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f  ow+1, addrSetAbo
22770 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
22780 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
22790 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
227a0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
227b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
227c0 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73  "end groupby res
227d0 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29  ult generator"))
227e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
227f0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
22800 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65  e that will rese
22810 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61  t the group-by a
22820 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20  ccumulator.     
22830 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
22840 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
22850 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b  l(v, addrReset);
22860 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75  .      resetAccu
22870 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
22880 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
22890 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
228a0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
228b0 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20  , regReset);.   
228c0 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69    .    } /* endi
228d0 66 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20  f pGroupBy */.  
228e0 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45    else {.      E
228f0 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20  xprList *pDel = 
22900 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
22910 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
22920 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  T.      Table *p
22930 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Tab;.      if( (
22940 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43  pTab = isSimpleC
22950 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66  ount(p, &sAggInf
22960 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  o))!=0 ){.      
22970 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65    /* If isSimple
22980 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20  Count() returns 
22990 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
229a0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  able structure, 
229b0 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
229c0 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
229d0 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
229e0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
229f0 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
22a00 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
22a10 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  tbl>.        **.
22a20 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65          ** where
22a30 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
22a40 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65  ture returned re
22a50 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c  presents table <
22a60 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tbl>..        **
22a70 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
22a80 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f   statement is so
22a90 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20   common that it 
22aa0 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65  is optimized spe
22ab0 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20  cially. The.    
22ac0 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20      ** OP_Count 
22ad0 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65  instruction is e
22ae0 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f  xecuted either o
22af0 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62  n the intkey tab
22b00 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  le that.        
22b10 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
22b20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c  data for table <
22b30 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f  tbl> or on one o
22b40 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49  f its indexes. I
22b50 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  t.        ** is 
22b60 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74  better to execut
22b70 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69  e the op on an i
22b80 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73  ndex, as indexes
22b90 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20   are almost.    
22ba0 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70      ** always sp
22bb0 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73  read across less
22bc0 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69   pages than thei
22bd0 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
22be0 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20  tables..        
22bf0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
22c00 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
22c10 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
22c20 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
22c30 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
22c40 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43      const int iC
22c50 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  sr = pParse->nTa
22c60 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73  b++;     /* Curs
22c70 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65  or to scan b-tre
22c80 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  e */.        Ind
22c90 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cb0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
22cc0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
22cd0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
22ce0 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nfo = 0;        
22cf0 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66         /* Keyinf
22d00 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e  o for scanned in
22d10 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  dex */.        I
22d20 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b  ndex *pBest = 0;
22d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d40 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65      /* Best inde
22d50 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a  x found so far *
22d60 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
22d70 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  oot = pTab->tnum
22d80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22d90 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73  * Root page of s
22da0 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f  canned b-tree */
22db0 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
22dc0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
22dd0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
22de0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
22df0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
22e00 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
22e10 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
22e20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  );..        /* S
22e30 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e  earch for the in
22e40 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65  dex that has the
22e50 20 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20 6f 66   least amount of
22e60 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20 20 20   columns. If.   
22e70 20 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73       ** there is
22e80 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2c 20   such an index, 
22e90 61 6e 64 20 69 74 20 68 61 73 20 6c 65 73 73 20  and it has less 
22ea0 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20 74 68 65  columns than the
22eb0 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a   table.        *
22ec0 2a 20 64 6f 65 73 2c 20 74 68 65 6e 20 77 65 20  * does, then we 
22ed0 63 61 6e 20 61 73 73 75 6d 65 20 74 68 61 74 20  can assume that 
22ee0 69 74 20 63 6f 6e 73 75 6d 65 73 20 6c 65 73 73  it consumes less
22ef0 20 73 70 61 63 65 20 6f 6e 20 64 69 73 6b 20 61   space on disk a
22f00 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  nd.        ** wi
22f10 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65 20  ll therefore be 
22f20 63 68 65 61 70 65 72 20 74 6f 20 73 63 61 6e 20  cheaper to scan 
22f30 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
22f40 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 20   query result.. 
22f50 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69         ** In thi
22f60 73 20 63 61 73 65 20 73 65 74 20 69 52 6f 6f 74  s case set iRoot
22f70 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
22f80 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
22f90 69 6e 64 65 78 20 62 2d 74 72 65 65 0a 20 20 20  index b-tree.   
22fa0 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 4b 65 79       ** and pKey
22fb0 49 6e 66 6f 20 74 6f 20 74 68 65 20 4b 65 79 49  Info to the KeyI
22fc0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 72 65  nfo structure re
22fd0 71 75 69 72 65 64 20 74 6f 20 6e 61 76 69 67 61  quired to naviga
22fe0 74 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  te the.        *
22ff0 2a 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  * index..       
23000 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
23010 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b  n practice the K
23020 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
23030 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
23040 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20  d. It is only . 
23050 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64         ** passed
23060 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e   to keep OP_Open
23070 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20  Read happy..    
23080 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66      */.        f
23090 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
230a0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
230b0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
230c0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 42           if( !pB
230d0 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f  est || pIdx->nCo
230e0 6c 75 6d 6e 3c 70 42 65 73 74 2d 3e 6e 43 6f 6c  lumn<pBest->nCol
230f0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
23100 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b     pBest = pIdx;
23110 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23130 66 28 20 70 42 65 73 74 20 26 26 20 70 42 65 73  f( pBest && pBes
23140 74 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d  t->nColumn<pTab-
23150 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
23160 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74     iRoot = pBest
23170 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  ->tnum;.        
23180 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
23190 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
231a0 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b  (pParse, pBest);
231b0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
231c0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65      /* Open a re
231d0 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20  ad-only cursor, 
231e0 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43  execute the OP_C
231f0 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20  ount, close the 
23200 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20  cursor. */.     
23210 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23220 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
23230 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74  ead, iCsr, iRoot
23240 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
23250 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
23260 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23270 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
23280 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65   -1, (char *)pKe
23290 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
232a0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
232b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
232c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
232d0 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73  v, OP_Count, iCs
232e0 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  r, sAggInfo.aFun
232f0 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20  c[0].iMem);.    
23300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23310 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
23320 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  e, iCsr);.      
23330 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
23340 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
23350 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20  ECOUNT */.      
23360 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
23370 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20  ck if the query 
23380 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
23390 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73   following forms
233a0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
233b0 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
233c0 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   min(x) FROM ...
233d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
233e0 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d  LECT max(x) FROM
233f0 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   ....        **.
23400 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74          ** If it
23410 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68   is, then ask th
23420 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  e code in where.
23430 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  c to attempt to 
23440 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20  sort results.   
23450 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68       ** as if th
23460 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45  ere was an "ORDE
23470 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45  R ON x" or "ORDE
23480 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61  R ON x DESC" cla
23490 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  use. .        **
234a0 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61   If where.c is a
234b0 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72  ble to produce r
234c0 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e  esults sorted in
234d0 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65   this order, the
234e0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  n.        ** add
234f0 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72   vdbe code to br
23500 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70  eak out of the p
23510 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61  rocessing loop a
23520 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20  fter the .      
23530 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61    ** first itera
23540 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20  tion (since the 
23550 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
23560 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a  of the loop is .
23570 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61          ** guara
23580 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65  nteed to operate
23590 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68   on the row with
235a0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20   the minimum or 
235b0 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20  maximum .       
235c0 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20   ** value of x, 
235d0 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71  the only row req
235e0 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20  uired)..        
235f0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20  **.        ** A 
23600 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73  special flag mus
23610 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73  t be passed to s
23620 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
23630 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20  () to slightly. 
23640 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79         ** modify
23650 20 62 65 68 61 76 69 6f 75 72 20 61 73 20 66 6f   behaviour as fo
23660 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a  llows:.        *
23670 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
23680 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
23690 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
236a0 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f  )", then the loo
236b0 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20  p coded by.     
236c0 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e     **     where.
236d0 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65  c should not ite
236e0 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61  rate over any va
236f0 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c  lues with a NULL
23700 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
23710 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20  *     for x..   
23720 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
23730 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d  **   + The optim
23740 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65  izer code in whe
23750 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20  re.c (the thing 
23760 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69  that decides whi
23770 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ch.        **   
23780 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63    index or indic
23790 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c  es to use) shoul
237a0 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72  d place a differ
237b0 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20  ent priority on 
237c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
237d0 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27  satisfying the '
237e0 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65  ORDER BY' clause
237f0 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e   than it does in
23800 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20   other cases..  
23810 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66        **     Ref
23820 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63  er to code and c
23830 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65  omments in where
23840 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  .c for details..
23850 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
23860 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69     ExprList *pMi
23870 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nMax = 0;.      
23880 20 20 75 38 20 66 6c 61 67 20 3d 20 6d 69 6e 4d    u8 flag = minM
23890 61 78 51 75 65 72 79 28 70 29 3b 0a 20 20 20 20  axQuery(p);.    
238a0 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a      if( flag ){.
238b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
238c0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
238d0 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ty(p->pEList->a[
238e0 30 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  0].pExpr, EP_xIs
238f0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
23900 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73       pMinMax = s
23910 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
23920 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  p(db, p->pEList-
23930 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 78 2e 70  >a[0].pExpr->x.p
23940 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20 20 20 20  List,0);.       
23950 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61     pDel = pMinMa
23960 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
23970 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62 2d   pMinMax && !db-
23980 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
23990 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69  .            pMi
239a0 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  nMax->a[0].sortO
239b0 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45  rder = flag!=WHE
239c0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f  RE_ORDERBY_MIN ?
239d0 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1:0;.           
239e0 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70   pMinMax->a[0].p
239f0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f  Expr->op = TK_CO
23a00 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
23a10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20  }.        }.  . 
23a20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
23a30 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20  ase runs if the 
23a40 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f  aggregate has no
23a50 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
23a60 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
23a70 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  * processing is 
23a80 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e  much simpler sin
23a90 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  ce there is only
23aa0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20   a single row.  
23ab0 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70        ** of outp
23ac0 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ut..        */. 
23ad0 20 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75         resetAccu
23ae0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
23af0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
23b00 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
23b10 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
23b20 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
23b30 20 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61   pWhere, &pMinMa
23b40 78 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20 20 20  x, flag);.      
23b50 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
23b60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
23b70 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
23b80 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
23b90 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
23ba0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
23bb0 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74   }.        updat
23bc0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
23bd0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
23be0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4d  .        if( !pM
23bf0 69 6e 4d 61 78 20 26 26 20 66 6c 61 67 20 29 7b  inMax && flag ){
23c00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23c10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23c20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e  OP_Goto, 0, pWIn
23c30 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20 20 20  fo->iBreak);.   
23c40 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
23c50 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20  nt((v, "%s() by 
23c60 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20  index",.        
23c70 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57          (flag==W
23c80 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
23c90 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b  ?"min":"max")));
23ca0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23cb0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
23cc0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
23cd0 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
23ce0 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
23cf0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
23d00 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4f 72 64     }..      pOrd
23d10 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
23d20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
23d30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
23d40 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
23d50 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
23d60 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
23d70 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
23d80 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
23d90 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
23da0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
23db0 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  , 0, -1, .      
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23dd0 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20  pDest, addrEnd, 
23de0 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
23df0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
23e00 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b  elete(db, pDel);
23e10 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
23e20 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
23e30 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  el(v, addrEnd);.
23e40 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69      .  } /* endi
23e50 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  f aggregate quer
23e60 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  y */..  /* If th
23e70 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
23e80 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
23e90 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
23ea0 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
23eb0 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
23ec0 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
23ed0 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
23ee0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
23ef0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  {.    generateSo
23f00 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
23f10 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  , v, pEList->nEx
23f20 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a  pr, pDest);.  }.
23f30 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
23f40 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65  to skip this que
23f50 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
23f60 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
23f70 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f  l(v, iEnd);..  /
23f80 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73  * The SELECT was
23f90 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
23fa0 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72  ded.   Set the r
23fb0 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a  eturn code to 0.
23fc0 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
23fd0 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f   no errors..  */
23fe0 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  .  rc = 0;..  /*
23ff0 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74   Control jumps t
24000 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72  o here if an err
24010 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
24020 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e  d above, or upon
24030 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
24040 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53   coding of the S
24050 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65  ELECT..  */.sele
24060 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64  ct_end:..  /* Id
24070 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
24080 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f  mes if results o
24090 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  f the SELECT are
240a0 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20   to be output.. 
240b0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
240c0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
240d0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
240e0 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
240f0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
24100 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
24110 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
24120 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24130 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
24140 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
24150 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
24160 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e  aFunc);.  return
24170 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69   rc;.}..#if defi
24180 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
24190 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  )./*.***********
241a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
241b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
241c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
241d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
241e0 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ****.** The foll
241f0 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20 75 73  owing code is us
24200 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
24210 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
24220 79 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20  y.  The code.** 
24230 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65  that follows doe
24240 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20  s not appear in 
24250 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a  normal builds..*
24260 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
24270 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
24280 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20 63 6f  print out the co
24290 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20  ntent of all or 
242a0 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61  part of a .** pa
242b0 72 73 65 20 73 74 72 75 63 74 75 72 65 73 20 73  rse structures s
242c0 75 63 68 20 61 73 20 53 65 6c 65 63 74 20 6f 72  uch as Select or
242d0 20 45 78 70 72 2e 20 20 53 75 63 68 20 70 72 69   Expr.  Such pri
242e0 6e 74 6f 75 74 73 20 61 72 65 20 75 73 65 66 75  ntouts are usefu
242f0 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67  l.** for helping
24300 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 77   to understand w
24310 68 61 74 20 69 73 20 68 61 70 70 65 6e 69 6e 67  hat is happening
24320 20 69 6e 73 69 64 65 20 74 68 65 20 63 6f 64 65   inside the code
24330 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75   generator.** du
24340 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 69  ring the executi
24350 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45  on of complex SE
24360 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
24370 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
24380 74 69 6e 65 20 61 72 65 20 6e 6f 74 20 63 61 6c  tine are not cal
24390 6c 65 64 20 61 6e 79 77 68 65 72 65 20 66 72 6f  led anywhere fro
243a0 6d 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 72  m within the nor
243b0 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65  mal.** code base
243c0 2e 20 20 54 68 65 6e 20 61 72 65 20 69 6e 74 65  .  Then are inte
243d0 6e 64 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  nded to be calle
243e0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  d from within th
243f0 65 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72  e debugger.** or
24400 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20   from temporary 
24410 22 70 72 69 6e 74 66 22 20 73 74 61 74 65 6d 65  "printf" stateme
24420 6e 74 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72  nts inserted for
24430 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76   debugging..*/.v
24440 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
24450 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20  Expr(Expr *p){. 
24460 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20   if( p->token.z 
24470 26 26 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20  && p->token.n>0 
24480 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
24490 62 75 67 50 72 69 6e 74 66 28 22 28 25 2e 2a 73  bugPrintf("(%.*s
244a0 22 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70  ", p->token.n, p
244b0 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65  ->token.z);.  }e
244c0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
244d0 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25 64  DebugPrintf("(%d
244e0 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20  ", p->op);.  }. 
244f0 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b   if( p->pLeft ){
24500 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
24510 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20  gPrintf(" ");.  
24520 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
24530 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pr(p->pLeft);.  
24540 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68  }.  if( p->pRigh
24550 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
24560 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29  DebugPrintf(" ")
24570 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
24580 6e 74 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  ntExpr(p->pRight
24590 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
245a0 44 65 62 75 67 50 72 69 6e 74 66 28 22 29 22 29  DebugPrintf(")")
245b0 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
245c0 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 45 78  PrintExprList(Ex
245d0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
245e0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
245f0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
24600 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  pr; i++){.    sq
24610 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
24620 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
24630 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 4c 69  );.    if( i<pLi
24640 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20  st->nExpr-1 ){. 
24650 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24660 67 50 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20  gPrintf(", ");. 
24670 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20     }.  }.}.void 
24680 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65  sqlite3PrintSele
24690 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  ct(Select *p, in
246a0 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c  t indent){.  sql
246b0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
246c0 22 25 2a 73 53 45 4c 45 43 54 28 25 70 29 20 22  "%*sSELECT(%p) "
246d0 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29  , indent, "", p)
246e0 3b 0a 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74  ;.  sqlite3Print
246f0 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
24700 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  st);.  sqlite3De
24710 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
24720 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29  .  if( p->pSrc )
24730 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65  {.    char *zPre
24740 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  fix;.    int i;.
24750 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 46      zPrefix = "F
24760 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ROM";.    for(i=
24770 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  0; i<p->pSrc->nS
24780 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
24790 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
247a0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
247b0 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  >pSrc->a[i];.   
247c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
247d0 72 69 6e 74 66 28 22 25 2a 73 20 22 2c 20 69 6e  rintf("%*s ", in
247e0 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78 29  dent+6, zPrefix)
247f0 3b 0a 20 20 20 20 20 20 7a 50 72 65 66 69 78 20  ;.      zPrefix 
24800 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20  = "";.      if( 
24810 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
24820 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24830 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 5c  3DebugPrintf("(\
24840 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n");.        sql
24850 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28  ite3PrintSelect(
24860 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
24870 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20  indent+10);.    
24880 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24890 50 72 69 6e 74 66 28 22 25 2a 73 29 22 2c 20 69  Printf("%*s)", i
248a0 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20  ndent+8, "");.  
248b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49      }else if( pI
248c0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  tem->zName ){.  
248d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
248e0 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20 70  ugPrintf("%s", p
248f0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
24900 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
24910 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20  pItem->pTab ){. 
24920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
24930 62 75 67 50 72 69 6e 74 66 28 22 28 74 61 62 6c  bugPrintf("(tabl
24940 65 3a 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e  e: %s)", pItem->
24950 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
24960 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
24970 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
24980 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24990 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 41 53  DebugPrintf(" AS
249a0 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c   %s", pItem->zAl
249b0 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ias);.      }.  
249c0 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70 53 72      if( i<p->pSr
249d0 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20  c->nSrc-1 ){.   
249e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
249f0 67 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20  gPrintf(",");.  
24a00 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
24a10 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24a20 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  \n");.    }.  }.
24a30 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
24a40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
24a50 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 57  bugPrintf("%*s W
24a60 48 45 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20  HERE ", indent, 
24a70 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "");.    sqlite3
24a80 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 57 68  PrintExpr(p->pWh
24a90 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
24aa0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
24ab0 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ");.  }.  if( p-
24ac0 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
24ad0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24ae0 6e 74 66 28 22 25 2a 73 20 47 52 4f 55 50 20 42  ntf("%*s GROUP B
24af0 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  Y ", indent, "")
24b00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
24b10 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47  ntExprList(p->pG
24b20 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c  roupBy);.    sql
24b30 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24b40 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  "\n");.  }.  if(
24b50 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20   p->pHaving ){. 
24b60 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24b70 72 69 6e 74 66 28 22 25 2a 73 20 48 41 56 49 4e  rintf("%*s HAVIN
24b80 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  G ", indent, "")
24b90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
24ba0 6e 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  ntExpr(p->pHavin
24bb0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
24bc0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
24bd0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
24be0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
24bf0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24c00 66 28 22 25 2a 73 20 4f 52 44 45 52 20 42 59 20  f("%*s ORDER BY 
24c10 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
24c20 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
24c30 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
24c40 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  erBy);.    sqlit
24c50 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
24c60 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e  n");.  }.}./* En
24c70 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  d of the structu
24c80 72 65 20 64 65 62 75 67 20 70 72 69 6e 74 69 6e  re debug printin
24c90 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g code.*********
24ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ce0 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ****/.#endif /* 
24cf0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
24d00 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
24d10 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 2a 2f  SQLITE_DEBUG) */
24d20 0a                                               .