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

Artifact 6c2a5675c21bef11d8160f3dc97e1adfbf26bbb9:


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 34 39 35  select.c,v 1.495
0200: 20 32 30 30 38 2f 31 32 2f 32 33 20 32 33 3a 35   2008/12/23 23:5
0210: 36 3a 32 32 20 64 72 68 20 45 78 70 20 24 0a 2a  6:22 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0250: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0260: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 62 75  ect structure bu
0270: 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c 6f 63  t do not dealloc
0280: 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63  ate.** the selec
0290: 74 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  t structure itse
02a0: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lf..*/.static vo
02b0: 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74 28 73  id clearSelect(s
02c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
02d0: 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  ct *p){.  sqlite
02e0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
02f0: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
0300: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
0310: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
0320: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  rc);.  sqlite3Ex
0330: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
0340: 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  pWhere);.  sqlit
0350: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0360: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
0370: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
0380: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0390: 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  aving);.  sqlite
03a0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
03b0: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
03c0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
03d0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
03e0: 50 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65  Prior);.  sqlite
03f0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
0400: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71  p->pLimit);.  sq
0410: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0420: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
0440: 6c 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73  lize a SelectDes
0450: 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  t structure..*/.
0460: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
0470: 63 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63  ctDestInit(Selec
0480: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e  tDest *pDest, in
0490: 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61  t eDest, int iPa
04a0: 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44  rm){.  pDest->eD
04b0: 65 73 74 20 3d 20 28 75 38 29 65 44 65 73 74 3b  est = (u8)eDest;
04c0: 0a 20 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  .  pDest->iParm 
04d0: 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74  = iParm;.  pDest
04e0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 30 3b 0a  ->affinity = 0;.
04f0: 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20    pDest->iMem = 
0500: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  0;.  pDest->nMem
0510: 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 0;.}.../*.** 
0520: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53  Allocate a new S
0530: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0540: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
0550: 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20  nter to that.** 
0560: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65  structure..*/.Se
0570: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
0580: 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65 20  ectNew(.  Parse 
0590: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
05a0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
05b0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
05c0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a   *pEList,     /*
05d0: 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 74   which columns t
05e0: 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65  o include in the
05f0: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72 63   result */.  Src
0600: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
0610: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
0620: 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20 74  lause -- which t
0630: 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f  ables to scan */
0640: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
0660: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
0670: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
0680: 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 47  upBy,   /* the G
0690: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
06a0: 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
06b0: 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  g,        /* the
06c0: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 2a   HAVING clause *
06d0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
06e0: 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68 65  rderBy,   /* the
06f0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
0700: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74   */.  int isDist
0710: 69 6e 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 74  inct,       /* t
0720: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
0730: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
0740: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  resent */.  Expr
0750: 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20   *pLimit,       
0760: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0770: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f  .  NULL means no
0780: 74 20 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72  t used */.  Expr
0790: 20 2a 70 4f 66 66 73 65 74 20 20 20 20 20 20 20   *pOffset       
07a0: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
07b0: 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e  e.  NULL means n
07c0: 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  o offset */.){. 
07d0: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
07e0: 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b   Select standin;
07f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0800: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
0810: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
0820: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
0830: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
0840: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
0850: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 21 70 4f  locFailed || !pO
0860: 66 66 73 65 74 20 7c 7c 20 70 4c 69 6d 69 74 20  ffset || pLimit 
0870: 29 3b 20 2f 2a 20 4f 46 46 53 45 54 20 69 6d 70  ); /* OFFSET imp
0880: 6c 69 65 73 20 4c 49 4d 49 54 20 2a 2f 0a 20 20  lies LIMIT */.  
0890: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
08a0: 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64     pNew = &stand
08b0: 69 6e 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  in;.    memset(p
08c0: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  New, 0, sizeof(*
08d0: 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20 69 66  pNew));.  }.  if
08e0: 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  ( pEList==0 ){. 
08f0: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
0900: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
0910: 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c  d(pParse, 0, sql
0920: 69 74 65 33 45 78 70 72 28 64 62 2c 54 4b 5f 41  ite3Expr(db,TK_A
0930: 4c 4c 2c 30 2c 30 2c 30 29 2c 20 30 29 3b 0a 20  LL,0,0,0), 0);. 
0940: 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73   }.  pNew->pELis
0950: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e  t = pEList;.  pN
0960: 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b  ew->pSrc = pSrc;
0970: 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20  .  pNew->pWhere 
0980: 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77  = pWhere;.  pNew
0990: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  ->pGroupBy = pGr
09a0: 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70  oupBy;.  pNew->p
09b0: 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67  Having = pHaving
09c0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
09d0: 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
09e0: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
09f0: 3d 20 69 73 44 69 73 74 69 6e 63 74 20 3f 20 53  = isDistinct ? S
0a00: 46 5f 44 69 73 74 69 6e 63 74 20 3a 20 30 3b 0a  F_Distinct : 0;.
0a10: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f    pNew->op = TK_
0a20: 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e  SELECT;.  pNew->
0a30: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
0a40: 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
0a50: 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 70 4e   = pOffset;.  pN
0a60: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a70: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
0a80: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
0a90: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
0aa0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
0ab0: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e  = -1;.  if( db->
0ac0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b  mallocFailed ) {
0ad0: 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74  .    clearSelect
0ae0: 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (db, pNew);.    
0af0: 69 66 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64  if( pNew!=&stand
0b00: 69 6e 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  in ) sqlite3DbFr
0b10: 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ee(db, pNew);.  
0b20: 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 0a    pNew = 0;.  }.
0b30: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
0b40: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
0b50: 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20  he given Select 
0b60: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
0b70: 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75  l of its substru
0b80: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
0b90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
0ba0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
0bb0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
0bc0: 66 28 20 70 20 29 7b 0a 20 20 20 20 63 6c 65 61  f( p ){.    clea
0bd0: 72 53 65 6c 65 63 74 28 64 62 2c 20 70 29 3b 0a  rSelect(db, p);.
0be0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
0bf0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  e(db, p);.  }.}.
0c00: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74  ./*.** Given 1 t
0c10: 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20  o 3 identifiers 
0c20: 70 72 65 63 65 65 64 69 6e 67 20 74 68 65 20 4a  preceeding the J
0c30: 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74  OIN keyword, det
0c40: 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79  ermine the.** ty
0c50: 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74  pe of join.  Ret
0c60: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63  urn an integer c
0c70: 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70  onstant that exp
0c80: 72 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65  resses that type
0c90: 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  .** in terms of 
0ca0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69  the following bi
0cb0: 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20  t values:.**.** 
0cc0: 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20      JT_INNER.** 
0cd0: 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20      JT_CROSS.** 
0ce0: 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20      JT_OUTER.** 
0cf0: 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a      JT_NATURAL.*
0d00: 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a  *     JT_LEFT.**
0d10: 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a       JT_RIGHT.**
0d20: 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72  .** A full outer
0d30: 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d   join is the com
0d40: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c  bination of JT_L
0d50: 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54  EFT and JT_RIGHT
0d60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c  ..**.** If an il
0d70: 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f  legal or unsuppo
0d80: 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69  rted join type i
0d90: 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69  s seen, then sti
0da0: 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a  ll return.** a j
0db0: 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75  oin type, but pu
0dc0: 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68  t an error in th
0dd0: 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
0de0: 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
0df0: 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65  e3JoinType(Parse
0e00: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
0e10: 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20  *pA, Token *pB, 
0e20: 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e  Token *pC){.  in
0e30: 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  t jointype = 0;.
0e40: 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33    Token *apAll[3
0e50: 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20  ];.  Token *p;. 
0e60: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
0e70: 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ruct {.    const
0e80: 20 63 68 61 72 20 7a 4b 65 79 77 6f 72 64 5b 38   char zKeyword[8
0e90: 5d 3b 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b  ];.    u8 nChar;
0ea0: 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 0a 20 20  .    u8 code;.  
0eb0: 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b  } keywords[] = {
0ec0: 0a 20 20 20 20 7b 20 22 6e 61 74 75 72 61 6c 22  .    { "natural"
0ed0: 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20  , 7, JT_NATURAL 
0ee0: 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66 74 22 2c  },.    { "left",
0ef0: 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a      4, JT_LEFT|J
0f00: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0f10: 20 22 72 69 67 68 74 22 2c 20 20 20 35 2c 20 4a   "right",   5, J
0f20: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
0f30: 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22   },.    { "full"
0f40: 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c  ,    4, JT_LEFT|
0f50: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
0f60: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65  R },.    { "oute
0f70: 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45  r",   5, JT_OUTE
0f80: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65  R },.    { "inne
0f90: 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45  r",   5, JT_INNE
0fa0: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73  R },.    { "cros
0fb0: 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45  s",   5, JT_INNE
0fc0: 52 7c 4a 54 5f 43 52 4f 53 53 20 7d 2c 0a 20 20  R|JT_CROSS },.  
0fd0: 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  };.  int i, j;. 
0fe0: 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a   apAll[0] = pA;.
0ff0: 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b    apAll[1] = pB;
1000: 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43  .  apAll[2] = pC
1010: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33  ;.  for(i=0; i<3
1020: 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b   && apAll[i]; i+
1030: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c  +){.    p = apAl
1040: 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  l[i];.    for(j=
1050: 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 6b  0; j<ArraySize(k
1060: 65 79 77 6f 72 64 73 29 3b 20 6a 2b 2b 29 7b 0a  eywords); j++){.
1070: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d        if( p->n==
1080: 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61  keywords[j].nCha
1090: 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  r .          && 
10a0: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
10b0: 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 6b 65 79  (char*)p->z, key
10c0: 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72  words[j].zKeywor
10d0: 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20  d, p->n)==0 ){. 
10e0: 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20         jointype 
10f0: 7c 3d 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63  |= keywords[j].c
1100: 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ode;.        bre
1110: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1120: 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72  }.    if( j>=Arr
1130: 61 79 53 69 7a 65 28 6b 65 79 77 6f 72 64 73 29  aySize(keywords)
1140: 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   ){.      jointy
1150: 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a  pe |= JT_ERROR;.
1160: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1170: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20   }.  }.  if(.   
1180: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a    (jointype & (J
1190: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
11a0: 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  ))==(JT_INNER|JT
11b0: 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20  _OUTER) ||.     
11c0: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45  (jointype & JT_E
11d0: 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RROR)!=0.  ){.  
11e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
11f0: 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73  p = " ";.    ass
1200: 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20  ert( pB!=0 );.  
1210: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
1220: 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69  Sp++; }.    sqli
1230: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1240: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20  se, "unknown or 
1250: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1260: 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20   type: ".       
1270: 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c  "%T %T%s%T", pA,
1280: 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20   pB, zSp, pC);. 
1290: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
12a0: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20  _INNER;.  }else 
12b0: 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a  if( jointype & J
12c0: 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20 73  T_RIGHT ){.    s
12d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12e0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52  Parse, .      "R
12f0: 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55  IGHT and FULL OU
1300: 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f  TER JOINs are no
1310: 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70  t currently supp
1320: 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69  orted");.    joi
1330: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
1340: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
1350: 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ointype;.}../*.*
1360: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
1370: 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69  ex of a column i
1380: 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75  n a table.  Retu
1390: 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c  rn -1 if the col
13a0: 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  umn.** is not co
13b0: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74  ntained in the t
13c0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
13d0: 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  int columnIndex(
13e0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e  Table *pTab, con
13f0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a  st char *zCol){.
1400: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1410: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
1420: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1430: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1440: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
1450: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72  me, zCol)==0 ) r
1460: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
1470: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
1480: 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
1490: 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f 20 61   of a token to a
14a0: 20 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e 61 74   '\000'-terminat
14b0: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  ed string..*/.st
14c0: 61 74 69 63 20 76 6f 69 64 20 73 65 74 54 6f 6b  atic void setTok
14d0: 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e  en(Token *p, con
14e0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 70  st char *z){.  p
14f0: 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a 20 20  ->z = (u8*)z;.  
1500: 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73 71 6c 69 74  p->n = z ? sqlit
1510: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 3a 20  e3Strlen30(z) : 
1520: 30 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b  0;.  p->dyn = 0;
1530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1540: 65 20 74 6f 6b 65 6e 20 74 6f 20 74 68 65 20 64  e token to the d
1550: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 61 6e 64  ouble-quoted and
1560: 20 65 73 63 61 70 65 64 20 76 65 72 73 69 6f 6e   escaped version
1570: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 70   of the string p
1580: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
1590: 7a 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3b 0a  z. For example;.
15a0: 2a 2a 0a 2a 2a 20 20 20 20 7b 61 22 62 63 7d 20  **.**    {a"bc} 
15b0: 20 2d 3e 20 20 7b 22 61 22 22 62 63 22 7d 0a 2a   ->  {"a""bc"}.*
15c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
15d0: 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 50 61 72  tQuotedToken(Par
15e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
15f0: 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  n *p, const char
1600: 20 2a 7a 29 7b 0a 0a 20 20 2f 2a 20 43 68 65 63   *z){..  /* Chec
1610: 6b 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 20  k if the string 
1620: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 71 75  appears to be qu
1630: 6f 74 65 64 20 75 73 69 6e 67 20 22 2e 2e 2e 22  oted using "..."
1640: 20 6f 72 20 60 2e 2e 2e 60 0a 20 20 2a 2a 20 6f   or `...`.  ** o
1650: 72 20 5b 2e 2e 2e 5d 20 6f 72 20 27 2e 2e 2e 27  r [...] or '...'
1660: 20 6f 72 20 69 66 20 74 68 65 20 73 74 72 69 6e   or if the strin
1670: 67 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 22  g contains any "
1680: 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 0a 20   characters.  . 
1690: 20 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 2c 20   ** If it does, 
16a0: 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 76 65  then record a ve
16b0: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 72  rsion of the str
16c0: 69 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65  ing with the spe
16d0: 63 69 61 6c 0a 20 20 2a 2a 20 63 68 61 72 61 63  cial.  ** charac
16e0: 74 65 72 73 20 65 73 63 61 70 65 64 2e 0a 20 20  ters escaped..  
16f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1700: 2a 7a 32 20 3d 20 7a 3b 0a 20 20 69 66 28 20 2a  *z2 = z;.  if( *
1710: 7a 32 21 3d 27 5b 27 20 26 26 20 2a 7a 32 21 3d  z2!='[' && *z2!=
1720: 27 60 27 20 26 26 20 2a 7a 32 21 3d 27 5c 27 27  '`' && *z2!='\''
1730: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a   ){.    while( *
1740: 7a 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  z2 ){.      if( 
1750: 2a 7a 32 3d 3d 27 22 27 20 29 20 62 72 65 61 6b  *z2=='"' ) break
1760: 3b 0a 20 20 20 20 20 20 7a 32 2b 2b 3b 0a 20 20  ;.      z2++;.  
1770: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 2a    }.  }..  if( *
1780: 7a 32 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 72  z2 ){.    /* Str
1790: 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 22 20 63  ing contains " c
17a0: 68 61 72 61 63 74 65 72 73 20 2d 20 63 6f 70 79  haracters - copy
17b0: 20 61 6e 64 20 71 75 6f 74 65 20 74 68 65 20 73   and quote the s
17c0: 74 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 70 2d  tring. */.    p-
17d0: 3e 7a 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  >z = (u8 *)sqlit
17e0: 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
17f0: 2d 3e 64 62 2c 20 22 5c 22 25 77 5c 22 22 2c 20  ->db, "\"%w\"", 
1800: 7a 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a  z);.    if( p->z
1810: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 20 3d   ){.      p->n =
1820: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1830: 28 28 63 68 61 72 20 2a 29 70 2d 3e 7a 29 3b 0a  ((char *)p->z);.
1840: 20 20 20 20 20 20 70 2d 3e 64 79 6e 20 3d 20 31        p->dyn = 1
1850: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1860: 0a 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 63  .    /* String c
1870: 6f 6e 74 61 69 6e 73 20 6e 6f 20 22 20 63 68 61  ontains no " cha
1880: 72 61 63 74 65 72 73 20 2d 20 63 6f 70 79 20 74  racters - copy t
1890: 68 65 20 70 6f 69 6e 74 65 72 2e 20 2a 2f 0a 20  he pointer. */. 
18a0: 20 20 20 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a     p->z = (u8*)z
18b0: 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d 20 28 69 6e  ;.    p->n = (in
18c0: 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 20 20 20 20  t)(z2 - z);.    
18d0: 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 20 20 7d 0a  p->dyn = 0;.  }.
18e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
18f0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  an expression no
1900: 64 65 20 66 6f 72 20 61 6e 20 69 64 65 6e 74 69  de for an identi
1910: 66 69 65 72 20 77 69 74 68 20 74 68 65 20 6e 61  fier with the na
1920: 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a 45  me of zName.*/.E
1930: 78 70 72 20 2a 73 71 6c 69 74 65 33 43 72 65 61  xpr *sqlite3Crea
1940: 74 65 49 64 45 78 70 72 28 50 61 72 73 65 20 2a  teIdExpr(Parse *
1950: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
1960: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 6f  ar *zName){.  To
1970: 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65 74  ken dummy;.  set
1980: 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 4e  Token(&dummy, zN
1990: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  ame);.  return s
19a0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
19b0: 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  se, TK_ID, 0, 0,
19c0: 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 2f 2a 0a   &dummy);.}../*.
19d0: 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74 6f  ** Add a term to
19e0: 20 74 68 65 20 57 48 45 52 45 20 65 78 70 72 65   the WHERE expre
19f0: 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72  ssion in *ppExpr
1a00: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
1a10: 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d  he.** zCol colum
1a20: 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69 6e  n to be equal in
1a30: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
1a40: 70 54 61 62 31 20 61 6e 64 20 70 54 61 62 32 2e  pTab1 and pTab2.
1a50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a60: 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20  addWhereTerm(.  
1a70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1a90: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1aa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1ab0: 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  l,        /* Nam
1ac0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
1ad0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65  */.  const Table
1ae0: 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f 2a   *pTab1,      /*
1af0: 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a   First table */.
1b00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
1b10: 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a 20 41 6c  lias1,     /* Al
1b20: 69 61 73 20 66 6f 72 20 66 69 72 73 74 20 74 61  ias for first ta
1b30: 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  ble.  May be NUL
1b40: 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62  L */.  const Tab
1b50: 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20 20  le *pTab2,      
1b60: 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65 20  /* Second table 
1b70: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1b80: 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20 20 2f 2a  *zAlias2,     /*
1b90: 20 41 6c 69 61 73 20 66 6f 72 20 73 65 63 6f 6e   Alias for secon
1ba0: 64 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62 65  d table.  May be
1bb0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69   NULL */.  int i
1bc0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 2c 20  RightJoinTable, 
1bd0: 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
1be0: 6f 72 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  or for the right
1bf0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
1c00: 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20 20   **ppExpr,      
1c10: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
1c20: 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74 6f  equality term to
1c30: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
1c40: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65   */.  int isOute
1c50: 72 4a 6f 69 6e 20 20 20 20 20 20 20 20 20 20 2f  rJoin          /
1c60: 2a 20 54 72 75 65 20 69 66 20 64 65 61 6c 69 6e  * True if dealin
1c70: 67 20 77 69 74 68 20 61 6e 20 4f 55 54 45 52 20  g with an OUTER 
1c80: 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  join */.){.  Exp
1c90: 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20  r *pE1a, *pE1b, 
1ca0: 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70  *pE1c;.  Expr *p
1cb0: 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32  E2a, *pE2b, *pE2
1cc0: 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a  c;.  Expr *pE;..
1cd0: 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65 33    pE1a = sqlite3
1ce0: 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61  CreateIdExpr(pPa
1cf0: 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70 45  rse, zCol);.  pE
1d00: 32 61 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  2a = sqlite3Crea
1d10: 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65 2c  teIdExpr(pParse,
1d20: 20 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 41   zCol);.  if( zA
1d30: 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20 20 20  lias1==0 ){.    
1d40: 7a 41 6c 69 61 73 31 20 3d 20 70 54 61 62 31 2d  zAlias1 = pTab1-
1d50: 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45  >zName;.  }.  pE
1d60: 31 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  1b = sqlite3Crea
1d70: 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65 2c  teIdExpr(pParse,
1d80: 20 7a 41 6c 69 61 73 31 29 3b 0a 20 20 69 66 28   zAlias1);.  if(
1d90: 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29 7b 0a 20   zAlias2==0 ){. 
1da0: 20 20 20 7a 41 6c 69 61 73 32 20 3d 20 70 54 61     zAlias2 = pTa
1db0: 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  b2->zName;.  }. 
1dc0: 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65 33 43   pE2b = sqlite3C
1dd0: 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72  reateIdExpr(pPar
1de0: 73 65 2c 20 7a 41 6c 69 61 73 32 29 3b 0a 20 20  se, zAlias2);.  
1df0: 70 45 31 63 20 3d 20 73 71 6c 69 74 65 33 50 45  pE1c = sqlite3PE
1e00: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
1e10: 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61 2c 20  OT, pE1b, pE1a, 
1e20: 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73 71 6c  0);.  pE2c = sql
1e30: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1e40: 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20  , TK_DOT, pE2b, 
1e50: 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d  pE2a, 0);.  pE =
1e60: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
1e70: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
1e80: 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20 69  c, pE2c, 0);.  i
1e90: 66 28 20 70 45 20 26 26 20 69 73 4f 75 74 65 72  f( pE && isOuter
1ea0: 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72  Join ){.    Expr
1eb0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 2c 20  SetProperty(pE, 
1ec0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
1ed0: 20 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69 6e    pE->iRightJoin
1ee0: 54 61 62 6c 65 20 3d 20 69 52 69 67 68 74 4a 6f  Table = iRightJo
1ef0: 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a  inTable;.  }.  *
1f00: 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ppExpr = sqlite3
1f10: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
1f20: 64 62 2c 2a 70 70 45 78 70 72 2c 20 70 45 29 3b  db,*ppExpr, pE);
1f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1f40: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
1f50: 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65  operty on all te
1f60: 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e  rms of the given
1f70: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
1f80: 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72  And set the Expr
1f90: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
1fa0: 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65   to iTable for e
1fb0: 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
1fc0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  .** expression..
1fd0: 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f  **.** The EP_Fro
1fe0: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69  mJoin property i
1ff0: 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20  s used on terms 
2000: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
2010: 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20   to tell.** the 
2020: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
2030: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
2040: 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20   that this term 
2050: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a  is part of the.*
2060: 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69  * join restricti
2070: 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  on specified in 
2080: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2090: 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61  clause and not a
20a0: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
20b0: 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45  more general WHE
20c0: 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73  RE clause.  Thes
20d0: 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65  e terms are move
20e0: 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a  d over to the.**
20f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75   WHERE clause du
2100: 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73  ring join proces
2110: 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64  sing but we need
2120: 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
2130: 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e  t they.** origin
2140: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
2150: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  r USING clause..
2160: 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69  **.** The Expr.i
2170: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
2180: 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63  ells the WHERE c
2190: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
21a0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70   that the.** exp
21b0: 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20  ression depends 
21c0: 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a  on table iRightJ
21d0: 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66  oinTable even if
21e0: 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e   that table is n
21f0: 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79  ot.** explicitly
2200: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
2210: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  e expression.  T
2220: 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  hat information 
2230: 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72  is needed.** for
2240: 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73   cases like this
2250: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
2260: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
2270: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
2280: 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35  =t2.b AND t1.x=5
2290: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65  .**.** The where
22a0: 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f   clause needs to
22b0: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
22c0: 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d  ing of the t1.x=
22d0: 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20  5.** term until 
22e0: 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f  after the t2 loo
22f0: 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  p of the join.  
2300: 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a  In that way, a.*
2310: 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69  * NULL t2 row wi
2320: 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77  ll be inserted w
2330: 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e  henever t1.x!=5.
2340: 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a    If we do not.*
2350: 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  * defer the hand
2360: 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20  ling of t1.x=5, 
2370: 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65  it will be proce
2380: 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ssed immediately
2390: 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31  .** after the t1
23a0: 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77   loop and rows w
23b0: 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c  ith t1.x!=5 will
23c0: 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e   never appear in
23d0: 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20  .** the output, 
23e0: 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65  which is incorre
23f0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
2400: 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45  id setJoinExpr(E
2410: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  xpr *p, int iTab
2420: 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  le){.  while( p 
2430: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
2440: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
2450: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d 3e 69  mJoin);.    p->i
2460: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
2470: 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65 74   iTable;.    set
2480: 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66  JoinExpr(p->pLef
2490: 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  t, iTable);.    
24a0: 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20  p = p->pRight;. 
24b0: 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   } .}../*.** Thi
24c0: 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73  s routine proces
24d0: 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66  ses the join inf
24e0: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53  ormation for a S
24f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2500: 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  .** ON and USING
2510: 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e   clauses are con
2520: 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72  verted into extr
2530: 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  a terms of the W
2540: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  HERE clause..** 
2550: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c  NATURAL joins al
2560: 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20  so create extra 
2570: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2580: 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  ms..**.** The te
2590: 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c  rms of a FROM cl
25a0: 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e  ause are contain
25b0: 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74  ed in the Select
25c0: 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e  .pSrc structure.
25d0: 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73  .** The left mos
25e0: 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66  t table is the f
25f0: 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65  irst entry in Se
2600: 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20  lect.pSrc.  The 
2610: 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61  right-most.** ta
2620: 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20  ble is the last 
2630: 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e  entry.  The join
2640: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c   operator is hel
2650: 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  d in the entry t
2660: 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20  o.** the left.  
2670: 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e  Thus entry 0 con
2680: 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f  tains the join o
2690: 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20  perator for the 
26a0: 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20  join between.** 
26b0: 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e  entries 0 and 1.
26c0: 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e    Any ON or USIN
26d0: 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69  G clauses associ
26e0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f  ated with the jo
26f0: 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61  in are.** also a
2700: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c  ttached to the l
2710: 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a  eft entry..**.**
2720: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
2730: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
2740: 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75   of errors encou
2750: 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ntered..*/.stati
2760: 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63  c int sqliteProc
2770: 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70  essJoin(Parse *p
2780: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
2790: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
27a0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
27b0: 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c       /* All tabl
27c0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
27d0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
27e0: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
27f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2800: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
2810: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2820: 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20  item *pLeft;    
2830: 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62   /* Left table b
2840: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20  eing joined */. 
2850: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2860: 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20  item *pRight;   
2870: 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20   /* Right table 
2880: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
2890: 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
28a0: 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53  c;.  pLeft = &pS
28b0: 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67  rc->a[0];.  pRig
28c0: 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a  ht = &pLeft[1];.
28d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
28e0: 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20  c->nSrc-1; i++, 
28f0: 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b  pRight++, pLeft+
2900: 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
2910: 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d  LeftTab = pLeft-
2920: 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65  >pTab;.    Table
2930: 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52   *pRightTab = pR
2940: 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20  ight->pTab;.    
2950: 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20  int isOuter;..  
2960: 20 20 69 66 28 20 70 4c 65 66 74 54 61 62 3d 3d    if( pLeftTab==
2970: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
2980: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2990: 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69    isOuter = (pRi
29a0: 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  ght->jointype & 
29b0: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20  JT_OUTER)!=0;.. 
29c0: 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e     /* When the N
29d0: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69  ATURAL keyword i
29e0: 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57  s present, add W
29f0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2a00: 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  s for.    ** eve
2a10: 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  ry column that t
2a20: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61  he two tables ha
2a30: 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20  ve in common..  
2a40: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
2a50: 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  ght->jointype & 
2a60: 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20  JT_NATURAL ){.  
2a70: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
2a80: 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70  pOn || pRight->p
2a90: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  Using ){.       
2aa0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2ab0: 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55  (pParse, "a NATU
2ac0: 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74  RAL join may not
2ad0: 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20   have ".        
2ae0: 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49     "an ON or USI
2af0: 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a  NG clause", 0);.
2b00: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
2b10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b20: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74  for(j=0; j<pLeft
2b30: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
2b40: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
2b50: 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54 61 62 2d  Name = pLeftTab-
2b60: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
2b70: 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75          if( colu
2b80: 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61  mnIndex(pRightTa
2b90: 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  b, zName)>=0 ){.
2ba0: 20 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65            addWhe
2bb0: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a  reTerm(pParse, z
2bc0: 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20  Name, pLeftTab, 
2bd0: 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a  pLeft->zAlias, .
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
2c00: 69 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d  ightTab, pRight-
2c10: 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20  >zAlias,.       
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c30: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69         pRight->i
2c40: 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65  Cursor, &p->pWhe
2c50: 72 65 2c 20 69 73 4f 75 74 65 72 29 3b 0a 20 20  re, isOuter);.  
2c60: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
2c70: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2c80: 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f  ..    /* Disallo
2c90: 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  w both ON and US
2ca0: 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74  ING clauses in t
2cb0: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20  he same join.   
2cc0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
2cd0: 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68  ht->pOn && pRigh
2ce0: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
2cf0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2d00: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
2d10: 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20  ot have both ON 
2d20: 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20  and USING ".    
2d30: 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20      "clauses in 
2d40: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b  the same join");
2d50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2d60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
2d70: 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  dd the ON clause
2d80: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
2d90: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
2da0: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
2db0: 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72    ** an AND oper
2dc0: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
2dd0: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e   if( pRight->pOn
2de0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
2df0: 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45  Outer ) setJoinE
2e00: 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c  xpr(pRight->pOn,
2e10: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
2e20: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65  );.      p->pWhe
2e30: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
2e40: 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
2e50: 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68  p->pWhere, pRigh
2e60: 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70  t->pOn);.      p
2e70: 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a  Right->pOn = 0;.
2e80: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
2e90: 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73  eate extra terms
2ea0: 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   on the WHERE cl
2eb0: 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f  ause for each co
2ec0: 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a  lumn named.    *
2ed0: 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  * in the USING c
2ee0: 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a  lause.  Example:
2ef0: 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c   If the two tabl
2f00: 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20  es to be joined 
2f10: 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e  are .    ** A an
2f20: 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e  d B and the USIN
2f30: 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58  G clause names X
2f40: 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e  , Y, and Z, then
2f50: 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a   add this.    **
2f60: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
2f70: 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58  ause:    A.X=B.X
2f80: 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44   AND A.Y=B.Y AND
2f90: 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20   A.Z=B.Z.    ** 
2fa0: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
2fb0: 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65  if any column me
2fc0: 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55  ntioned in the U
2fd0: 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20  SING clause is. 
2fe0: 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69     ** not contai
2ff0: 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ned in both tabl
3000: 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e  es to be joined.
3010: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3020: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
3030: 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a  {.      IdList *
3040: 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e  pList = pRight->
3050: 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f  pUsing;.      fo
3060: 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e  r(j=0; j<pList->
3070: 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nId; j++){.     
3080: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
3090: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
30a0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
30b0: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66  columnIndex(pLef
30c0: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c  tTab, zName)<0 |
30d0: 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  | columnIndex(pR
30e0: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c  ightTab, zName)<
30f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
3100: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3110: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a  Parse, "cannot j
3120: 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e  oin using column
3130: 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20   %s - column ". 
3140: 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20             "not 
3150: 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20  present in both 
3160: 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b  tables", zName);
3170: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
3180: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
3190: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
31a0: 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  erm(pParse, zNam
31b0: 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65  e, pLeftTab, pLe
31c0: 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20  ft->zAlias, .   
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e0: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54           pRightT
31f0: 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69  ab, pRight->zAli
3200: 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  as,.            
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3220: 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c  pRight->iCursor,
3230: 20 26 70 2d 3e 70 57 68 65 72 65 2c 20 69 73 4f   &p->pWhere, isO
3240: 75 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  uter);.      }. 
3250: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3260: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
3270: 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22  sert code into "
3280: 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  v" that will pus
3290: 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20  h the record on 
32a0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a  the top of the.*
32b0: 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65  * stack into the
32c0: 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   sorter..*/.stat
32d0: 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f  ic void pushOnto
32e0: 53 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20  Sorter(.  Parse 
32f0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
3300: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
3310: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
3320: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f   *pOrderBy,    /
3330: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
3340: 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63  lause */.  Selec
3350: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
3360: 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53    /* The whole S
3370: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
3380: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61  */.  int regData
3390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
33a0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
33b0: 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65  data to be sorte
33c0: 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  d */.){.  Vdbe *
33d0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
33e0: 65 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  e;.  int nExpr =
33f0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
3400: 3b 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 20  ;.  int regBase 
3410: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
3420: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45  Range(pParse, nE
3430: 78 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65  xpr+2);.  int re
3440: 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
3450: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
3460: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  se);.  sqlite3Ex
3470: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
3480: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
3490: 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20   regBase, 0);.  
34a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34b0: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
34c0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
34d0: 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45  rsor, regBase+nE
34e0: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  xpr);.  sqlite3E
34f0: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
3500: 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67  se, regData, reg
3510: 42 61 73 65 2b 6e 45 78 70 72 2b 31 2c 20 31 29  Base+nExpr+1, 1)
3520: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3530: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
3540: 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
3550: 20 6e 45 78 70 72 20 2b 20 32 2c 20 72 65 67 52   nExpr + 2, regR
3560: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
3570: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3580: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4f 72  P_IdxInsert, pOr
3590: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
35a0: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
35b0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
35c0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
35d0: 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
35e0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
35f0: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ge(pParse, regBa
3600: 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20  se, nExpr+2);.  
3610: 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69  if( pSelect->iLi
3620: 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  mit ){.    int a
3630: 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20  ddr1, addr2;.   
3640: 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20   int iLimit;.   
3650: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f   if( pSelect->iO
3660: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69  ffset ){.      i
3670: 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d  Limit = pSelect-
3680: 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20 20  >iOffset+1;.    
3690: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c 69  }else{.      iLi
36a0: 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69  mit = pSelect->i
36b0: 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  Limit;.    }.   
36c0: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
36d0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
36e0: 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29  _IfZero, iLimit)
36f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3700: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
3710: 64 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31  dImm, iLimit, -1
3720: 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  );.    addr2 = s
3730: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
3740: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
3750: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
3760: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
3770: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3780: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
3790: 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  t, pOrderBy->iEC
37a0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  ursor);.    sqli
37b0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
37c0: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72 64   OP_Delete, pOrd
37d0: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b  erBy->iECursor);
37e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
37f0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
3800: 32 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d  2);.    pSelect-
3810: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d  >iLimit = 0;.  }
3820: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f  .}../*.** Add co
3830: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
3840: 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74  the OFFSET.*/.st
3850: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66  atic void codeOf
3860: 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c  fset(.  Vdbe *v,
3870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
3880: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
3890: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c  this VM */.  Sel
38a0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f  ect *p,        /
38b0: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
38c0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
38d0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ed */.  int iCon
38e0: 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d  tinue     /* Jum
38f0: 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
3900: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
3910: 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  d */.){.  if( p-
3920: 3e 69 4f 66 66 73 65 74 20 26 26 20 69 43 6f 6e  >iOffset && iCon
3930: 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20  tinue!=0 ){.    
3940: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71  int addr;.    sq
3950: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3960: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d  v, OP_AddImm, p-
3970: 3e 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20  >iOffset, -1);. 
3980: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
3990: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
39a0: 50 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66  P_IfNeg, p->iOff
39b0: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
39c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
39d0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74  P_Goto, 0, iCont
39e0: 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43  inue);.    VdbeC
39f0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70  omment((v, "skip
3a00: 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22   OFFSET records"
3a10: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
3a20: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
3a30: 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ddr);.  }.}../*.
3a40: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
3a50: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
3a60: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72  ake sure the N r
3a70: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
3a80: 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72  g at iMem.** for
3a90: 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74  m a distinct ent
3aa0: 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ry.  iTab is a s
3ab0: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
3ac0: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
3ad0: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
3ae0: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
3af0: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
3b00: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
3b10: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
3b20: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
3b30: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
3b40: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
3b50: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
3b60: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
3b70: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
3b80: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
3b90: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
3ba0: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
3bb0: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
3bc0: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
3bd0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3be0: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
3bf0: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
3c00: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
3c10: 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
3c20: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69        /* A sorti
3c30: 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  ng index used to
3c40: 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e   test for distin
3c50: 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ctness */.  int 
3c60: 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f  addrRepeat,    /
3c70: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
3c80: 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a  f not distinct *
3c90: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
3ca0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3cb0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
3cc0: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
3cd0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c       /* First el
3ce0: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
3cf0: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b  be *v;.  int r1;
3d00: 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
3d10: 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71  pVdbe;.  r1 = sq
3d20: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
3d30: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
3d40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
3d50: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69  OP_MakeRecord, i
3d60: 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73  Mem, N, r1);.  s
3d70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
3d80: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
3d90: 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20  ab, addrRepeat, 
3da0: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
3db0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
3dc0: 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20  dxInsert, iTab, 
3dd0: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  r1);.  sqlite3Re
3de0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
3df0: 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a  rse, r1);.}../*.
3e00: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65  ** Generate an e
3e10: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65  rror message whe
3e20: 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73  n a SELECT is us
3e30: 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65  ed within a sube
3e40: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78  xpression.** (ex
3e50: 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53  ample:  "a IN (S
3e60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
3e70: 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73  le)") but it has
3e80: 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73   more than 1 res
3e90: 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20  ult.** column.  
3ea0: 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20  We do this in a 
3eb0: 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75  subroutine becau
3ec0: 73 65 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  se the error occ
3ed0: 75 72 73 20 69 6e 20 6d 75 6c 74 69 70 6c 65 0a  urs in multiple.
3ee0: 2a 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f 0a 73 74  ** places..*/.st
3ef0: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f  atic int checkFo
3f00: 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
3f10: 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65  ctError(.  Parse
3f20: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3f30: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
3f40: 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
3f50: 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44  t *pDest,   /* D
3f60: 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45  estination of SE
3f70: 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a  LECT results */.
3f80: 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20    int nExpr     
3f90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3fa0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
3fb0: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ns returned by S
3fc0: 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ELECT */.){.  in
3fd0: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
3fe0: 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45  >eDest;.  if( nE
3ff0: 78 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d  xpr>1 && (eDest=
4000: 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
4010: 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20  t==SRT_Set) ){. 
4020: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4030: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79  sg(pParse, "only
4040: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
4050: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
4060: 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
4070: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
4080: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b  an expression");
4090: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
40a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
40b0: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
40c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
40d0: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
40e0: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
40f0: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
4100: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
4110: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
4120: 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20  Tab and nColumn 
4130: 61 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74  are both zero, t
4140: 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65  hen the pEList e
4150: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72  xpressions.** ar
4160: 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f  e evaluated in o
4170: 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
4180: 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f  data for this ro
4190: 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30  w.  If nColumn>0
41a0: 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73  .** then data is
41b0: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63   pulled from src
41c0: 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69  Tab and pEList i
41d0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67  s used only to g
41e0: 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79  et the.** dataty
41f0: 70 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  pes for each col
4200: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
4210: 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  oid selectInnerL
4220: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
4230: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
4240: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
4250: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
4260: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
4270: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
4280: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
4290: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
42a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
42b0: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
42c0: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65  ist of values be
42d0: 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f  ing extracted */
42e0: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
42f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
4300: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
4310: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  s table */.  int
4320: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   nColumn,       
4330: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4340: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
4350: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f   source table */
4360: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
4370: 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66  derBy,     /* If
4380: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20   not NULL, sort 
4390: 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68  results using th
43a0: 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  is key */.  int 
43b0: 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20  distinct,       
43c0: 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d      /* If >=0, m
43d0: 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74 73  ake sure results
43e0: 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f   are distinct */
43f0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
4400: 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f  Dest,      /* Ho
4410: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
4420: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
4430: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
4440: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
4450: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
4460: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
4470: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4490: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
44a0: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
44b0: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  ner loop */.){. 
44c0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
44d0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
44e0: 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74  i;.  int hasDist
44f0: 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  inct;        /* 
4500: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
4510: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
4520: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
4530: 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20   regResult;     
4540: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
4550: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
4560: 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a  ing result set *
4570: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  /.  int eDest = 
4580: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20  pDest->eDest;   
4590: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
45a0: 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a  e of results */.
45b0: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
45c0: 65 73 74 2d 3e 69 50 61 72 6d 3b 20 20 20 2f 2a  est->iParm;   /*
45d0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
45e0: 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68  to disposal meth
45f0: 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73  od */.  int nRes
4600: 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  ultCol;         
4610: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4620: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
4630: 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  */..  if( v==0 )
4640: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
4650: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
4660: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
4670: 64 69 73 74 69 6e 63 74 3e 3d 30 3b 0a 20 20 69  distinct>=0;.  i
4680: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  f( pOrderBy==0 &
4690: 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29  & !hasDistinct )
46a0: 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  {.    codeOffset
46b0: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
46c0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c  );.  }..  /* Pul
46d0: 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  l the requested 
46e0: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20  columns..  */.  
46f0: 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b  if( nColumn>0 ){
4700: 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20  .    nResultCol 
4710: 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c  = nColumn;.  }el
4720: 73 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43  se{.    nResultC
4730: 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
4740: 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  pr;.  }.  if( pD
4750: 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a  est->iMem==0 ){.
4760: 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20      pDest->iMem 
4770: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
4780: 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65  ;.    pDest->nMe
4790: 6d 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  m = nResultCol;.
47a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
47b0: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
47c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73    }else if( pDes
47d0: 74 2d 3e 6e 4d 65 6d 21 3d 6e 52 65 73 75 6c 74  t->nMem!=nResult
47e0: 43 6f 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Col ){.    /* Th
47f0: 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
4800: 74 77 6f 20 53 45 4c 45 43 54 73 20 6f 66 20 61  two SELECTs of a
4810: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
4820: 20 68 61 76 65 20 64 69 66 66 65 72 69 6e 67 0a   have differing.
4830: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 20 6f      ** numbers o
4840: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
4850: 2e 20 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73  .  The error mes
4860: 73 61 67 65 20 77 69 6c 6c 20 62 65 20 67 65 6e  sage will be gen
4870: 65 72 61 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  erated by.    **
4880: 20 61 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20   a higher-level 
4890: 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20  routine. */.    
48a0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 65  return;.  }.  re
48b0: 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d  gResult = pDest-
48c0: 3e 69 4d 65 6d 3b 0a 20 20 69 66 28 20 6e 43 6f  >iMem;.  if( nCo
48d0: 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f  lumn>0 ){.    fo
48e0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
48f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
4900: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4910: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
4920: 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75  cTab, i, regResu
4930: 6c 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lt+i);.    }.  }
4940: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d  else if( eDest!=
4950: 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20  SRT_Exists ){.  
4960: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
4970: 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58  ination is an EX
4980: 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73  ISTS(...) expres
4990: 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c  sion, the actual
49a0: 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72  .    ** values r
49b0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
49c0: 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65  ELECT are not re
49d0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
49e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
49f0: 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
4a00: 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65  e, pEList, regRe
4a10: 73 75 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52 54  sult, eDest==SRT
4a20: 5f 4f 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20  _Output);.  }.  
4a30: 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c  nColumn = nResul
4a40: 74 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  tCol;..  /* If t
4a50: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
4a60: 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20  ord was present 
4a70: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
4a80: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64  atement.  ** and
4a90: 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65   this row has be
4aa0: 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20  en seen before, 
4ab0: 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65  then do not make
4ac0: 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70   this row.  ** p
4ad0: 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c  art of the resul
4ae0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61  t..  */.  if( ha
4af0: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
4b00: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
4b10: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
4b20: 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ( pEList->nExpr=
4b30: 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  =nColumn );.    
4b40: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
4b50: 72 73 65 2c 20 64 69 73 74 69 6e 63 74 2c 20 69  rse, distinct, i
4b60: 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d  Continue, nColum
4b70: 6e 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n, regResult);. 
4b80: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d     if( pOrderBy=
4b90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  =0 ){.      code
4ba0: 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f  Offset(v, p, iCo
4bb0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20  ntinue);.    }. 
4bc0: 20 7d 0a 0a 20 20 69 66 28 20 63 68 65 63 6b 46   }..  if( checkF
4bd0: 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
4be0: 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
4bf0: 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e   pDest, pEList->
4c00: 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 72 65  nExpr) ){.    re
4c10: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  turn;.  }..  swi
4c20: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
4c30: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64    /* In this mod
4c40: 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75  e, write each qu
4c50: 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68  ery result to th
4c60: 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d  e key of the tem
4c70: 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61  porary.    ** ta
4c80: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
4c90: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
4ca0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
4cb0: 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53  ELECT.    case S
4cc0: 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20  RT_Union: {.    
4cd0: 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
4ce0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
4cf0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
4d00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4d10: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4d20: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
4d30: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31  ult, nColumn, r1
4d40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4d50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4d60: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
4d70: 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  m, r1);.      sq
4d80: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
4d90: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
4da0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4db0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73    }..    /* Cons
4dc0: 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66  truct a record f
4dd0: 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65  rom the query re
4de0: 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61  sult, but instea
4df0: 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69  d of.    ** savi
4e00: 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20  ng that record, 
4e10: 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20  use it as a key 
4e20: 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e  to delete elemen
4e30: 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ts from.    ** t
4e40: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
4e50: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
4e60: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
4e70: 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  cept: {.      sq
4e80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4e90: 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c  v, OP_IdxDelete,
4ea0: 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c   iParm, regResul
4eb0: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
4ec0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4ed0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53  #endif..    /* S
4ee0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
4ef0: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
4f00: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
4f10: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
4f20: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
4f30: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
4f40: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
4f50: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
4f60: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
4f70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4f80: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4f90: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
4fa0: 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20  Column, r1);.   
4fb0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
4fc0: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
4fd0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
4fe0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
4ff0: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
5000: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20  .        int r2 
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 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
5050: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32  Rowid, iParm, r2
5060: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5070: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5080: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
5090: 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
50a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
50b0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
50c0: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
50d0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
50e0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
50f0: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
5100: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
5110: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
5120: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
5130: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
5140: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
5150: 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
5160: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
5170: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
5180: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
5190: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
51a0: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
51b0: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
51c0: 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
51d0: 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
51e0: 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
51f0: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
5200: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
5210: 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
5220: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
5230: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
5240: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
5250: 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73   p->affinity = s
5260: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
5270: 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b  inity(pEList->a[
5280: 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d  0].pExpr, pDest-
5290: 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20  >affinity);.    
52a0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
52b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
52c0: 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75  first glance you
52d0: 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20   would think we 
52e0: 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f  could optimize o
52f0: 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ut the.        *
5300: 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68  * ORDER BY in th
5310: 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68  is case since th
5320: 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69  e order of entri
5330: 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20  es in the set.  
5340: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
5350: 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74  t matter.  But t
5360: 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20  here might be a 
5370: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e  LIMIT clause, in
5380: 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
5390: 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72  * case the order
53a0: 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a   does matter */.
53b0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
53c0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
53d0: 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52  OrderBy, p, regR
53e0: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65  esult);.      }e
53f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
5400: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5410: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5420: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5430: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
5440: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
5450: 52 65 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20 26  Result, 1, r1, &
5460: 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  p->affinity, 1);
5470: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5480: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
5490: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
54a0: 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20  regResult, 1);. 
54b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
54c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
54d0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
54e0: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
54f0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5500: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
5510: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5520: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5530: 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65   /* If any row e
5540: 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75  xist in the resu
5550: 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74  lt set, record t
5560: 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f  hat fact and abo
5570: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rt..    */.    c
5580: 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20  ase SRT_Exists: 
5590: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
55a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
55b0: 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72  Integer, 1, iPar
55c0: 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
55d0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
55e0: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
55f0: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
5600: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5610: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
5620: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
5630: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
5640: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
5650: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
5660: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
5670: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
5680: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
5690: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
56a0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
56b0: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
56c0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
56d0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
56e0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
56f0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
5700: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
5710: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
5720: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
5730: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
5740: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5750: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
5760: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
5770: 65 67 52 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c  egResult, iParm,
5780: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20   1);.        /* 
5790: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
57a0: 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
57b0: 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
57c0: 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s */.      }.   
57d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
57e0: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
57f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
5800: 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
5810: 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74 61 20  * Send the data 
5820: 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
5830: 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61  function or to a
5840: 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e   subroutine.  In
5850: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65   the.    ** case
5860: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
5870: 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
5880: 20 69 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f   itself is respo
5890: 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a  nsible for.    *
58a0: 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61  * popping the da
58b0: 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ta from the stac
58c0: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  k..    */.    ca
58d0: 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
58e0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f  :.    case SRT_O
58f0: 75 74 70 75 74 3a 20 7b 0a 20 20 20 20 20 20 69  utput: {.      i
5900: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
5910: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
5920: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
5930: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
5940: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5950: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
5960: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
5970: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a  , nColumn, r1);.
5980: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
5990: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
59a0: 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b  OrderBy, p, r1);
59b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
59c0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
59d0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
59e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
59f0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
5a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5a10: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
5a20: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
5a30: 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  ->iParm);.      
5a40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5a50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5a60: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
5a70: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5a80: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
5a90: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
5aa0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
5ab0: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
5ac0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
5ad0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
5ae0: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
5af0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5b00: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
5b10: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
5b20: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
5b30: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
5b40: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
5b50: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
5b60: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
5b70: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
5b80: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
5b90: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
5ba0: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
5bb0: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
5bc0: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
5bd0: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
5be0: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
5bf0: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
5c00: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
5c10: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
5c20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
5c30: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
5c40: 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d );.      break
5c50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
5c60: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
5c70: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
5c80: 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
5c90: 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20  T is reached..  
5ca0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  */.  if( p->iLim
5cb0: 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
5cc0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ( pOrderBy==0 );
5cd0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
5ce0: 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
5cf0: 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20  e call to.      
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d10: 20 20 20 20 20 20 2a 2a 20 70 75 73 68 4f 6e 74        ** pushOnt
5d20: 6f 53 6f 72 74 65 72 28 29 20 77 6f 75 6c 64 20  oSorter() would 
5d30: 68 61 76 65 20 63 6c 65 61 72 65 64 20 70 2d 3e  have cleared p->
5d40: 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 73 71  iLimit */.    sq
5d50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5d60: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d  v, OP_AddImm, p-
5d70: 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20  >iLimit, -1);.  
5d80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5d90: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op2(v, OP_IfZero
5da0: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
5db0: 65 61 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  eak);.  }.}../*.
5dc0: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
5dd0: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e  ession list, gen
5de0: 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  erate a KeyInfo 
5df0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
5e00: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f  ecords.** the co
5e10: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
5e20: 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   for each expres
5e30: 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70  sion in that exp
5e40: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
5e50: 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c  .** If the ExprL
5e60: 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ist is an ORDER 
5e70: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
5e80: 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72  lause then the r
5e90: 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49  esulting.** KeyI
5ea0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
5eb0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
5ec0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
5ed0: 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
5ee0: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  .** implement th
5ef0: 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  at clause.  If t
5f00: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74  he ExprList is t
5f10: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
5f20: 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65   a SELECT.** the
5f30: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  n the KeyInfo st
5f40: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
5f50: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
5f60: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
5f70: 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d  l.** index to im
5f80: 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e  plement a DISTIN
5f90: 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53  CT test..**.** S
5fa0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
5fb0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
5fc0: 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f  re is obtain fro
5fd0: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
5fe0: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
5ff0: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
6000: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
6010: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
6020: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
6030: 2a 20 66 72 65 65 64 2e 20 20 41 64 64 20 74 68  * freed.  Add th
6040: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
6050: 75 72 65 20 74 6f 20 74 68 65 20 50 34 20 66 69  ure to the P4 fi
6060: 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65  eld of an opcode
6070: 20 75 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59   using.** P4_KEY
6080: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20  INFO_HANDOFF is 
6090: 74 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66  the usual way of
60a0: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68   dealing with th
60b0: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65  is..*/.static Ke
60c0: 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72  yInfo *keyInfoFr
60d0: 6f 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73 65  omExprList(Parse
60e0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
60f0: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71  st *pList){.  sq
6100: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
6110: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45  se->db;.  int nE
6120: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
6130: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
6140: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
6150: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Item;.  int i;..
6160: 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    nExpr = pList-
6170: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20  >nExpr;.  pInfo 
6180: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6190: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
61a0: 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72  (*pInfo) + nExpr
61b0: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
61c0: 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  *)+1) );.  if( p
61d0: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66  Info ){.    pInf
61e0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  o->aSortOrder = 
61f0: 28 75 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f  (u8*)&pInfo->aCo
6200: 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70  ll[nExpr];.    p
6210: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28  Info->nField = (
6220: 75 31 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 70  u16)nExpr;.    p
6230: 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
6240: 64 62 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  db);.    pInfo->
6250: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 66 6f 72  db = db;.    for
6260: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (i=0, pItem=pLis
6270: 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69  t->a; i<nExpr; i
6280: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
6290: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
62a0: 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20  ll;.      pColl 
62b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
62c0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
62d0: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
62e0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
62f0: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
6300: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
6310: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
6320: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  fo->aColl[i] = p
6330: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66  Coll;.      pInf
6340: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
6350: 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   = pItem->sortOr
6360: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
6370: 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d   return pInfo;.}
6380: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
6390: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
63a0: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
63b0: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
63c0: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
63d0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
63e0: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
63f0: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
6400: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
6410: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
6420: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
6430: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
6440: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
6450: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
6460: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
6470: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
6480: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
6490: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
64a0: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
64b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
64c0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
64d0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
64e0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
64f0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
6500: 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ent */.  Vdbe *v
6510: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
6520: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
6530: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
6540: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
6550: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
6560: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
6570: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
6580: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
6590: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
65a0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
65b0: 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73  nt addrBreak = s
65c0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
65d0: 62 65 6c 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a  bel(v);     /* J
65e0: 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74  ump here to exit
65f0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
6600: 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71  ddrContinue = sq
6610: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
6620: 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20  el(v);  /* Jump 
6630: 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79  here for next cy
6640: 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  cle */.  int add
6650: 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  r;.  int iTab;. 
6660: 20 69 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d   int pseudoTab =
6670: 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   0;.  ExprList *
6680: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
6690: 72 64 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65  rderBy;..  int e
66a0: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
66b0: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
66c0: 20 3d 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b   = pDest->iParm;
66d0: 0a 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a  ..  int regRow;.
66e0: 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a    int regRowid;.
66f0: 0a 20 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72  .  iTab = pOrder
6700: 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20  By->iECursor;.  
6710: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
6720: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
6730: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
6740: 0a 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d  .    pseudoTab =
6750: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
6760: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6770: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74  AddOp2(v, OP_Set
6780: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 6e  NumColumns, 0, n
6790: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c  Column);.    sql
67a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
67b0: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
67c0: 20 70 73 65 75 64 6f 54 61 62 2c 20 65 44 65 73   pseudoTab, eDes
67d0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 29 3b 0a  t==SRT_Output);.
67e0: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b    }.  addr = 1 +
67f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6800: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
6810: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
6820: 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
6830: 20 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65   p, addrContinue
6840: 29 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20 73 71  );.  regRow = sq
6850: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
6860: 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 52 6f  pParse);.  regRo
6870: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  wid = sqlite3Get
6880: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6890: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
68a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
68b0: 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42  n, iTab, pOrderB
68c0: 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20 72 65  y->nExpr + 1, re
68d0: 67 52 6f 77 29 3b 0a 20 20 73 77 69 74 63 68 28  gRow);.  switch(
68e0: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
68f0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
6900: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
6910: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  Tab: {.      sql
6920: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6930: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
6940: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b  Parm, regRowid);
6950: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6960: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
6970: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65  nsert, iParm, re
6980: 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b  gRow, regRowid);
6990: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
69a0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
69b0: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
69c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
69d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
69e0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
69f0: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
6a00: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
6a10: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
6a20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6a30: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
6a40: 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20  Record, regRow, 
6a50: 31 2c 20 72 65 67 52 6f 77 69 64 2c 20 26 70 2d  1, regRowid, &p-
6a60: 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  >affinity, 1);. 
6a70: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6a80: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
6a90: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
6aa0: 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ow, 1);.      sq
6ab0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6ac0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
6ad0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
6ae0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6af0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
6b00: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
6b10: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
6b20: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
6b30: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
6b40: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
6b50: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
6b60: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
6b70: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
6b80: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
6b90: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
6ba0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
6bb0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75  .    case SRT_Ou
6bc0: 74 70 75 74 3a 0a 20 20 20 20 63 61 73 65 20 53  tput:.    case S
6bd0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a  RT_Coroutine: {.
6be0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
6bf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6c00: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
6c10: 65 72 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29  er, 1, regRowid)
6c20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6c30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6c40: 49 6e 73 65 72 74 2c 20 70 73 65 75 64 6f 54 61  Insert, pseudoTa
6c50: 62 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  b, regRow, regRo
6c60: 77 69 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  wid);.      for(
6c70: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
6c80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i++){.        as
6c90: 73 65 72 74 28 20 72 65 67 52 6f 77 21 3d 70 44  sert( regRow!=pD
6ca0: 65 73 74 2d 3e 69 4d 65 6d 2b 69 20 29 3b 0a 20  est->iMem+i );. 
6cb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6cc0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
6cd0: 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61 62  olumn, pseudoTab
6ce0: 2c 20 69 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d  , i, pDest->iMem
6cf0: 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +i);.      }.   
6d00: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
6d10: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
6d20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6d30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
6d40: 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 4d  ltRow, pDest->iM
6d50: 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  em, nColumn);.  
6d60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6d70: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
6d80: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65  ange(pParse, pDe
6d90: 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d  st->iMem, nColum
6da0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
6db0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6dc0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
6dd0: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
6de0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
6df0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6e00: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
6e10: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
6e20: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
6e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
6e40: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
6e50: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
6e60: 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65  egRow);.  sqlite
6e70: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
6e80: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
6e90: 29 3b 0a 0a 20 20 2f 2a 20 4c 49 4d 49 54 20 68  );..  /* LIMIT h
6ea0: 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e  as been implemen
6eb0: 74 65 64 20 62 79 20 74 68 65 20 70 75 73 68 4f  ted by the pushO
6ec0: 6e 74 6f 53 6f 72 74 65 72 28 29 20 72 6f 75 74  ntoSorter() rout
6ed0: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ine..  */.  asse
6ee0: 72 74 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30  rt( p->iLimit==0
6ef0: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f   );..  /* The bo
6f00: 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
6f10: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
6f20: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
6f30: 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  v, addrContinue)
6f40: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
6f50: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
6f60: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20  , iTab, addr);. 
6f70: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
6f80: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
6f90: 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 65 44  Break);.  if( eD
6fa0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
6fb0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
6fc0: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73  routine ){.    s
6fd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6fe0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73  (v, OP_Close, ps
6ff0: 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d  eudoTab, 0);.  }
7000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7010: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
7020: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
7030: 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69  g the 'declarati
7040: 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a  on type' of the.
7050: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  ** expression pE
7060: 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20  xpr. The string 
7070: 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61  may be treated a
7080: 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20  s static by the 
7090: 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  caller..**.** Th
70a0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
70b0: 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20  pe is the exact 
70c0: 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74  datatype definit
70d0: 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72  ion extracted fr
70e0: 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  om the.** origin
70f0: 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  al CREATE TABLE 
7100: 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65  statement if the
7110: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
7120: 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20   column. The.** 
7130: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
7140: 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65   for a ROWID fie
7150: 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45  ld is INTEGER. E
7160: 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65  xactly when an e
7170: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
7180: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
7190: 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  umn can be compl
71a0: 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e  ex in the presen
71b0: 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65 73  ce of subqueries
71c0: 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d  . The.** result-
71d0: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  set expression i
71e0: 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  n all of the fol
71f0: 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74  lowing SELECT st
7200: 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20  atements is .** 
7210: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
7220: 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63  umn by this func
7230: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45  tion..**.**   SE
7240: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
7250: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
7260: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
7270: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
7280: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
7290: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c  M tbl);.**   SEL
72a0: 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45  ECT abc FROM (SE
72b0: 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20  LECT col AS abc 
72c0: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a  FROM tbl);.** .*
72d0: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
72e0: 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65  n type for any e
72f0: 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20  xpression other 
7300: 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73  than a column is
7310: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
7320: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
7330: 75 6d 6e 54 79 70 65 28 0a 20 20 4e 61 6d 65 43  umnType(.  NameC
7340: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20  ontext *pNC, .  
7350: 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63  Expr *pExpr,.  c
7360: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
7370: 69 67 69 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20  iginDb,.  const 
7380: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54  char **pzOriginT
7390: 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ab,.  const char
73a0: 20 2a 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29   **pzOriginCol.)
73b0: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
73c0: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61  zType = 0;.  cha
73d0: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e  r const *zOrigin
73e0: 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  Db = 0;.  char c
73f0: 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62  onst *zOriginTab
7400: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
7410: 73 74 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d  st *zOriginCol =
7420: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69   0;.  int j;.  i
7430: 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70  f( pExpr==0 || p
7440: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20  NC->pSrcList==0 
7450: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 73  ) return 0;..  s
7460: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
7470: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
7480: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
7490: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
74a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
74b0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
74c0: 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68  olumn. Locate th
74d0: 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75  e table the colu
74e0: 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  mn is being.    
74f0: 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66    ** extracted f
7500: 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65  rom in NameConte
7510: 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69  xt.pSrcList. Thi
7520: 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72  s table may be r
7530: 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  eal.      ** dat
7540: 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61  abase table or a
7550: 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20   subquery..     
7560: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
7570: 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  *pTab = 0;      
7580: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73        /* Table s
7590: 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20  tructure column 
75a0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
75b0: 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  m */.      Selec
75c0: 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20  t *pS = 0;      
75d0: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
75e0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65   the column is e
75f0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
7600: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
7610: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
7620: 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63  ;  /* Index of c
7630: 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f  olumn in pTab */
7640: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e  .      while( pN
7650: 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  C && !pTab ){.  
7660: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
7670: 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  TabList = pNC->p
7680: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  SrcList;.       
7690: 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c   for(j=0;j<pTabL
76a0: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
76b0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
76c0: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
76d0: 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  le;j++);.       
76e0: 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d   if( j<pTabList-
76f0: 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20  >nSrc ){.       
7700: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
7710: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
7720: 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54           pS = pT
7730: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65  abList->a[j].pSe
7740: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  lect;.        }e
7750: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
7760: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
7770: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7780: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
7790: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
77a0: 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20 20 20   /* FIX ME:.    
77b0: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 6e 20      ** This can 
77c0: 6f 63 63 75 72 73 20 69 66 20 79 6f 75 20 68 61  occurs if you ha
77d0: 76 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ve something lik
77e0: 65 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 3b  e "SELECT new.x;
77f0: 22 20 69 6e 73 69 64 65 0a 20 20 20 20 20 20 20  " inside.       
7800: 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2e 20 20   ** a trigger.  
7810: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
7820: 69 66 20 79 6f 75 20 72 65 66 65 72 65 6e 63 65  if you reference
7830: 20 74 68 65 20 73 70 65 63 69 61 6c 20 22 6e 65   the special "ne
7840: 77 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  w".        ** ta
7850: 62 6c 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ble in the resul
7860: 74 20 73 65 74 20 6f 66 20 61 20 73 65 6c 65 63  t set of a selec
7870: 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 68 61  t.  We do not ha
7880: 76 65 20 61 20 67 6f 6f 64 20 77 61 79 0a 20 20  ve a good way.  
7890: 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64        ** to find
78a0: 20 74 68 65 20 61 63 74 75 61 6c 20 74 61 62 6c   the actual tabl
78b0: 65 20 74 79 70 65 2c 20 73 6f 20 63 61 6c 6c 20  e type, so call 
78c0: 69 74 20 22 54 45 58 54 22 2e 20 20 54 68 69 73  it "TEXT".  This
78d0: 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 20 20 20   is really.     
78e0: 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20     ** something 
78f0: 6f 66 20 61 20 62 75 67 2c 20 62 75 74 20 49 20  of a bug, but I 
7900: 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20  do not know how 
7910: 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20 20 20  to fix it..     
7920: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
7930: 20 54 68 69 73 20 63 6f 64 65 20 64 6f 65 73 20   This code does 
7940: 6e 6f 74 20 70 72 6f 64 75 63 65 20 74 68 65 20  not produce the 
7950: 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2d  correct answer -
7960: 20 69 74 20 6a 75 73 74 20 70 72 65 76 65 6e 74   it just prevent
7970: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73  s.        ** a s
7980: 65 67 66 61 75 6c 74 2e 20 20 53 65 65 20 74 69  egfault.  See ti
7990: 63 6b 65 74 20 23 31 32 32 39 2e 0a 20 20 20 20  cket #1229..    
79a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a      */.        z
79b0: 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a 20  Type = "TEXT";. 
79c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
79d0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
79e0: 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20 20  ert( pTab );.   
79f0: 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20     if( pS ){.   
7a00: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62       /* The "tab
7a10: 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20  le" is actually 
7a20: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
7a30: 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52  a view in the FR
7a40: 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  OM clause.      
7a50: 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45    ** of the SELE
7a60: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65  CT statement. Re
7a70: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
7a80: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72  tion type and or
7a90: 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  igin.        ** 
7aa0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73  data for the res
7ab0: 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f  ult-set column o
7ac0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
7ad0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
7ae0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
7af0: 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c   && iCol<pS->pEL
7b00: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
7b10: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43          /* If iC
7b20: 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ol is less than 
7b30: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65  zero, then the e
7b40: 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73  xpression reques
7b50: 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ts the.         
7b60: 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65   ** rowid of the
7b70: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
7b80: 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73  iew. This expres
7b90: 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73  sion is legal (s
7ba0: 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ee .          **
7bb0: 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32   test case misc2
7bc0: 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79  .2.2) - it alway
7bd0: 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  s evaluates to N
7be0: 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ULL..          *
7bf0: 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  /.          Name
7c00: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
7c10: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
7c20: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69   pS->pEList->a[i
7c30: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  Col].pExpr;.    
7c40: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
7c50: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
7c60: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65           sNC.pNe
7c70: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
7c80: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
7c90: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
7ca0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
7cb0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
7cc0: 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a  , &zOriginDb, &z
7cd0: 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69  OriginTab, &zOri
7ce0: 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20  ginCol); .      
7cf0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
7d00: 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  if( pTab->pSchem
7d10: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
7d20: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  A real table */.
7d30: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7d40: 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !pS );.        i
7d50: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
7d60: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
7d70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7d80: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
7d90: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
7da0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
7db0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
7dc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
7dd0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
7de0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e           zOrigin
7df0: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
7e00: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7e10: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
7e20: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
7e30: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
7e40: 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70    zOriginCol = p
7e50: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
7e60: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
7e70: 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e  .        zOrigin
7e80: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
7e90: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
7ea0: 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20  NC->pParse ){.  
7eb0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
7ec0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
7ed0: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
7ee0: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
7ef0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
7f00: 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e    zOriginDb = pN
7f10: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
7f20: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
7f30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7f40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7f50: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
7f60: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
7f70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
7f80: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
7f90: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
7fa0: 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  s a sub-select. 
7fb0: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
7fc0: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a  ration type and.
7fd0: 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20        ** origin 
7fe0: 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e  info for the sin
7ff0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  gle column in th
8000: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
8010: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20  the SELECT.     
8020: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20   ** statement.. 
8030: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61       */.      Na
8040: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
8050: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
8060: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
8070: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20  ;.      Expr *p 
8080: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
8090: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
80a0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
80b0: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
80c0: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
80d0: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
80e0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
80f0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
8100: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
8110: 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a  , &zOriginDb, &z
8120: 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69  OriginTab, &zOri
8130: 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20  ginCol); .      
8140: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
8150: 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28  dif.  }.  .  if(
8160: 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a 20   pzOriginDb ){. 
8170: 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69     assert( pzOri
8180: 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72 69 67  ginTab && pzOrig
8190: 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  inCol );.    *pz
81a0: 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69 67  OriginDb = zOrig
81b0: 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  inDb;.    *pzOri
81c0: 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69 6e  ginTab = zOrigin
81d0: 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  Tab;.    *pzOrig
81e0: 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e 43  inCol = zOriginC
81f0: 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ol;.  }.  return
8200: 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zType;.}../*.**
8210: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
8220: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
8230: 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61  e VDBE the decla
8240: 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20  ration types of 
8250: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
8260: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f  e result set..*/
8270: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
8280: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
8290: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
82a0: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
82b0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
82c0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
82d0: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
82e0: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
82f0: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
8300: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
8310: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
8320: 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64   set */.){.#ifnd
8330: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
8340: 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a  ECLTYPE.  Vdbe *
8350: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
8360: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  e;.  int i;.  Na
8370: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
8380: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
8390: 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e  pTabList;.  sNC.
83a0: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
83b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
83c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
83d0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
83e0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
83f0: 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  xpr;.    const c
8400: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64  har *zType;.#ifd
8410: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
8420: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
8430: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
8440: 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20  *zOrigDb = 0;.  
8450: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
8460: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  rigTab = 0;.    
8470: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
8480: 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54  gCol = 0;.    zT
8490: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
84a0: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
84b0: 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26  Db, &zOrigTab, &
84c0: 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20  zOrigCol);..    
84d0: 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74  /* The vdbe must
84e0: 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f   make its own co
84f0: 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
8500: 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20  -type and other 
8510: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73  .    ** column s
8520: 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c  pecific strings,
8530: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68   in case the sch
8540: 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66  ema is reset bef
8550: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ore this.    ** 
8560: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
8570: 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  is deleted..    
8580: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
8590: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
85a0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42  i, COLNAME_DATAB
85b0: 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51  ASE, zOrigDb, SQ
85c0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
85d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
85e0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
85f0: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
8600: 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45  zOrigTab, SQLITE
8610: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
8620: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8630: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8640: 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72  NAME_COLUMN, zOr
8650: 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52  igCol, SQLITE_TR
8660: 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a  ANSIENT);.#else.
8670: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
8680: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
8690: 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 0, 0);.#endif
86a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
86b0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
86c0: 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50   COLNAME_DECLTYP
86d0: 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45  E, zType, SQLITE
86e0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
86f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8700: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 20  E_OMIT_DECLTYPE 
8710: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  */.}../*.** Gene
8720: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
8730: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
8740: 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  E the names of c
8750: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
8760: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68   result set.  Th
8770: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
8780: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64  s used to provid
8790: 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d  e the.** azCol[]
87a0: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63   values in the c
87b0: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  allback..*/.stat
87c0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
87d0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
87e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
87f0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
8800: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
8810: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
8820: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
8830: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
8840: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
8850: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
8860: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
8870: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
8880: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
8890: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73  .  int i, j;.  s
88a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
88b0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66  rse->db;.  int f
88c0: 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e  ullNames, shortN
88d0: 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ames;..#ifndef S
88e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
88f0: 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  IN.  /* If this 
8900: 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73  is an EXPLAIN, s
8910: 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f  kip this step */
8920: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
8930: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65  xplain ){.    re
8940: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
8950: 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ..  assert( v!=0
8960: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
8970: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
8980: 20 76 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   v==0 || db->mal
8990: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
89a0: 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  rn;.  pParse->co
89b0: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
89c0: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
89d0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
89e0: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
89f0: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
8a00: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
8a10: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
8a20: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
8a30: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
8a40: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
8a50: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
8a60: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
8a70: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
8a80: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
8a90: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
8aa0: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f     if( p==0 ) co
8ab0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
8ac0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8ad0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  me ){.      char
8ae0: 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   *zName = pEList
8af0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
8b00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8b10: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8b20: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
8b30: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  ame, SQLITE_TRAN
8b40: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73  SIENT);.    }els
8b50: 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b  e if( (p->op==TK
8b60: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70  _COLUMN || p->op
8b70: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29  ==TK_AGG_COLUMN)
8b80: 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a   && pTabList ){.
8b90: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
8ba0: 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  b;.      char *z
8bb0: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
8bc0: 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
8bd0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
8be0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
8bf0: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
8c00: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e  [j].iCursor!=p->
8c10: 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20  iTable; j++){}. 
8c20: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
8c30: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
8c40: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54  .      pTab = pT
8c50: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
8c60: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  b;.      if( iCo
8c70: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
8c80: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
8c90: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
8ca0: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
8cb0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
8cc0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
8cd0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
8ce0: 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  zCol = "rowid";.
8cf0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8d00: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62       zCol = pTab
8d10: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
8d20: 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  me;.      }.    
8d30: 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65    if( !shortName
8d40: 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20  s && !fullNames 
8d50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8d60: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8d70: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
8d80: 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  AME, .          
8d90: 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44    sqlite3DbStrND
8da0: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 2d  up(db, (char*)p-
8db0: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
8dc0: 2e 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  .n), SQLITE_DYNA
8dd0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
8de0: 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20  e if( fullNames 
8df0: 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20  || (!shortNames 
8e00: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  && pTabList->nSr
8e10: 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  c>1) ){.        
8e20: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
8e30: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
8e40: 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a  Tab;. .        z
8e50: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
8e60: 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20  a[j].zAlias;.   
8e70: 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d       if( fullNam
8e80: 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20  es || zTab==0 ) 
8e90: 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  zTab = pTab->zNa
8ea0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  me;.        zNam
8eb0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
8ec0: 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
8ed0: 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  zTab, zCol);.   
8ee0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8ef0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8f00: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
8f10: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e  Name, SQLITE_DYN
8f20: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
8f30: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8f40: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8f50: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8f60: 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49  NAME, zCol, SQLI
8f70: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
8f80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8f90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8fa0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8fb0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
8fc0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
8fd0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
8fe0: 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e  , (char*)p->span
8ff0: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 2c 20  .z, p->span.n), 
9000: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
9010: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
9020: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
9030: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
9040: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23  t, pEList);.}..#
9050: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9060: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
9070: 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  CT./*.** Name of
9080: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
9090: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
90a0: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
90b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
90c0: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
90d0: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
90e0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
90f0: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
9100: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
9110: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
9120: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
9130: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
9140: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
9150: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
9160: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
9170: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
9180: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9190: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
91a0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
91b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
91c0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
91d0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
91e0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
91f0: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
9200: 47 69 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65  Given a an expre
9210: 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63  ssion list (whic
9220: 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  h is really the 
9230: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
9240: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d  ons.** that form
9250: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
9260: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
9270: 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61  ement) compute a
9280: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f  ppropriate.** co
9290: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61  lumn names for a
92a0: 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c   table that woul
92b0: 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  d hold the expre
92c0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
92d0: 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * All column nam
92e0: 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75  es will be uniqu
92f0: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  e..**.** Only th
9300: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
9310: 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f  re computed.  Co
9320: 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75  lumn.zType, Colu
9330: 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64  mn.zColl,.** and
9340: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
9350: 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f   Column are zero
9360: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
9370: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
9380: 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d  ccess.  If a mem
9390: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
93a0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
93b0: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70  store NULL in *p
93c0: 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70  aCol and 0 in *p
93d0: 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  nCol and return 
93e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
93f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
9400: 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
9410: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
9420: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
9430: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
9440: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
9450: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
9460: 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
9470: 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
9480: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
9490: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c  */.  int *pnCol,
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94b0: 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
94c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
94d0: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
94e0: 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
94f0: 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
9500: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
9510: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
9520: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9530: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
9540: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
9550: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
9560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9570: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
9580: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
95a0: 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
95b0: 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
95c0: 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
95d0: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
95e0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
95f0: 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
9600: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
9610: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
9620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9630: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
9640: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
9650: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20   */.  Expr *p;  
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9670: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
9680: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73  for a single res
9690: 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
96a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
96c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
96d0: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
96f0: 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a  ize of name in z
9700: 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 2a 70 6e  Name[] */..  *pn
9710: 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20 70 45 4c  Col = nCol = pEL
9720: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 43  ist->nExpr;.  aC
9730: 6f 6c 20 3d 20 2a 70 61 43 6f 6c 20 3d 20 73 71  ol = *paCol = sq
9740: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
9750: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
9760: 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 69  l[0])*nCol);.  i
9770: 66 28 20 61 43 6f 6c 3d 3d 30 20 29 20 72 65 74  f( aCol==0 ) ret
9780: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9790: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ;.  for(i=0, pCo
97a0: 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  l=aCol; i<nCol; 
97b0: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
97c0: 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72    /* Get an appr
97d0: 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72  opriate name for
97e0: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   the column.    
97f0: 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  */.    p = pELis
9800: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
9810: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
9820: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  ight==0 || p->pR
9830: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ight->token.z==0
9840: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74   || p->pRight->t
9850: 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a  oken.z[0]!=0 );.
9860: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
9870: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
9880: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
9890: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
98a0: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
98b0: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
98c0: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
98d0: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
98e0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
98f0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e  3DbStrDup(db, zN
9900: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
9910: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
9920: 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54  lExpr = p;  /* T
9930: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
9940: 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  at is the result
9950: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
9960: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
9970: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  b;         /* Ta
9980: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
9990: 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73  ith this express
99a0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ion */.      whi
99b0: 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  le( pColExpr->op
99c0: 3d 3d 54 4b 5f 44 4f 54 20 29 20 70 43 6f 6c 45  ==TK_DOT ) pColE
99d0: 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  xpr = pColExpr->
99e0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
99f0: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
9a00: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 28 70 54  TK_COLUMN && (pT
9a10: 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
9a20: 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Tab)!=0 ){.     
9a30: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
9a40: 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
9a50: 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
9a60: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
9a70: 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75   pColExpr->iColu
9a80: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  mn;.        if( 
9a90: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
9aa0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
9ab0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
9ac0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
9ad0: 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "%s",.          
9ae0: 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f         iCol>=0 ?
9af0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
9b00: 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64  ].zName : "rowid
9b10: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ");.      }else{
9b20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  .        /* Use 
9b30: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
9b40: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
9b50: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
9b60: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
9b70: 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20    Token *pToken 
9b80: 3d 20 28 70 43 6f 6c 45 78 70 72 2d 3e 73 70 61  = (pColExpr->spa
9b90: 6e 2e 7a 3f 26 70 43 6f 6c 45 78 70 72 2d 3e 73  n.z?&pColExpr->s
9ba0: 70 61 6e 3a 26 70 43 6f 6c 45 78 70 72 2d 3e 74  pan:&pColExpr->t
9bb0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7a  oken);.        z
9bc0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
9bd0: 72 69 6e 74 66 28 64 62 2c 20 22 25 54 22 2c 20  rintf(db, "%T", 
9be0: 70 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  pToken);.      }
9bf0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
9c00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9c10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9c20: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
9c30: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9c40: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9c50: 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
9c60: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
9c70: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  re the column na
9c80: 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49  me is unique.  I
9c90: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f  f the name is no
9ca0: 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a  t unique,.    **
9cb0: 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65   append a intege
9cc0: 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f  r to the name so
9cd0: 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73   that it becomes
9ce0: 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a   unique..    */.
9cf0: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
9d00: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
9d10: 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e  e);.    for(j=cn
9d20: 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  t=0; j<i; j++){.
9d30: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9d40: 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d  3StrICmp(aCol[j]
9d50: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
9d60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
9d70: 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20  r *zNewName;.   
9d80: 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65       zName[nName
9d90: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  ] = 0;.        z
9da0: 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  NewName = sqlite
9db0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
9dc0: 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  :%d", zName, ++c
9dd0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
9de0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
9df0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a  Name);.        z
9e00: 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b  Name = zNewName;
9e10: 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b  .        j = -1;
9e20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61  .        if( zNa
9e30: 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  me==0 ) break;. 
9e40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9e50: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
9e60: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Name;.  }.  if( 
9e70: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9e80: 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   ){.    for(j=0;
9e90: 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
9ea0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9eb0: 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  db, aCol[j].zNam
9ec0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
9ed0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9ee0: 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f  aCol);.    *paCo
9ef0: 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f  l = 0;.    *pnCo
9f00: 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  l = 0;.    retur
9f10: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
9f20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
9f30: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
9f40: 20 41 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f   Add type and co
9f50: 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
9f60: 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20  ion to a column 
9f70: 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  list based on.**
9f80: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
9f90: 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  ent..** .** The 
9fa0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73  column list pres
9fb0: 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d  umably came from
9fc0: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d   selectColumnNam
9fd0: 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29  esFromExprList()
9fe0: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20  ..** The column 
9ff0: 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61  list has only na
a000: 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f  mes, not types o
a010: 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54  r collations.  T
a020: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
a030: 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20  oes through and 
a040: 61 64 64 73 20 74 68 65 20 74 79 70 65 73 20 61  adds the types a
a050: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a  nd collations..*
a060: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a070: 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  e requires that 
a080: 61 6c 6c 20 69 6e 64 65 6e 74 69 66 69 65 72 73  all indentifiers
a090: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a   in the SELECT.*
a0a0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72  * statement be r
a0b0: 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  esolved..*/.stat
a0c0: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64  ic void selectAd
a0d0: 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
a0e0: 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65  llation(.  Parse
a0f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
a100: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
a110: 65 78 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  exts */.  int nC
a120: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
a130: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
a140: 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  umns */.  Column
a150: 20 2a 61 43 6f 6c 2c 20 20 20 20 20 20 20 20 20   *aCol,         
a160: 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
a170: 6e 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ns */.  Select *
a180: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a  pSelect       /*
a190: 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20   SELECT used to 
a1a0: 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20  determine types 
a1b0: 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a  and collations *
a1c0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
a1d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a1e0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
a1f0: 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  NC;.  Column *pC
a200: 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ol;.  CollSeq *p
a210: 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Coll;.  int i;. 
a220: 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75   Expr *p;.  stru
a230: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
a240: 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *a;..  assert( 
a250: 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
a260: 61 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74  assert( (pSelect
a270: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
a280: 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a  Resolved)!=0 );.
a290: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d    assert( nCol==
a2a0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
a2b0: 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  >nExpr || db->ma
a2c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
a2d0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
a2e0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
a2f0: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
a300: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
a310: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
a320: 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
a330: 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45   a = pSelect->pE
a340: 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  List->a;.  for(i
a350: 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69  =0, pCol=aCol; i
a360: 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  <nCol; i++, pCol
a370: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69  ++){.    p = a[i
a380: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43 6f  ].pExpr;.    pCo
a390: 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  l->zType = sqlit
a3a0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 63  e3DbStrDup(db, c
a3b0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
a3c0: 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20  p, 0, 0, 0));.  
a3d0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
a3e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
a3f0: 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 70  finity(p);.    p
a400: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
a410: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
a420: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
a430: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
a440: 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->zColl = sqlit
a450: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
a460: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
a470: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
a480: 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
a490: 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
a4a0: 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
a4b0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
a4c0: 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
a4d0: 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
a4e0: 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
a4f0: 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65  *sqlite3ResultSe
a500: 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
a510: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
a520: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
a530: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
a540: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
a550: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65  ->db;.  int save
a560: 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64  dFlags;..  saved
a570: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
a580: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  s;.  db->flags &
a590: 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  = ~SQLITE_FullCo
a5a0: 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c  lNames;.  db->fl
a5b0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
a5c0: 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73  ortColNames;.  s
a5d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
a5e0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
a5f0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , 0);.  if( pPar
a600: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
a610: 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  n 0;.  while( pS
a620: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20  elect->pPrior ) 
a630: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
a640: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d  t->pPrior;.  db-
a650: 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c  >flags = savedFl
a660: 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ags;.  pTab = sq
a670: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
a680: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
a690: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
a6a0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
a6b0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
a6c0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70 54 61  ->db = db;.  pTa
a6d0: 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  b->nRef = 1;.  p
a6e0: 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  Tab->zName = 0;.
a6f0: 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
a700: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
a710: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
a720: 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
a730: 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
a740: 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d    selectAddColum
a750: 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
a760: 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  n(pParse, pTab->
a770: 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  nCol, pTab->aCol
a780: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54  , pSelect);.  pT
a790: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
a7a0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
a7b0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
a7c0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
a7d0: 28 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75  (pTab);.    retu
a7e0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
a7f0: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
a800: 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
a810: 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
a820: 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
a830: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
a840: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
a850: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
a860: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
a870: 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
a880: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
a890: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
a8a0: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
a8b0: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
a8c0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
a8d0: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
a8e0: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
a8f0: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dbe = sqlite3Vdb
a900: 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e  eCreate(pParse->
a910: 64 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  db);.#ifndef SQL
a920: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
a930: 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20     if( v ){.    
a940: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a950: 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63 65 29  Op0(v, OP_Trace)
a960: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
a970: 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d   }.  return v;.}
a980: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
a990: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
a9a0: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
a9b0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
a9c0: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
a9d0: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
a9e0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
a9f0: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
aa00: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
aa10: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
aa20: 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
aa30: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
aa40: 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
aa50: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
aa60: 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
aa70: 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
aa80: 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
aa90: 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
aaa0: 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
aab0: 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
aac0: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
aad0: 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
aae0: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
aaf0: 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
ab00: 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
ab10: 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
ab20: 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
ab30: 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
ab40: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
ab50: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
ab60: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
ab70: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
ab80: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
ab90: 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
aba0: 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
abb0: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
abc0: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
abd0: 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
abe0: 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
abf0: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
ac00: 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
ac10: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a   default values.
ac20: 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20  ** (usually but 
ac30: 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70  not always -1) p
ac40: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
ac50: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
ac60: 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21   Only if pLimit!
ac70: 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30  =0 or pOffset!=0
ac80: 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
ac90: 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
aca0: 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
acb0: 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
acc0: 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
acd0: 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
ace0: 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
acf0: 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
ad00: 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
ad10: 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
ad20: 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
ad30: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
ad40: 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
ad50: 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
ad60: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
ad70: 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61  ct *p, int iBrea
ad80: 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  k){.  Vdbe *v = 
ad90: 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  0;.  int iLimit 
ada0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73  = 0;.  int iOffs
adb0: 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b  et;.  int addr1;
adc0: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
add0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
ade0: 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31   .  ** "LIMIT -1
adf0: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
ae00: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
ae10: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
ae20: 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20 77  traversy about w
ae30: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
ae40: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
ae50: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
ae60: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
ae70: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
ae80: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
ae90: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
aea0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
aeb0: 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c  mit ){.    p->iL
aec0: 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20  imit = iLimit = 
aed0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
aee0: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
aef0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
af00: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
af10: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
af20: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
af30: 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c  e, p->pLimit, iL
af40: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
af50: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
af60: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c  OP_MustBeInt, iL
af70: 69 6d 69 74 29 3b 0a 20 20 20 20 56 64 62 65 43  imit);.    VdbeC
af80: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
af90: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
afa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
afb0: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op2(v, OP_IfZero
afc0: 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  , iLimit, iBreak
afd0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
afe0: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70  pOffset ){.    p
aff0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  ->iOffset = iOff
b000: 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
b010: 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d  nMem;.    if( p-
b020: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
b030: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
b040: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
b050: 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
b060: 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
b070: 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 76  t */.    }.    v
b080: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
b090: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
b0a0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
b0b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
b0c0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
b0d0: 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65  >pOffset, iOffse
b0e0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
b0f0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b100: 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
b110: 65 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  et);.    VdbeCom
b120: 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54  ment((v, "OFFSET
b130: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
b140: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
b150: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
b160: 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 29  _IfPos, iOffset)
b170: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b180: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
b190: 74 65 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65  teger, 0, iOffse
b1a0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
b1b0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
b1c0: 64 64 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70  ddr1);.    if( p
b1d0: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
b1e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b1f0: 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69  Op3(v, OP_Add, i
b200: 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20  Limit, iOffset, 
b210: 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
b220: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
b230: 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  , "LIMIT+OFFSET"
b240: 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20  ));.      addr1 
b250: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
b260: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
b270: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
b280: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b290: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
b2a0: 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b   -1, iOffset+1);
b2b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b2c0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
b2d0: 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  dr1);.    }.  }.
b2e0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
b2f0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
b300: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
b310: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
b320: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
b330: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
b340: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
b350: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
b360: 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
b370: 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
b380: 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
b390: 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
b3a0: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
b3b0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
b3c0: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
b3d0: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
b3e0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
b3f0: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
b400: 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
b410: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
b420: 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
b430: 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
b440: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
b450: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
b460: 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
b470: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
b480: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
b490: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
b4a0: 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
b4b0: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
b4c0: 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
b4d0: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
b4e0: 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
b4f0: 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
b500: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
b510: 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30   }.  if( pRet==0
b520: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73   ){.    pRet = s
b530: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
b540: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  q(pParse, p->pEL
b550: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
b560: 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  pr);.  }.  retur
b570: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n pRet;.}.#endif
b580: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
b590: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
b5a0: 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  */../* Forward r
b5b0: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
b5c0: 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
b5d0: 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ctOrderBy(.  Par
b5e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b5f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
b600: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
b610: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
b620: 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
b630: 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
b640: 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
b650: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
b660: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
b670: 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
b680: 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69  sults */.);...#i
b690: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b6a0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
b6b0: 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  T./*.** This rou
b6c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
b6d0: 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70  o process a comp
b6e0: 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20  ound query form 
b6f0: 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d  from.** two or m
b700: 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65  ore separate que
b710: 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e  ries using UNION
b720: 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43  , UNION ALL, EXC
b730: 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52  EPT, or.** INTER
b740: 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70  SECT.**.** "p" p
b750: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67  oints to the rig
b760: 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ht-most of the t
b770: 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65  wo queries.  the
b780: 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a   query on the.**
b790: 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69   left is p->pPri
b7a0: 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75  or.  The left qu
b7b0: 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62  ery could also b
b7c0: 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
b7d0: 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63  ry.** in which c
b7e0: 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
b7f0: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
b800: 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a  recursively. .**
b810: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
b820: 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  of the total que
b830: 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69  ry are to be wri
b840: 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74  tten into a dest
b850: 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79  ination.** of ty
b860: 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61  pe eDest with pa
b870: 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
b880: 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
b890: 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65   Consider a thre
b8a0: 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53  e-way compound S
b8b0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
b8c0: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
b8d0: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
b8e0: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20  ELECT b FROM t2 
b8f0: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
b900: 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69  ROM t3.**.** Thi
b910: 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  s statement is p
b920: 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c  arsed up as foll
b930: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ows:.**.**     S
b940: 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
b950: 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20  **      |.**    
b960: 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43    `----->  SELEC
b970: 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20  T b FROM t2.**  
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
b990: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
b9a0: 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45    `------>  SELE
b9b0: 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a  CT a FROM t1.**.
b9c0: 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e  ** The arrows in
b9d0: 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f   the diagram abo
b9e0: 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ve represent the
b9f0: 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70   Select.pPrior p
ba00: 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66  ointer..** So if
ba10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
ba20: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65   called with p e
ba30: 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71  qual to the t3 q
ba40: 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50  uery, then.** pP
ba50: 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65  rior will be the
ba60: 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f   t2 query.  p->o
ba70: 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49  p will be TK_UNI
ba80: 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ON in this case.
ba90: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68  .**.** Notice th
baa0: 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  at because of th
bab0: 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72  e way SQLite par
bac0: 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ses compound SEL
bad0: 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64  ECTs, the.** ind
bae0: 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20  ividual selects 
baf0: 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f  always group fro
bb00: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
bb10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
bb20: 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61  ultiSelect(.  Pa
bb30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
bb40: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
bb50: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
bb60: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
bb70: 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
bb80: 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
bb90: 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
bba0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
bbb0: 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
bbc0: 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
bbd0: 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
bbe0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bbf0: 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20  K;   /* Success 
bc00: 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
bc10: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
bc20: 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
bc30: 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
bc40: 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
bc50: 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
bc60: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
bc70: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
bc80: 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
bc90: 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
bca0: 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
bcb0: 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64  /* Alternative d
bcc0: 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ata destination 
bcd0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65  */.  Select *pDe
bce0: 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68  lete = 0;  /* Ch
bcf0: 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65  ain of simple se
bd00: 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20  lects to delete 
bd10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
bd20: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
bd30: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
bd40: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  n */..  /* Make 
bd50: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
bd60: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
bd70: 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
bd80: 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
bd90: 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
bda0: 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
bdb0: 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
bdc0: 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
bdd0: 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
bde0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
bdf0: 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29  p && p->pPrior )
be00: 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75  ;  /* Calling fu
be10: 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65  nction guarantee
be20: 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20  s this much */. 
be30: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
be40: 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ;.  pPrior = p->
be50: 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74  pPrior;.  assert
be60: 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74  ( pPrior->pRight
be70: 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a  most!=pPrior );.
be80: 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
be90: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d  ->pRightmost==p-
bea0: 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20  >pRightmost );. 
beb0: 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a   dest = *pDest;.
bec0: 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f    if( pPrior->pO
bed0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
bee0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
bef0: 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63  arse,"ORDER BY c
bf00: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
bf10: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
bf20: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
bf30: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
bf40: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
bf50: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
bf60: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
bf70: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
bf80: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
bf90: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
bfa0: 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  e,"LIMIT clause 
bfb0: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
bfc0: 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
bfd0: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
bfe0: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
bff0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
c000: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c010: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20  end;.  }..  v = 
c020: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
c030: 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
c040: 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68  ( v!=0 );  /* Th
c050: 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63  e VDBE already c
c060: 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e  reated by callin
c070: 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
c080: 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64   /* Create the d
c090: 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f  estination tempo
c0a0: 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65  rary table if ne
c0b0: 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69  cessary.  */.  i
c0c0: 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
c0d0: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
c0e0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
c0f0: 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  List );.    sqli
c100: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c110: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
c120: 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c 20 70  l, dest.iParm, p
c130: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
c140: 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74  ;.    dest.eDest
c150: 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20   = SRT_Table;.  
c160: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
c170: 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e  e all SELECTs in
c180: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
c190: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
c1a0: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a  ber of elements.
c1b0: 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65    ** in their re
c1c0: 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a  sult sets..  */.
c1d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
c1e0: 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
c1f0: 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  EList );.  if( p
c200: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
c210: 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
c220: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
c230: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
c240: 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74  arse, "SELECTs t
c250: 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
c260: 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20  ight of %s".    
c270: 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20    " do not have 
c280: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
c290: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
c2a0: 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  s", selectOpName
c2b0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
c2c0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
c2d0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c2e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f  .  }..  /* Compo
c2f0: 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74  und SELECTs that
c300: 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
c310: 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e  Y clause are han
c320: 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  dled separately.
c330: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
c340: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72  OrderBy ){.    r
c350: 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
c360: 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c  tOrderBy(pParse,
c370: 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a   p, pDest);.  }.
c380: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
c390: 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74  ode for the left
c3a0: 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43   and right SELEC
c3b0: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
c3c0: 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  */.  switch( p->
c3d0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
c3e0: 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  K_ALL: {.      i
c3f0: 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
c400: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
c410: 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
c420: 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d      pPrior->pLim
c430: 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
c440: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f        pPrior->pO
c450: 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
c460: 65 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  et;.      rc = s
c470: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
c480: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
c490: 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  st);.      p->pL
c4a0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
c4b0: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
c4c0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
c4d0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
c4e0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c4f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
c500: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
c510: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
c520: 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
c530: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
c540: 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
c550: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  ;.      if( p->i
c560: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
c570: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
c580: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
c590: 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  IfZero, p->iLimi
c5a0: 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  t);.        Vdbe
c5b0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d  Comment((v, "Jum
c5c0: 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54  p ahead if LIMIT
c5d0: 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20   reached"));.   
c5e0: 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
c5f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
c600: 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
c610: 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
c620: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
c630: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
c640: 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
c650: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
c660: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c670: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
c680: 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20     if( addr ){. 
c690: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c6a0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
c6b0: 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dr);.      }.   
c6c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c6d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
c6e0: 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  PT:.    case TK_
c6f0: 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  UNION: {.      i
c700: 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20  nt unionTab;    
c710: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
c720: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
c730: 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  y table holding 
c740: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
c750: 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  u8 op = 0;      
c760: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
c770: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
c780: 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
c790: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  */.      int pri
c7a0: 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
c7b0: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
c7c0: 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
c7d0: 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20  r selects */.   
c7e0: 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
c7f0: 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61   *pOffset; /* Sa
c800: 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d  ved values of p-
c810: 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e  >nLimit and p->n
c820: 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  Offset */.      
c830: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
c840: 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e  SelectDest union
c850: 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 70 72 69  dest;..      pri
c860: 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e  orOp = SRT_Union
c870: 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
c880: 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20  .eDest==priorOp 
c890: 26 26 20 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26  && !p->pLimit &&
c8a0: 20 21 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a   !p->pOffset ){.
c8b0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
c8c0: 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
c8d0: 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
c8e0: 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
c8f0: 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
c900: 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
c910: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
c920: 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 50 61 72  nTab = dest.iPar
c930: 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
c940: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
c950: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
c960: 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
c970: 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
c980: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
c990: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
c9a0: 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
c9b0: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
c9c0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
c9d0: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b++;.        ass
c9e0: 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
c9f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
ca00: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
ca10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
ca20: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69  enEphemeral, uni
ca30: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
ca40: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
ca50: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
ca60: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
ca70: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
ca80: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
ca90: 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d    p->pRightmost-
caa0: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
cab0: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
cac0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
cad0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
cae0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
caf0: 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
cb00: 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
cb10: 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
cb20: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
cb30: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  ior->pOrderBy );
cb40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
cb50: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e  lectDestInit(&un
cb60: 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70  iondest, priorOp
cb70: 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20  , unionTab);.   
cb80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
cb90: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
cba0: 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74  rior, &uniondest
cbb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
cbc0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
cbd0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
cbe0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
cbf0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
cc00: 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
cc10: 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
cc20: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
cc30: 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20  TK_EXCEPT ){.   
cc40: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78       op = SRT_Ex
cc50: 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  cept;.      }els
cc60: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
cc70: 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  t( p->op==TK_UNI
cc80: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  ON );.        op
cc90: 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
cca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
ccb0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
ccc0: 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
ccd0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
cce0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
ccf0: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
cd00: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
cd10: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
cd20: 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73    uniondest.eDes
cd30: 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 72 63  t = op;.      rc
cd40: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
cd50: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69  (pParse, p, &uni
cd60: 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 2f  ondest);.      /
cd70: 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
cd80: 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
cd90: 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
cda0: 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
cdb0: 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
cdc0: 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
cdd0: 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
cde0: 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
cdf0: 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
ce00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
ce10: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
ce20: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
ce30: 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
ce40: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
ce50: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
ce60: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
ce70: 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  By = 0;.      sq
ce80: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
ce90: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
cea0: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
ceb0: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
cec0: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
ced0: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  fset;.      p->i
cee0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
cef0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
cf00: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
cf10: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
cf20: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
cf30: 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20        }...      
cf40: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
cf50: 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
cf60: 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
cf70: 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
cf80: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
cf90: 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
cfa0: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20  eed..      */   
cfb0: 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 64 65     .      if( de
cfc0: 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
cfd0: 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 64  p || unionTab!=d
cfe0: 65 73 74 2e 69 50 61 72 6d 20 29 7b 0a 20 20 20  est.iParm ){.   
cff0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
d000: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
d010: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d020: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
d030: 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
d040: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
d050: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  ){.          Sel
d060: 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
d070: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
d080: 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
d090: 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
d0a0: 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
d0b0: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
d0c0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
d0d0: 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
d0e0: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ist);.        }.
d0f0: 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
d100: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d110: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
d120: 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
d130: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
d140: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  );.        compu
d150: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
d160: 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
d170: 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
d180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d190: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69  , OP_Rewind, uni
d1a0: 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a  onTab, iBreak);.
d1b0: 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
d1c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d1d0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
d1e0: 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
d1f0: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
d200: 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54  ->pEList, unionT
d210: 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ab, p->pEList->n
d220: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
d240: 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e   -1, &dest, iCon
d250: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
d260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
d270: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
d280: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
d290: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d2a0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
d2b0: 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a  onTab, iStart);.
d2c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d2d0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
d2e0: 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
d2f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d300: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
d310: 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
d320: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
d330: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d340: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
d350: 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  T: {.      int t
d360: 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
d370: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
d380: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
d390: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
d3a0: 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  *pOffset;.      
d3b0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
d3c0: 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72  SelectDest inter
d3d0: 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20  sectdest;.      
d3e0: 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f  int r1;..      /
d3f0: 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
d400: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
d410: 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
d420: 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
d430: 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
d440: 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
d450: 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
d460: 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
d470: 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
d480: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
d490: 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
d4a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
d4b0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
d4c0: 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
d4d0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
d4e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
d4f0: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
d500: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
d510: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d520: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
d530: 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ral, tab1, 0);. 
d540: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
d550: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
d560: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
d570: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
d580: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
d590: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73  p->pRightmost->s
d5a0: 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
d5b0: 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  esEphemeral;.   
d5c0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
d5d0: 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f  List );..      /
d5e0: 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
d5f0: 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69  Ts to our left i
d600: 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
d610: 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20  ble "tab1"..    
d620: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
d630: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
d640: 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c  (&intersectdest,
d650: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31   SRT_Union, tab1
d660: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
d670: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
d680: 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
d690: 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
d6a0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
d6b0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
d6c0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
d6d0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
d6e0: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
d6f0: 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
d700: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
d710: 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
d720: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
d730: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d740: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
d750: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
d760: 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
d770: 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
d780: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
d790: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
d7a0: 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
d7b0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
d7c0: 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
d7d0: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
d7e0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
d7f0: 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
d800: 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
d810: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
d820: 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 50  intersectdest.iP
d830: 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20  arm = tab2;.    
d840: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
d850: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
d860: 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
d870: 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
d880: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
d890: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
d8a0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rior;.      sqli
d8b0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
d8c0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
d8d0: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
d8e0: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
d8f0: 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
d900: 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  et;.      if( rc
d910: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
d920: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
d930: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
d940: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
d950: 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69  de to take the i
d960: 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
d970: 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  he two temporary
d980: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  .      ** tables
d990: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d9a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
d9b0: 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  st );.      if( 
d9c0: 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
d9d0: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
d9e0: 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
d9f0: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68   = p;.        wh
da00: 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
da10: 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
da20: 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
da30: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
da40: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
da50: 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
da60: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
da70: 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
da80: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
da90: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
daa0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
dab0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
dac0: 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
dad0: 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
dae0: 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
daf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
db00: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
db10: 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b  nd, tab1, iBreak
db20: 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
db30: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
db40: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
db50: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
db60: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
db70: 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31  RowKey, tab1, r1
db80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
db90: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
dba0: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
dbb0: 20 69 43 6f 6e 74 2c 20 72 31 29 3b 0a 20 20 20   iCont, r1);.   
dbc0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
dbd0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
dbe0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65   r1);.      sele
dbf0: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
dc00: 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
dc10: 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73  , tab1, p->pELis
dc20: 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc40: 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43  0, -1, &dest, iC
dc50: 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
dc60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
dc70: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
dc80: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
dc90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
dca0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
dcb0: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
dcc0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
dcd0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
dce0: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
dcf0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
dd00: 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
dd10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
dd20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
dd30: 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29  _Close, tab1, 0)
dd40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
dd50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
dd60: 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
dd70: 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
dd80: 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  by .  ** tempora
dd90: 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64  ry tables needed
dda0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
ddb0: 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
ddc0: 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74  t..  ** Attach t
ddd0: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
dde0: 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70  ture to all temp
ddf0: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20  orary tables..  
de00: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63  **.  ** This sec
de10: 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74  tion is run by t
de20: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45  he right-most SE
de30: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
de40: 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54  nly..  ** SELECT
de50: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74   statements to t
de60: 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73  he left always s
de70: 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20  kip this part.  
de80: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  The right-most. 
de90: 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74   ** SELECT might
dea0: 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20   also skip this 
deb0: 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e  part if it has n
dec0: 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
ded0: 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65  e and.  ** no te
dee0: 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65  mp tables are re
def0: 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  quired..  */.  i
df00: 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
df10: 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
df20: 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  l ){.    int i; 
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
df50: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65  ounter */.    Ke
df60: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
df70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
df80: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
df90: 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  e for the result
dfa0: 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65   set */.    Sele
dfb0: 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  ct *pLoop;      
dfc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
dfd0: 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
dfe0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
dff0: 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65  ts */.    CollSe
e000: 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20  q **apColl;     
e010: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
e020: 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70  ooping through p
e030: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d  KeyInfo->aColl[]
e040: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
e050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e060: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e070: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  of columns in re
e080: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20  sult set */..   
e090: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
e0a0: 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
e0b0: 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73   nCol = p->pELis
e0c0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b  t->nExpr;.    pK
e0d0: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
e0e0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
e0f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e100: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
e110: 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 28  pKeyInfo)+nCol*(
e120: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
e130: 20 2b 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20   + 1));.    if( 
e140: 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
e150: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
e160: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
e170: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
e180: 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b  d;.    }..    pK
e190: 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e  eyInfo->enc = EN
e1a0: 43 28 64 62 29 3b 0a 20 20 20 20 70 4b 65 79 49  C(db);.    pKeyI
e1b0: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75  nfo->nField = (u
e1c0: 31 36 29 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f  16)nCol;..    fo
e1d0: 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
e1e0: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
e1f0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
e200: 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
e210: 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
e220: 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
e230: 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
e240: 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
e250: 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
e260: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
e270: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e280: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
e290: 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
e2a0: 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
e2b0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e2c0: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
e2d0: 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
e2e0: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
e2f0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
e300: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
e310: 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
e320: 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
e330: 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
e340: 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
e350: 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
e360: 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
e370: 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
e380: 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
e390: 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
e3a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
e3b0: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
e3c0: 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
e3d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
e3e0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
e3f0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
e400: 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
e410: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e420: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
e430: 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49  dr, (char*)pKeyI
e440: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
e450: 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
e460: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
e470: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
e480: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
e490: 44 62 46 72 65 65 28 64 62 2c 20 70 4b 65 79 49  DbFree(db, pKeyI
e4a0: 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69  nfo);.  }..multi
e4b0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70  _select_end:.  p
e4c0: 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 64 65 73  Dest->iMem = des
e4d0: 74 2e 69 4d 65 6d 3b 0a 20 20 70 44 65 73 74 2d  t.iMem;.  pDest-
e4e0: 3e 6e 4d 65 6d 20 3d 20 64 65 73 74 2e 6e 4d 65  >nMem = dest.nMe
e4f0: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
e500: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  ctDelete(db, pDe
e510: 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  lete);.  return 
e520: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
e530: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
e540: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
e550: 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75  /*.** Code an ou
e560: 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
e570: 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  for a coroutine 
e580: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
e590: 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  f a.** SELECT st
e5a0: 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  atment..**.** Th
e5b0: 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74  e data to be out
e5c0: 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  put is contained
e5d0: 20 69 6e 20 70 49 6e 2d 3e 69 4d 65 6d 2e 20 20   in pIn->iMem.  
e5e0: 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e  There are.** pIn
e5f0: 2d 3e 6e 4d 65 6d 20 63 6f 6c 75 6d 6e 73 20 74  ->nMem columns t
e600: 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44  o be output.  pD
e610: 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65  est is where the
e620: 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a   output should.*
e630: 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a  * be sent..**.**
e640: 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68   regReturn is th
e650: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
e660: 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
e670: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a   the subroutine.
e680: 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ** return addres
e690: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50  s..**.** If regP
e6a0: 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73  rev>0 then it is
e6b0: 20 61 20 74 68 65 20 66 69 72 73 74 20 72 65 67   a the first reg
e6c0: 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f  ister in a vecto
e6d0: 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64  r that.** record
e6e0: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f  s the previous o
e6f0: 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50  utput.  mem[regP
e700: 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74  rev] is a flag t
e710: 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20  hat is false.** 
e720: 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  if there has bee
e730: 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75  n no previous ou
e740: 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65  tput.  If regPre
e750: 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  v>0 then code is
e760: 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f  .** generated to
e770: 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   suppress duplic
e780: 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20  ates.  pKeyInfo 
e790: 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70  is used for comp
e7a0: 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a  aring.** keys..*
e7b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49  *.** If the LIMI
e7c0: 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c  T found in p->iL
e7d0: 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c  imit is reached,
e7e0: 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
e7f0: 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a  y to.** iBreak..
e800: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
e810: 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
e820: 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20  outine(.  Parse 
e830: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
e840: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
e850: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
e860: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
e870: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
e880: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
e890: 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20  electDest *pIn, 
e8a0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74         /* Corout
e8b0: 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61  ine supplying da
e8c0: 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
e8d0: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
e8e0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64  /* Where to send
e8f0: 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   the data */.  i
e900: 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20  nt regReturn,   
e910: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
e920: 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
e930: 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
e940: 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20  egPrev,         
e950: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
e960: 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20  esult register. 
e970: 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69   No uniqueness i
e980: 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  f 0 */.  KeyInfo
e990: 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
e9a0: 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e   /* For comparin
e9b0: 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20  g with previous 
e9c0: 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70  entry */.  int p
e9d0: 34 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  4type,          
e9e0: 20 20 20 2f 2a 20 54 68 65 20 70 34 20 74 79 70     /* The p4 typ
e9f0: 65 20 66 6f 72 20 70 4b 65 79 49 6e 66 6f 20 2a  e for pKeyInfo *
ea00: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
ea20: 75 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68  ump here if we h
ea30: 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a  it the LIMIT */.
ea40: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
ea50: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
ea60: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20  int iContinue;. 
ea70: 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64   int addr;..  ad
ea80: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
ea90: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
eaa0: 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71    iContinue = sq
eab0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
eac0: 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70  el(v);..  /* Sup
ead0: 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
eae0: 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45   for UNION, EXCE
eaf0: 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43  PT, and INTERSEC
eb00: 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  T .  */.  if( re
eb10: 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74  gPrev ){.    int
eb20: 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20   j1, j2;.    j1 
eb30: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
eb40: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
eb50: 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 6a   regPrev);.    j
eb60: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
eb70: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
eb80: 61 72 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  are, pIn->iMem, 
eb90: 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
eba0: 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  nMem,.          
ebb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebc0: 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
ebd0: 6e 66 6f 2c 20 70 34 74 79 70 65 29 3b 0a 20 20  nfo, p4type);.  
ebe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ebf0: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
ec00: 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  j2+2, iContinue,
ec10: 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69   j2+2);.    sqli
ec20: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
ec30: 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69  v, j1);.    sqli
ec40: 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
ec50: 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65  pParse, pIn->iMe
ec60: 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  m, regPrev+1, pI
ec70: 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 73 71  n->nMem);.    sq
ec80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ec90: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
eca0: 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a  , regPrev);.  }.
ecb0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
ecc0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ecd0: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
ece0: 20 53 75 70 70 72 65 73 73 20 74 68 65 20 74 68   Suppress the th
ecf0: 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65  e first OFFSET e
ed00: 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20  ntries if there 
ed10: 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  is an OFFSET cla
ed20: 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f  use.  */.  codeO
ed30: 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e  ffset(v, p, iCon
ed40: 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74 63  tinue);..  switc
ed50: 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20  h( pDest->eDest 
ed60: 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ){.    /* Store 
ed70: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
ed80: 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
ed90: 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
eda0: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
edb0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
edc0: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
edd0: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
ede0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
edf0: 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  se);.      int r
ee00: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
ee10: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
ee20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ee30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
ee40: 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d  eRecord, pIn->iM
ee50: 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 20 72  em, pIn->nMem, r
ee60: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
ee70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ee80: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73  P_NewRowid, pDes
ee90: 74 2d 3e 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  t->iParm, r2);. 
eea0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
eeb0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
eec0: 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  ert, pDest->iPar
eed0: 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
eee0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
eef0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
ef00: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73  APPEND);.      s
ef10: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
ef20: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
ef30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
ef40: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
ef50: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
ef60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
ef70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ef80: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
ef90: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
efa0: 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
efb0: 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
efc0: 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
efd0: 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  uct,.    ** then
efe0: 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   there should be
eff0: 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f   a single item o
f000: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72  n the stack.  Wr
f010: 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ite this.    ** 
f020: 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
f030: 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
f040: 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  us data..    */.
f050: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
f060: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
f070: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f080: 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a  pIn->nMem==1 );.
f090: 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69 74        p->affinit
f0a0: 79 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71  y = .         sq
f0b0: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
f0c0: 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e  nity(p->pEList->
f0d0: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73  a[0].pExpr, pDes
f0e0: 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20  t->affinity);.  
f0f0: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
f100: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
f110: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
f120: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
f130: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
f140: 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72 31 2c 20  n->iMem, 1, r1, 
f150: 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29  &p->affinity, 1)
f160: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
f170: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
f180: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
f190: 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20  In->iMem, 1);.  
f1a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f1b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
f1c0: 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50  nsert, pDest->iP
f1d0: 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
f1e0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
f1f0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
f200: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f210: 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a      }..#if 0  /*
f220: 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e   Never occurs on
f230: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65   an ORDER BY que
f240: 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  ry */.    /* If 
f250: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
f260: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
f270: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
f280: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
f290: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
f2a0: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
f2b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f2c0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
f2d0: 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  , 1, pDest->iPar
f2e0: 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
f2f0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
f300: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
f310: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
f320: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f330: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
f340: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
f350: 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
f360: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
f370: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
f380: 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
f390: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
f3a0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
f3b0: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
f3c0: 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
f3d0: 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
f3e0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
f3f0: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
f400: 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d   assert( pIn->nM
f410: 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  em==1 );.      s
f420: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
f430: 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
f440: 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69 50 61  iMem, pDest->iPa
f450: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a  rm, 1);.      /*
f460: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
f470: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
f480: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
f490: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
f4a0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
f4b0: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
f4c0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
f4d0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  */..    /* The r
f4e0: 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
f4f0: 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
f500: 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
f510: 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
f520: 70 44 65 73 74 2d 3e 69 4d 65 6d 2e 20 20 54 68  pDest->iMem.  Th
f530: 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  en the co-routin
f540: 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f  e yields..    */
f550: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
f560: 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20  routine: {.     
f570: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d   if( pDest->iMem
f580: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
f590: 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c  Dest->iMem = sql
f5a0: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
f5b0: 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d  (pParse, pIn->nM
f5c0: 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  em);.        pDe
f5d0: 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e  st->nMem = pIn->
f5e0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nMem;.      }.  
f5f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
f600: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
f610: 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74  pIn->iMem, pDest
f620: 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 6e  ->iMem, pDest->n
f630: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
f640: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
f650: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
f660: 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  ->iParm);.      
f670: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
f680: 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 61 72 65    /* Results are
f690: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
f6a0: 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
f6b0: 72 73 2e 20 20 54 68 65 6e 20 74 68 65 0a 20 20  rs.  Then the.  
f6c0: 20 20 2a 2a 20 4f 50 5f 52 65 73 75 6c 74 52 6f    ** OP_ResultRo
f6d0: 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64  w opcode is used
f6e0: 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65   to cause sqlite
f6f0: 33 5f 73 74 65 70 28 29 20 74 6f 20 72 65 74 75  3_step() to retu
f700: 72 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 65  rn.    ** the ne
f710: 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  xt row of result
f720: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
f730: 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a  e SRT_Output: {.
f740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f750: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
f760: 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d  sultRow, pIn->iM
f770: 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a  em, pIn->nMem);.
f780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f790: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
f7a0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
f7b0: 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65  ->iMem, pIn->nMe
f7c0: 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
f7d0: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  .    }..#if !def
f7e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f7f0: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a  _TRIGGER).    /*
f800: 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73   Discard the res
f810: 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75  ults.  This is u
f820: 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73  sed for SELECT s
f830: 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65  tatements inside
f840: 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79  .    ** the body
f850: 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20   of a TRIGGER.  
f860: 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73  The purpose of s
f870: 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74  uch selects is t
f880: 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73  o call.    ** us
f890: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
f8a0: 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73  ions that have s
f8b0: 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65  ide effects.  We
f8c0: 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20   do not care.   
f8d0: 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63   ** about the ac
f8e0: 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20  tual results of 
f8f0: 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20  the select..    
f900: 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
f910: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
f920: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
f930: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
f940: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
f950: 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
f960: 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
f970: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
f980: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
f990: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
f9a0: 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74  ddImm, p->iLimit
f9b0: 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
f9c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f9d0: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
f9e0: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  imit, iBreak);. 
f9f0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
fa00: 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  e the subroutine
fa10: 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
fa20: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
fa30: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69  eLabel(v, iConti
fa40: 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nue);.  sqlite3V
fa50: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
fa60: 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72  Return, regRetur
fa70: 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64  n);..  return ad
fa80: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74  dr;.}../*.** Alt
fa90: 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e  ernative compoun
faa0: 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65  d select code ge
fab0: 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65  nerator for case
fac0: 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  s when there.** 
fad0: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
fae0: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  lause..**.** We 
faf0: 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f  assume a query o
fb00: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
fb10: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
fb20: 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65   <selectA>  <ope
fb30: 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42  rator>  <selectB
fb40: 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64  >  ORDER BY <ord
fb50: 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20  erbylist>.**.** 
fb60: 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e  <operator> is on
fb70: 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  e of UNION ALL, 
fb80: 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
fb90: 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68  r INTERSECT.  Th
fba0: 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20  e idea.** is to 
fbb0: 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63  code both <selec
fbc0: 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42  tA> and <selectB
fbd0: 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  > with the ORDER
fbe0: 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a   BY clause as.**
fbf0: 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54   co-routines.  T
fc00: 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72  hen run the co-r
fc10: 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c  outines in paral
fc20: 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68  lel and merge th
fc30: 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
fc40: 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49  o the output.  I
fc50: 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
fc60: 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
fc70: 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41   (called selectA
fc80: 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29   and.** selectB)
fc90: 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62   there are 7 sub
fca0: 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20  routines:.**.** 
fcb0: 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65     outA:    Move
fcc0: 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
fcd0: 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75  he selectA corou
fce0: 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
fcf0: 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
fd00: 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
fd10: 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  und query..**.**
fd20: 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76      outB:    Mov
fd30: 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
fd40: 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f  the selectB coro
fd50: 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
fd60: 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
fd70: 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
fd80: 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e  ound query.  (On
fd90: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  ly generated for
fda0: 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20   UNION and.**   
fdb0: 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
fdc0: 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64  ALL.  EXCEPT and
fdd0: 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65   INSERTSECT neve
fde0: 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74  r output a row t
fdf0: 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
fe00: 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20     appears only 
fe10: 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  in B.).**.**    
fe20: 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AltB:    Called 
fe30: 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
fe40: 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
fe50: 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e  outines and A<B.
fe60: 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  .**.**    AeqB: 
fe70: 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
fe80: 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
fe90: 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
fea0: 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a  s and A==B..**.*
feb0: 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61  *    AgtB:    Ca
fec0: 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
fed0: 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
fee0: 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
fef0: 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45   A>B..**.**    E
ff00: 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofA:    Called w
ff10: 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
ff20: 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
ff30: 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  tA..**.**    Eof
ff40: 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
ff50: 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
ff60: 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42  ted from selectB
ff70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
ff80: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
ff90: 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75  e latter five su
ffa0: 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64  broutines depend
ffb0: 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f   on which .** <o
ffc0: 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64  perator> is used
ffd0: 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  :.**.**.**      
ffe0: 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
fff0: 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20           UNION  
10000 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54            EXCEPT
10010 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53            INTERS
10020 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
10030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
10040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10050 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
10060 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
10070 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20  ---.**   AltB:  
10080 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
10090 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
100a0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
100b0 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a          nextA.**
100c0 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75  .**   AeqB:   ou
100d0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
100e0 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
100f0 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
10100 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a    outA, nextA.**
10110 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75  .**   AgtB:   ou
10120 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
10130 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
10140 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20      nextB       
10150 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a       nextB.**.**
10160 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c     EofA:   outB,
10170 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
10180 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
10190 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20   halt           
101a0 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45    halt.**.**   E
101b0 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ofB:   outA, nex
101c0 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
101d0 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
101e0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61  nextA         ha
101f0 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  lt.**.** In the 
10200 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20  AltB, AeqB, and 
10210 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73  AgtB subroutines
10220 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f  , an EOF on A fo
10230 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a  llowing nextA.**
10240 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64   causes an immed
10250 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
10260 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20  A and an EOF on 
10270 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  B following next
10280 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69  B causes.** an i
10290 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
102a0 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45   EofB.  Within E
102b0 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e  ofA and EofB, an
102c0 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f  d EOF on entry o
102d0 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  r.** following n
102e0 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75  extX causes a ju
102f0 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
10300 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63   the select proc
10310 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75  essing..**.** Du
10320 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
10330 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58  in the UNION, EX
10340 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
10350 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e  ECT cases is han
10360 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  dled.** within t
10370 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
10380 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72  tine.  The regPr
10390 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20  ev register set 
103a0 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f  holds the previo
103b0 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76  usly.** output v
103c0 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69  alue.  A compari
103d0 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69  son is made agai
103e0 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61  nst this value a
103f0 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
10400 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
10410 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20  he next results 
10420 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  would be the sam
10430 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  e as the previou
10440 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  s..**.** The imp
10450 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e  lementation plan
10460 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74   is to implement
10470 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
10480 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a  nes and seven.**
10490 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72   subroutines fir
104a0 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65  st, then put the
104b0 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61   control logic a
104c0 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c  t the bottom.  L
104d0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
104e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e           goto In
104f0 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63  it.**     coA: c
10500 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
10510 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20  t query (A).**  
10520 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e     coB: coroutin
10530 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72  e for right quer
10540 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41  y (B).**    outA
10550 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
10560 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42   of A.**    outB
10570 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
10580 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64   of B (UNION and
10590 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29   UNION ALL only)
105a0 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e  .**    EofA: ...
105b0 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e  .**    EofB: ...
105c0 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e  .**    AltB: ...
105d0 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e  .**    AeqB: ...
105e0 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e  .**    AgtB: ...
105f0 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69  .**    Init: ini
10600 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e  tialize coroutin
10610 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20  e registers.**  
10620 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
10630 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  A.**          if
10640 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66   eof(A) goto Eof
10650 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  A.**          yi
10660 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20  eld coB.**      
10670 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f      if eof(B) go
10680 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d  to EofB.**    Cm
10690 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42  pr: Compare A, B
106a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d  .**          Jum
106b0 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  p AltB, AeqB, Ag
106c0 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e  tB.**     End: .
106d0 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c  ...**.** We call
106e0 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
106f0 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66  B, EofA, and Eof
10700 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20  B "subroutines" 
10710 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74  but they are not
10720 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c  .** actually cal
10730 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20  led using Gosub 
10740 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  and they do not 
10750 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e  Return.  EofA an
10760 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75  d EofB loop.** u
10770 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73  ntil all data is
10780 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20   exhausted then 
10790 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64  jump to the "end
107a0 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41  " labe.  AltB, A
107b0 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42  eqB,.** and AgtB
107c0 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20   jump to either 
107d0 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20  L2 or to one of 
107e0 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f  EofA or EofB..*/
107f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10800 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
10810 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20  LECT.static int 
10820 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
10830 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
10840 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
10850 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
10860 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
10870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10880 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
10890 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
108a0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
108b0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
108c0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
108d0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
108e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10900 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
10910 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
10920 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
10930 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
10940 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
10950 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10970 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
10980 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
10990 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
109a0 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  A;     /* Destin
109b0 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
109c0 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63  ine A */.  Selec
109d0 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20  tDest destB;    
109e0 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
109f0 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20  for coroutine B 
10a00 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
10a10 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
10a20 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
10a30 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  or select-A coro
10a40 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
10a50 65 67 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20  egEofA;         
10a60 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69   /* Flag to indi
10a70 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74  cate when select
10a80 2d 41 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a  -A is complete *
10a90 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42  /.  int regAddrB
10aa0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
10ab0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
10ac0 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  r select-B corou
10ad0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
10ae0 67 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 20  gEofB;          
10af0 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63  /* Flag to indic
10b00 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d  ate when select-
10b10 42 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f  B is complete */
10b20 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
10b30 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tA;      /* Addr
10b40 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
10b50 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
10b60 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
10b70 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tB;      /* Addr
10b80 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
10b90 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
10ba0 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20  .  int regOutA; 
10bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
10bc0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
10bd0 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
10be0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
10bf0 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20  t regOutB;      
10c00 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
10c10 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
10c20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
10c30 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
10c40 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f  rOutA;         /
10c50 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
10c60 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
10c70 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
10c80 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20  drOutB = 0;     
10c90 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
10ca0 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
10cb0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
10cc0 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20  ddrEofA;        
10cd0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
10ce0 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61  he select-A-exha
10cf0 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
10d00 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
10d10 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fB;         /* A
10d20 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
10d30 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64  lect-B-exhausted
10d40 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
10d50 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20   int addrAltB;  
10d60 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
10d70 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62  s of the A<B sub
10d80 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10d90 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20 20   addrAeqB;      
10da0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
10db0 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75   the A==B subrou
10dc0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
10dd0 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20 20  drAgtB;         
10de0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
10df0 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65  e A>B subroutine
10e00 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
10e10 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itA;        /* L
10e20 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
10e30 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
10e40 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20  int regLimitB;  
10e50 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
10e60 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
10e70 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
10e80 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  gPrev;          
10e90 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65  /* A range of re
10ea0 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20  gisters to hold 
10eb0 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20  previous output 
10ec0 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69  */.  int savedLi
10ed0 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61  mit;       /* Sa
10ee0 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
10ef0 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  iLimit */.  int 
10f00 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20  savedOffset;    
10f10 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
10f20 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a   of p->iOffset *
10f30 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70  /.  int labelCmp
10f40 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  r;        /* Lab
10f50 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  el for the start
10f60 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c   of the merge al
10f70 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74  gorithm */.  int
10f80 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20   labelEnd;      
10f90 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
10fa0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
10fb0 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74  verall SELECT st
10fc0 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20  mt */.  int j1; 
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10fe0 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   Jump instructio
10ff0 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74 61  ns that get reta
11000 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74  rgetted */.  int
11010 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
11020 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f     /* One of TK_
11030 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  ALL, TK_UNION, T
11040 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54  K_EXCEPT, TK_INT
11050 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49  ERSECT */.  KeyI
11060 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30  nfo *pKeyDup = 0
11070 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20  ; /* Comparison 
11080 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
11090 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  duplicate remova
110a0 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  l */.  KeyInfo *
110b0 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20  pKeyMerge;   /* 
110c0 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72  Comparison infor
110d0 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69  mation for mergi
110e0 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c  ng rows */.  sql
110f0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
11100 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
11110 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
11120 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
11130 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y;   /* The ORDE
11140 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
11150 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20   int nOrderBy;  
11160 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11170 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
11180 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
11190 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d   */.  int *aPerm
111a0 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  ute;        /* M
111b0 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45  apping from ORDE
111c0 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65  R BY terms to re
111d0 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73  sult set columns
111e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
111f0 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ->pOrderBy!=0 );
11200 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 44  .  assert( pKeyD
11210 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e  up==0 ); /* "Man
11220 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73  aged" code needs
11230 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23   this.  Ticket #
11240 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20  3382. */.  db = 
11250 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20  pParse->db;.  v 
11260 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
11270 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
11280 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11290 4d 3b 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20  M;.  labelEnd = 
112a0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
112b0 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c  abel(v);.  label
112c0 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Cmpr = sqlite3Vd
112d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
112e0 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20  ..  /* Patch up 
112f0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
11300 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  use.  */.  op = 
11310 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f  p->op;  .  pPrio
11320 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
11330 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
11340 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
11350 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
11360 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65  pOrderBy;.  asse
11370 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a  rt( pOrderBy );.
11380 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
11390 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20  derBy->nExpr;.. 
113a0 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72   /* For operator
113b0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  s other than UNI
113c0 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74  ON ALL we have t
113d0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
113e0 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  .  ** the ORDER 
113f0 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73  BY clause covers
11400 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
11410 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
11420 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74  Add.  ** terms t
11430 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
11440 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61  lause as necessa
11450 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ry..  */.  if( o
11460 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
11470 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61   for(i=1; db->ma
11480 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26  llocFailed==0 &&
11490 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   i<=p->pEList->n
114a0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
114b0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
114c0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
114d0 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
114e0 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
114f0 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b   j<nOrderBy; j++
11500 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
11510 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
11520 6d 2d 3e 69 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  m->iCol>0 );.   
11530 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
11540 69 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b  iCol==i ) break;
11550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11560 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29  f( j==nOrderBy )
11570 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
11580 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45  pNew = sqlite3PE
11590 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
115a0 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 30 29  NTEGER, 0, 0, 0)
115b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
115c0 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
115d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
115e0 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
115f0 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
11600 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
11610 54 61 62 6c 65 20 3d 20 69 3b 0a 20 20 20 20 20  Table = i;.     
11620 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71     pOrderBy = sq
11630 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
11640 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64  end(pParse, pOrd
11650 65 72 42 79 2c 20 70 4e 65 77 2c 20 30 29 3b 0a  erBy, pNew, 0);.
11660 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
11670 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e  ->a[nOrderBy++].
11680 69 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20  iCol = (u16)i;. 
11690 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
116a0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
116b0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65  he comparison pe
116c0 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65  rmutation and ke
116d0 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73  yinfo that is us
116e0 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
116f0 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 69 6e 20   permutation in 
11700 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 61 72 69  order to compari
11710 73 6f 6e 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  sons to determin
11720 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20  e if the next.  
11730 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  ** row of result
11740 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c  s comes from sel
11750 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e  ectA or selectB.
11760 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69    Also add expli
11770 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  cit.  ** collati
11780 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ons to the ORDER
11790 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73   BY clause terms
117a0 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68   so that when th
117b0 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a  e subqueries.  *
117c0 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61  * to the right a
117d0 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65 20  nd the left are 
117e0 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20  evaluated, they 
117f0 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  use the correct.
11800 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a    ** collation..
11810 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20    */.  aPermute 
11820 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
11830 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
11840 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a  int)*nOrderBy);.
11850 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29    if( aPermute )
11860 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
11870 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
11880 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  m;.    for(i=0, 
11890 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
118a0 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  a; i<nOrderBy; i
118b0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
118c0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
118d0 6d 2d 3e 69 43 6f 6c 3e 30 20 20 26 26 20 70 49  m->iCol>0  && pI
118e0 74 65 6d 2d 3e 69 43 6f 6c 3c 3d 70 2d 3e 70 45  tem->iCol<=p->pE
118f0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
11900 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d       aPermute[i]
11910 20 3d 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 2d   = pItem->iCol -
11920 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b   1;.    }.    pK
11930 65 79 4d 65 72 67 65 20 3d 0a 20 20 20 20 20 20  eyMerge =.      
11940 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
11950 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
11960 4b 65 79 4d 65 72 67 65 29 2b 6e 4f 72 64 65 72  KeyMerge)+nOrder
11970 42 79 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  By*(sizeof(CollS
11980 65 71 2a 29 2b 31 29 29 3b 0a 20 20 20 20 69 66  eq*)+1));.    if
11990 28 20 70 4b 65 79 4d 65 72 67 65 20 29 7b 0a 20  ( pKeyMerge ){. 
119a0 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e       pKeyMerge->
119b0 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
119c0 2a 29 26 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43  *)&pKeyMerge->aC
119d0 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20  oll[nOrderBy];. 
119e0 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e       pKeyMerge->
119f0 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 4f  nField = (u16)nO
11a00 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 4b  rderBy;.      pK
11a10 65 79 4d 65 72 67 65 2d 3e 65 6e 63 20 3d 20 45  eyMerge->enc = E
11a20 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f  NC(db);.      fo
11a30 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
11a40 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
11a50 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
11a60 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
11a70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d  Term = pOrderBy-
11a80 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
11a90 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
11aa0 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
11ab0 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
11ac0 20 20 20 70 43 6f 6c 6c 20 3d 20 70 54 65 72 6d     pColl = pTerm
11ad0 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ->pColl;.       
11ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11af0 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53    pColl = multiS
11b00 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
11b10 72 73 65 2c 20 70 2c 20 61 50 65 72 6d 75 74 65  rse, p, aPermute
11b20 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
11b30 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20  pTerm->flags |= 
11b40 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
11b50 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
11b60 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20  pColl = pColl;. 
11b70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11b80 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c   pKeyMerge->aCol
11b90 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[i] = pColl;.  
11ba0 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
11bb0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
11bc0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
11bd0 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  sortOrder;.     
11be0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
11bf0 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  {.    pKeyMerge 
11c00 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
11c10 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45  eattach the ORDE
11c20 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74  R BY clause to t
11c30 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
11c40 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
11c50 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f  OrderBy;.  pPrio
11c60 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  r->pOrderBy = sq
11c70 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
11c80 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
11c90 64 65 72 42 79 29 3b 0a 0a 20 20 2f 2a 20 41 6c  derBy);..  /* Al
11ca0 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f  locate a range o
11cb0 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  f temporary regi
11cc0 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65  sters and the Ke
11cd0 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a  yInfo needed.  *
11ce0 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20  * for the logic 
11cf0 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70  that removes dup
11d00 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f  licate result ro
11d10 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ws when the.  **
11d20 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
11d30 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
11d40 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f  NTERSECT (but no
11d50 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20  t UNION ALL)..  
11d60 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
11d70 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72  ALL ){.    regPr
11d80 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ev = 0;.  }else{
11d90 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
11da0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
11db0 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  r;.    assert( n
11dc0 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c  OrderBy>=nExpr |
11dd0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
11de0 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65  ed );.    regPre
11df0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  v = sqlite3GetTe
11e00 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
11e10 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 73 71  nExpr+1);.    sq
11e20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11e30 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
11e40 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
11e50 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65  pKeyDup = sqlite
11e60 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
11e70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11e80 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79      sizeof(*pKey
11e90 44 75 70 29 20 2b 20 6e 45 78 70 72 2a 28 73 69  Dup) + nExpr*(si
11ea0 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
11eb0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  ) );.    if( pKe
11ec0 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 70 4b  yDup ){.      pK
11ed0 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
11ee0 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 44 75  r = (u8*)&pKeyDu
11ef0 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b  p->aColl[nExpr];
11f00 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e  .      pKeyDup->
11f10 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 45  nField = (u16)nE
11f20 78 70 72 3b 0a 20 20 20 20 20 20 70 4b 65 79 44  xpr;.      pKeyD
11f30 75 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  up->enc = ENC(db
11f40 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
11f50 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
11f60 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
11f70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
11f80 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
11f90 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
11fa0 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
11fb0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
11fc0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
11fd0 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
11fe0 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
11ff0 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
12000 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
12010 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
12020 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f  ior = 0;.  pPrio
12030 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  r->pRightmost = 
12040 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  0;.  sqlite3Reso
12050 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
12060 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f  pParse, p, p->pO
12070 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
12080 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
12090 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
120a0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
120b0 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
120c0 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69  se, pPrior, pPri
120d0 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f  or->pOrderBy, "O
120e0 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  RDER");.  }..  /
120f0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69  * Compute the li
12100 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f  mit registers */
12110 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
12120 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
12130 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20   p, labelEnd);. 
12140 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26   if( p->iLimit &
12150 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  & op==TK_ALL ){.
12160 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
12170 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12180 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20      regLimitB = 
12190 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
121a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
121b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
121c0 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70  , p->iOffset ? p
121d0 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d  ->iOffset+1 : p-
121e0 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20  >iLimit,.       
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12200 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69             regLi
12210 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  mitA);.    sqlit
12220 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12230 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69  OP_Copy, regLimi
12240 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a  tA, regLimitB);.
12250 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
12260 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69  LimitA = regLimi
12270 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  tB = 0;.  }.  sq
12280 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
12290 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
122a0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
122b0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
122c0 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66  lete(db, p->pOff
122d0 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73  set);.  p->pOffs
122e0 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64  et = 0;..  regAd
122f0 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drA = ++pParse->
12300 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20  nMem;.  regEofA 
12310 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
12320 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b  ;.  regAddrB = +
12330 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
12340 20 72 65 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61   regEofB = ++pPa
12350 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
12360 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutA = ++pParse-
12370 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42  >nMem;.  regOutB
12380 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
12390 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
123a0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
123b0 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  A, SRT_Coroutine
123c0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
123d0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
123e0 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54  Init(&destB, SRT
123f0 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
12400 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  ddrB);..  /* Jum
12410 70 20 70 61 73 74 20 74 68 65 20 76 61 72 69 6f  p past the vario
12420 75 73 20 73 75 62 72 6f 75 74 69 6e 65 73 20 61  us subroutines a
12430 6e 64 20 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f  nd coroutines to
12440 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d   the main.  ** m
12450 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20  erge loop.  */. 
12460 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
12470 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
12480 74 6f 29 3b 0a 20 20 61 64 64 72 53 65 6c 65 63  to);.  addrSelec
12490 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tA = sqlite3Vdbe
124a0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
124b0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
124c0 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
124d0 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
124e0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
124f0 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66  the.  ** left of
12500 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70   the compound op
12510 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22  erator - the "A"
12520 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
12530 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
12540 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75  (v, "Begin corou
12550 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45  tine for left SE
12560 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f  LECT"));.  pPrio
12570 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  r->iLimit = regL
12580 69 6d 69 74 41 3b 0a 20 20 73 71 6c 69 74 65 33  imitA;.  sqlite3
12590 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
125a0 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a  Prior, &destA);.
125b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
125c0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
125d0 72 2c 20 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a  r, 1, regEofA);.
125e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
125f0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
12600 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 56 64   regAddrA);.  Vd
12610 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
12620 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65  , "End coroutine
12630 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54   for left SELECT
12640 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  "));..  /* Gener
12650 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
12660 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
12670 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12680 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69   on .  ** the ri
12690 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65  ght - the "B" se
126a0 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72  lect.  */.  addr
126b0 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65  SelectB = sqlite
126c0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
126d0 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  (v);.  VdbeNoopC
126e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
126f0 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  n coroutine for 
12700 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
12710 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20  .  savedLimit = 
12720 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76  p->iLimit;.  sav
12730 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  edOffset = p->iO
12740 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d  ffset;.  p->iLim
12750 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a  it = regLimitB;.
12760 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
12770 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  ;  .  sqlite3Sel
12780 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
12790 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69  destB);.  p->iLi
127a0 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74  mit = savedLimit
127b0 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
127c0 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20   savedOffset;.  
127d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
127e0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
127f0 20 31 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20   1, regEofB);.  
12800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12810 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
12820 65 67 41 64 64 72 42 29 3b 0a 20 20 56 64 62 65  egAddrB);.  Vdbe
12830 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
12840 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66  "End coroutine f
12850 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22  or right SELECT"
12860 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ));..  /* Genera
12870 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
12880 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
12890 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
128a0 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63  the A.  ** selec
128b0 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
128c0 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
128d0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
128e0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
128f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
12900 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
12910 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41  A"));.  addrOutA
12920 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
12930 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
12940 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
12950 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20       p, &destA, 
12960 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a  pDest, regOutA,.
12970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12980 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
12990 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  p, P4_KEYINFO_HA
129a0 4e 44 4f 46 46 2c 20 6c 61 62 65 6c 45 6e 64 29  NDOFF, labelEnd)
129b0 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ;.  .  /* Genera
129c0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
129d0 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
129e0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
129f0 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63  the B.  ** selec
12a00 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
12a10 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
12a20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
12a30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
12a40 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
12a50 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64  _UNION ){.    Vd
12a60 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
12a70 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
12a80 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20  e for B"));.    
12a90 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72  addrOutB = gener
12aa0 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
12ab0 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
12ad0 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72  &destB, pDest, r
12ae0 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20  egOutB,.        
12af0 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
12b00 2c 20 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45  , pKeyDup, P4_KE
12b10 59 49 4e 46 4f 5f 53 54 41 54 49 43 2c 20 6c 61  YINFO_STATIC, la
12b20 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20  belEnd);.  }..  
12b30 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
12b40 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
12b50 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
12b60 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20   from select A. 
12b70 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
12b80 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
12b90 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61  in select B rema
12ba0 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ins..  */.  Vdbe
12bb0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
12bc0 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e  "eof-A subroutin
12bd0 65 22 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  e"));.  if( op==
12be0 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
12bf0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
12c00 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20  .    addrEofA = 
12c10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12c20 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
12c30 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65   labelEnd);.  }e
12c40 6c 73 65 7b 20 20 0a 20 20 20 20 61 64 64 72 45  lse{  .    addrE
12c50 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
12c60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
12c70 2c 20 72 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c  , regEofB, label
12c80 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  End);.    sqlite
12c90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12ca0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
12cb0 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20  , addrOutB);.   
12cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12cd0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
12ce0 72 65 67 41 64 64 72 42 29 3b 0a 20 20 20 20 73  regAddrB);.    s
12cf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12d00 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
12d10 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 7d 0a 0a  addrEofA);.  }..
12d20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
12d30 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
12d40 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
12d50 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42  ts from select B
12d60 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
12d70 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
12d80 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65  a in select A re
12d90 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mains..  */.  if
12da0 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
12db0 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
12dc0 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20  fB = addrEofA;. 
12dd0 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64   }else{  .    Vd
12de0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
12df0 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74  , "eof-B subrout
12e00 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
12e10 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64  EofB = sqlite3Vd
12e20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12e30 66 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65  f, regEofA, labe
12e40 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  lEnd);.    sqlit
12e50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12e60 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
12e70 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
12e80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12e90 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
12ea0 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20   regAddrA);.    
12eb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12ec0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
12ed0 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a   addrEofB);.  }.
12ee0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
12ef0 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
12f00 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20  e case of A<B.  
12f10 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
12f20 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42  ment((v, "A-lt-B
12f30 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
12f40 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c    addrAltB = sql
12f50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12f60 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
12f70 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
12f80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12f90 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
12fa0 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
12fb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12fc0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
12fd0 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  A, addrEofA);.  
12fe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12ff0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
13000 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
13010 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
13020 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
13030 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f  ase of A==B.  */
13040 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
13050 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  L ){.    addrAeq
13060 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
13070 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
13080 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
13090 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
130a0 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41  rAltB;.    addrA
130b0 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ltB++;.  }else{.
130c0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
130d0 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20  ent((v, "A-eq-B 
130e0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
130f0 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20     addrAeqB =.  
13100 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13110 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
13120 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20   regAddrA);.    
13130 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13140 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
13150 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  ofA, addrEofA);.
13160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13170 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
13180 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  , 0, labelCmpr);
13190 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
131a0 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
131b0 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
131c0 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  >B.  */.  VdbeNo
131d0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
131e0 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -gt-B subroutine
131f0 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20  "));.  addrAgtB 
13200 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
13210 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
13220 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
13230 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
13240 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13250 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
13260 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
13270 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71  rOutB);.  }.  sq
13280 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
13290 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
132a0 41 64 64 72 42 29 3b 0a 20 20 73 71 6c 69 74 65  AddrB);.  sqlite
132b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
132c0 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61  P_If, regEofB, a
132d0 64 64 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69  ddrEofB);.  sqli
132e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
132f0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
13300 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54  elCmpr);..  /* T
13310 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e  his code runs on
13320 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ce to initialize
13330 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a   everything..  *
13340 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
13350 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
13360 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13370 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
13380 72 2c 20 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a  r, 0, regEofA);.
13390 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
133a0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
133b0 72 2c 20 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a  r, 0, regEofB);.
133c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
133d0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
133e0 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 53   regAddrA, addrS
133f0 65 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c 69 74  electA);.  sqlit
13400 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13410 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64  OP_Gosub, regAdd
13420 72 42 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29  rB, addrSelectB)
13430 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13440 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
13450 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
13460 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
13470 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
13480 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45  , regEofB, addrE
13490 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c  ofB);..  /* Impl
134a0 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d  ement the main m
134b0 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20  erge loop.  */. 
134c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
134d0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
134e0 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  lCmpr);.  sqlite
134f0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
13500 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30  P_Permutation, 0
13510 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61  , 0, 0, (char*)a
13520 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41  Permute, P4_INTA
13530 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33  RRAY);.  sqlite3
13540 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13550 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e  _Compare, destA.
13560 69 4d 65 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d  iMem, destB.iMem
13570 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , nOrderBy,.    
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13590 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
135a0 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46  Merge, P4_KEYINF
135b0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71  O_HANDOFF);.  sq
135c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
135d0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
135e0 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20  AltB, addrAeqB, 
135f0 61 64 64 72 41 67 74 42 29 3b 0a 0a 20 20 2f 2a  addrAgtB);..  /*
13600 20 52 65 6c 65 61 73 65 20 74 65 6d 70 6f 72 61   Release tempora
13610 72 79 20 72 65 67 69 73 74 65 72 73 0a 20 20 2a  ry registers.  *
13620 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
13630 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
13640 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
13650 50 61 72 73 65 2c 20 72 65 67 50 72 65 76 2c 20  Parse, regPrev, 
13660 6e 4f 72 64 65 72 42 79 2b 31 29 3b 0a 20 20 7d  nOrderBy+1);.  }
13670 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
13680 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  he this point in
13690 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e   order to termin
136a0 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ate the query.. 
136b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
136c0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
136d0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f   labelEnd);..  /
136e0 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
136f0 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d   of output colum
13700 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
13710 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
13720 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65  Output ){.    Se
13730 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
13740 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65  Prior;.    while
13750 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
13760 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
13770 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
13780 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
13790 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
137a0 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
137b0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65    }..  /* Reasse
137c0 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e  mbly the compoun
137d0 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20  d query so that 
137e0 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  it will be freed
137f0 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20   correctly.  ** 
13800 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
13810 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
13820 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
13830 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
13840 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72  elete(db, p->pPr
13850 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ior);.  }.  p->p
13860 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
13870 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e  .  /*** TBD:  In
13880 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20  sert subroutine 
13890 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63  calls to close c
138a0 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70  ursors on incomp
138b0 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71  lete.  **** subq
138c0 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 72  ueries ****/.  r
138d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
138e0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
138f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13900 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
13910 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13920 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46  _OMIT_VIEW)./* F
13930 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
13940 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
13950 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
13960 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c  (sqlite3*, ExprL
13970 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ist*, int, ExprL
13980 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
13990 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73  id substSelect(s
139a0 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20  qlite3*, Select 
139b0 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
139c0 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e   *);../*.** Scan
139d0 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
139e0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
139f0 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
13a00 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
13a10 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
13a20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
13a30 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
13a40 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
13a50 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
13a60 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
13a70 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
13a80 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
13a90 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
13aa0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
13ab0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
13ac0 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
13ad0 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
13ae0 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
13af0 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
13b00 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
13b10 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
13b20 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
13b30 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
13b40 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
13b50 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
13b60 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
13b70 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
13b80 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
13b90 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63  ine make the nec
13ba0 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
13bb0 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
13bc0 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
13bd0 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
13be0 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
13bf0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
13c00 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
13c10 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
13c20 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ery..*/.static v
13c30 6f 69 64 20 73 75 62 73 74 45 78 70 72 28 0a 20  oid substExpr(. 
13c40 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
13c50 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
13c60 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20  alloc errors to 
13c70 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
13c80 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
13c90 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  ,        /* Expr
13ca0 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69   in which substi
13cb0 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f  tution occurs */
13cc0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
13cd0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
13ce0 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
13cf0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
13d00 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75  *pEList    /* Su
13d10 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73  bstitute express
13d20 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ions */.){.  if(
13d30 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
13d40 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
13d50 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
13d60 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
13d70 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  =iTable ){.    i
13d80 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
13d90 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
13da0 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
13db0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13dc0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
13dd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
13de0 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
13df0 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d  >iColumn<pEList-
13e00 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
13e10 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
13e20 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
13e30 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70  ->pRight==0 && p
13e40 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
13e50 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70  ;.      pNew = p
13e60 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
13e70 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a  iColumn].pExpr;.
13e80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
13e90 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew!=0 );.      p
13ea0 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d  Expr->op = pNew-
13eb0 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  >op;.      asser
13ec0 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
13ed0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
13ee0 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r->pLeft = sqlit
13ef0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e  e3ExprDup(db, pN
13f00 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  ew->pLeft);.    
13f10 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
13f20 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
13f30 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
13f40 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
13f50 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69  up(db, pNew->pRi
13f60 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ght);.      asse
13f70 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  rt( pExpr->pList
13f80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
13f90 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69  pr->pList = sqli
13fa0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
13fb0 62 2c 20 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b  b, pNew->pList);
13fc0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
13fd0 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61  able = pNew->iTa
13fe0 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ble;.      pExpr
13ff0 2d 3e 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70  ->pTab = pNew->p
14000 54 61 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72  Tab;.      pExpr
14010 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77  ->iColumn = pNew
14020 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
14030 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70   pExpr->iAgg = p
14040 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20  New->iAgg;.     
14050 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
14060 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f  y(db, &pExpr->to
14070 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65  ken, &pNew->toke
14080 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
14090 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26  3TokenCopy(db, &
140a0 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e  pExpr->span, &pN
140b0 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20  ew->span);.     
140c0 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
140d0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
140e0 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 53 65  up(db, pNew->pSe
140f0 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78  lect);.      pEx
14100 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77  pr->flags = pNew
14110 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
14120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73   }else{.    subs
14130 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
14140 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20  >pLeft, iTable, 
14150 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
14160 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72  stExpr(db, pExpr
14170 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65  ->pRight, iTable
14180 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
14190 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
141a0 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Expr->pSelect, i
141b0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
141c0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
141d0 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 69  t(db, pExpr->pLi
141e0 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
141f0 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
14200 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
14210 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
14220 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
14230 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
14240 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
14250 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
14260 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
14270 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
14280 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
14290 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
142a0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
142b0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
142c0 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
142d0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
142e0 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
142f0 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
14300 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
14310 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
14320 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
14330 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
14340 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  {.    substExpr(
14350 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
14360 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70  pExpr, iTable, p
14370 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
14380 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
14390 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  elect(.  sqlite3
143a0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
143b0 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
143c0 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20  rrors here */.  
143d0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
143e0 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
143f0 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63  tatement in whic
14400 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
14410 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  tutions */.  int
14420 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
14430 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
14440 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45   replaced */.  E
14450 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
14460 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
14470 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
14480 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
14490 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
144a0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
144b0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20  int i;.  if( !p 
144c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73  ) return;.  subs
144d0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
144e0 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  >pEList, iTable,
144f0 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
14500 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
14510 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
14520 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
14530 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
14540 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61  p->pOrderBy, iTa
14550 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
14560 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
14570 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
14580 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
14590 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57  stExpr(db, p->pW
145a0 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45  here, iTable, pE
145b0 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65  List);.  substSe
145c0 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69  lect(db, p->pPri
145d0 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  or, iTable, pELi
145e0 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  st);.  pSrc = p-
145f0 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72  >pSrc;.  if( pSr
14600 63 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70  c ){.    for(i=p
14610 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d  Src->nSrc, pItem
14620 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69  =pSrc->a; i>0; i
14630 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
14640 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
14650 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  db, pItem->pSele
14660 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ct, iTable, pELi
14670 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  st);.    }.  }.}
14680 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
14690 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
146a0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
146b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
146c0 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20  T_VIEW) */..#if 
146d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
146e0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
146f0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
14700 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a  E_OMIT_VIEW)./*.
14710 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14720 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74  attempts to flat
14730 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69  ten subqueries i
14740 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64  n order to speed
14750 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  .** execution.  
14760 49 74 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  It returns 1 if 
14770 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
14780 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
14790 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72  ttening.** occur
147a0 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
147b0 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
147c0 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
147d0 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
147e0 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
147f0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
14800 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
14810 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
14820 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
14830 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
14840 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
14850 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
14860 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
14870 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
14880 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
14890 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
148a0 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
148b0 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
148c0 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
148d0 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
148e0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
148f0 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
14900 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
14910 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
14920 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
14930 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
14940 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
14950 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
14960 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
14970 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
14980 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
14990 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
149a0 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
149b0 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
149c0 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
149d0 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
149e0 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
149f0 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
14a00 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
14a10 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
14a20 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
14a30 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
14a40 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
14a50 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63  or this simpific
14a60 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20  ation gives the 
14a70 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62  same result.** b
14a80 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73  ut only has to s
14a90 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63  can the data onc
14aa0 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20  e.  And because 
14ab0 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a  indices might .*
14ac0 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74  * exist on the t
14ad0 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c  able t1, a compl
14ae0 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ete scan of the 
14af0 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a  data might be.**
14b00 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20   avoided..**.** 
14b10 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e  Flattening is on
14b20 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
14b30 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
14b40 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
14b50 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20  *.**   (1)  The 
14b60 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
14b70 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
14b80 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67  not both use agg
14b90 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
14ba0 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65   (2)  The subque
14bb0 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
14bc0 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75  regate or the ou
14bd0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
14be0 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
14bf0 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65   (3)  The subque
14c00 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  ry is not the ri
14c10 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
14c20 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e   left outer join
14c30 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67  .**        (Orig
14c40 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33  inally ticket #3
14c50 30 36 2e 20 20 53 74 72 65 6e 67 68 74 65 6e 65  06.  Strenghtene
14c60 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 33 30  d by ticket #330
14c70 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  0).**.**   (4)  
14c80 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
14c90 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
14ca0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
14cb0 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
14cc0 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20  *.**   (5)  The 
14cd0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
14ce0 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
14cf0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
14d00 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
14d10 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
14d20 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20  *.**   (6)  The 
14d30 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
14d40 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
14d50 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
14d60 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
14d70 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a       DISTINCT..*
14d80 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20  *.**   (7)  The 
14d90 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46  subquery has a F
14da0 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
14db0 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
14dc0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
14dd0 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
14de0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
14df0 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
14e00 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
14e10 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
14e20 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
14e30 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
14e40 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
14e50 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
14e60 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73  .**  (10)  The s
14e70 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
14e80 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
14e90 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
14ea0 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
14eb0 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
14ec0 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
14ed0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
14ee0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
14ef0 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
14f00 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
14f10 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 4e  ..**.**  (12)  N
14f20 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20  ot implemented. 
14f30 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72   Subsumed into r
14f40 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20  estriction (3). 
14f50 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a   Was previously.
14f60 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61  **        a sepa
14f70 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e  rate restriction
14f80 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74   deriving from t
14f90 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a  icket #350..**.*
14fa0 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62  *  (13)  The sub
14fb0 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20  query and outer 
14fc0 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
14fd0 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a  h use LIMIT.**.*
14fe0 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62  *  (14)  The sub
14ff0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
15000 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20  se OFFSET.**.** 
15010 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72   (15)  The outer
15020 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61   query is not pa
15030 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rt of a compound
15040 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a   select or the.*
15050 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72  *        subquer
15060 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  y does not have 
15070 62 6f 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  both an ORDER BY
15080 20 61 6e 64 20 61 20 4c 49 4d 49 54 20 63 6c 61   and a LIMIT cla
15090 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28  use..**        (
150a0 53 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39  See ticket #2339
150b0 29 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54  ).**.**  (16)  T
150c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
150d0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
150e0 74 65 20 6f 72 20 74 68 65 20 73 75 62 71 75 65  te or the subque
150f0 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20  ry does.**      
15100 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52    not contain OR
15110 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74  DER BY.  (Ticket
15120 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73   #2942)  This us
15130 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72  ed to not matter
15140 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c  .**        until
15150 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74   we introduced t
15160 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  he group_concat(
15170 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a  ) function.  .**
15180 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20 73  .**  (17)  The s
15190 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20  ub-query is not 
151a0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
151b0 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e  t, or it is a UN
151c0 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20  ION ALL .**     
151d0 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75     compound clau
151e0 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72  se made up entir
151f0 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65  ely of non-aggre
15200 67 61 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e  gate queries, an
15210 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65  d .**        the
15220 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a   parent query:.*
15230 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  *.**          * 
15240 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61  is not itself pa
15250 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rt of a compound
15260 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20   select,.**     
15270 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e       * is not an
15280 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 44 49   aggregate or DI
15290 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e  STINCT query, an
152a0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  d.**          * 
152b0 68 61 73 20 6e 6f 20 6f 74 68 65 72 20 74 61 62  has no other tab
152c0 6c 65 73 20 6f 72 20 73 75 62 2d 73 65 6c 65 63  les or sub-selec
152d0 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ts in the FROM c
152e0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lause..**.**    
152f0 20 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61      The parent a
15300 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79  nd sub-query may
15310 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63   contain WHERE c
15320 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20  lauses. Subject 
15330 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c  to.**        rul
15340 65 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e  es (11), (13) an
15350 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79  d (14), they may
15360 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52   also contain OR
15370 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20  DER BY,.**      
15380 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53    LIMIT and OFFS
15390 45 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  ET clauses..**.*
153a0 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
153b0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
153c0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
153d0 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
153e0 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
153f0 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20  ORDER by clause 
15400 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
15410 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
15420 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
15430 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
15440 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
15450 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65  **.**  (19)  The
15460 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
15470 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
15480 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
15490 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
154a0 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20     have a WHERE 
154b0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  clause..**.** In
154c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
154d0 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
154e0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
154f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
15500 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72  ..** The subquer
15510 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  y is p->pSrc->a[
15520 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69  iFrom].  isAgg i
15530 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75  s true if the ou
15540 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65  ter query.** use
15550 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64  s aggregates and
15560 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69   subqueryIsAgg i
15570 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  s true if the su
15580 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
15590 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
155a0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
155b0 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
155c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
155d0 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
155e0 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
155f0 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
15600 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
15610 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
15620 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
15630 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
15640 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
15650 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
15660 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
15670 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
15680 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
15690 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
156a0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
156b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
156c0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
156d0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
156e0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
156f0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
15700 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
15710 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
15720 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
15730 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
15740 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
15750 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
15760 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
15770 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Agg,           /
15780 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
15790 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
157a0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
157b0 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72  */.  int subquer
157c0 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75  yIsAgg    /* Tru
157d0 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
157e0 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
157f0 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
15800 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15810 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
15820 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
15830 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63  Context;.  Selec
15840 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65  t *pParent;.  Se
15850 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20  lect *pSub;     
15860 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71    /* The inner q
15870 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72  uery or "subquer
15880 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  y" */.  Select *
15890 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50  pSub1;      /* P
158a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69  ointer to the ri
158b0 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69  ghtmost select i
158c0 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20  n sub-query */. 
158d0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
158e0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
158f0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
15900 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
15910 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
15920 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
15930 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
15940 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72  bquery */.  Expr
15950 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
15960 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
15970 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  t of the outer q
15980 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50  uery */.  int iP
15990 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
159a0 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
159b0 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20  ber of the pSub 
159c0 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20  result set temp 
159d0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
159e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
159f0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
15a00 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
15a10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15a20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
15a30 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
15a40 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
15a50 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f  m *pSubitem;   /
15a60 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a  * The subquery *
15a70 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
15a80 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
15a90 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
15aa0 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   if flattening i
15ab0 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65  s permitted.  Re
15ac0 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20  turn 0 if not.. 
15ad0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21   */.  assert( p!
15ae0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
15af0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
15b00 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
15b10 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c  ==0 );  /* Unabl
15b20 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d  e to flatten com
15b30 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f  pound queries */
15b40 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
15b50 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
15b60 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
15b70 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
15b80 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
15b90 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
15ba0 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  ];.  iParent = p
15bb0 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
15bc0 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
15bd0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
15be0 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
15bf0 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
15c00 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
15c10 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
15c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
15c30 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20  estriction (1)  
15c40 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72  */.  if( subquer
15c50 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e  yIsAgg && pSrc->
15c60 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
15c70 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  0;          /* R
15c80 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20  estriction (2)  
15c90 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  */.  pSubSrc = p
15ca0 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
15cb0 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
15cc0 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
15cd0 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
15ce0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
15cf0 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
15d00 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
15d10 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
15d20 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20  y expresssions, 
15d30 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20  we allowed some 
15d40 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d  combining of LIM
15d50 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
15d60 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20  ** because they 
15d70 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  could be compute
15d80 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
15d90 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d  e.  But when LIM
15da0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
15db0 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72  ** became arbitr
15dc0 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
15dd0 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20   we were forced 
15de0 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69  to add restricti
15df0 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e  ons (13).  ** an
15e00 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28  d (14). */.  if(
15e10 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
15e20 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
15e30 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
15e40 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
15e50 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28  on (13) */.  if(
15e60 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29   pSub->pOffset )
15e70 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
15e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e90 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
15ea0 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28  on (14) */.  if(
15eb0 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26   p->pRightmost &
15ec0 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  & pSub->pLimit &
15ed0 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
15ee0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
15ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15f20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29  Restriction (15)
15f30 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
15f40 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29  ubSrc->nSrc==0 )
15f50 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
15f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f70 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
15f80 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 28  (7)  */.  if( ((
15f90 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
15fa0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
15fb0 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   || pSub->pLimit
15fc0 29 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ) .         && (
15fd0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
15fe0 69 73 41 67 67 29 20 29 7b 20 20 20 20 20 20 20  isAgg) ){       
15ff0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
16000 6e 73 20 28 34 29 28 35 29 28 38 29 28 39 29 20  ns (4)(5)(8)(9) 
16010 2a 2f 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  */.     return 0
16020 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69  ;       .  }.  i
16030 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
16040 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
16050 30 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  0 && subqueryIsA
16060 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  gg ){.     retur
16070 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
16080 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20  Restriction (6) 
16090 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   */.  }.  if( p-
160a0 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75  >pOrderBy && pSu
160b0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
160c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
160d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
16100 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20  iction (11) */. 
16110 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26   }.  if( isAgg &
16120 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
16130 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
16140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16150 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20  estriction (16) 
16160 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
16170 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65  Limit && p->pWhe
16180 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
16190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
161a0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20  estriction (19) 
161b0 2a 2f 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54  */..  /* OBSOLET
161c0 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a  E COMMENT 1:.  *
161d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a  * Restriction 3:
161e0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
161f0 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b  y is a join, mak
16200 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
16210 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74  ery is .  ** not
16220 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67   used as the rig
16230 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ht operand of an
16240 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78   outer join.  Ex
16250 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
16260 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  is.  ** is not a
16270 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
16280 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
16290 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
162a0 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
162b0 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
162c0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
162d0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
162e0 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
162f0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
16300 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
16310 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
16320 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
16330 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20  me thing..  **. 
16340 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d   ** OBSOLETE COM
16350 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73  MENT 2:.  ** Res
16360 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66  triction 12:  If
16370 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
16380 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
16390 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
163a0 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61  er.  ** join, ma
163b0 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
163c0 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
163d0 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41  E clause..  ** A
163e0 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  n examples of wh
163f0 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c  y this is not al
16400 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
16410 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
16420 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c   OUTER JOIN (SEL
16430 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
16440 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a  ERE t2.x>0).  **
16450 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
16460 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
16470 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
16480 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
16490 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
164a0 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78  N t2) WHERE t2.x
164b0 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74  >0.  **.  ** But
164c0 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74   the t2.x>0 test
164d0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
164e0 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20  l on a NULL row 
164f0 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a  of t2, which.  *
16500 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f  * effectively co
16510 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52  nverts the OUTER
16520 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e   JOIN into an IN
16530 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20  NER JOIN..  **. 
16540 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44   ** THIS OVERRID
16550 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d  ES OBSOLETE COMM
16560 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f  ENTS 1 AND 2 ABO
16570 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20  VE:.  ** Ticket 
16580 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61 74  #3300 shows that
16590 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
165a0 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
165b0 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69  LEFT JOIN.  ** i
165c0 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20 64  s fraught with d
165d0 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20  anger.  Best to 
165e0 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20  avoid the whole 
165f0 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20  thing.  If the. 
16600 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20   ** subquery is 
16610 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
16620 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
16630 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74  hen do not flatt
16640 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  en..  */.  if( (
16650 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
16660 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
16670 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
16680 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
16690 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20  triction 17: If 
166a0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
166b0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
166c0 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  CT, then it must
166d0 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74  .  ** use only t
166e0 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
166f0 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20  rator. And none 
16700 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65  of the simple se
16710 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a  lect queries.  *
16720 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  * that make up t
16730 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
16740 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  CT are allowed t
16750 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20 6f  o be aggregate o
16760 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20  r distinct.  ** 
16770 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
16780 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  if( pSub->pPrior
16790 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   ){.    if( p->p
167a0 50 72 69 6f 72 20 7c 7c 20 69 73 41 67 67 20 7c  Prior || isAgg |
167b0 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
167c0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
167d0 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
167e0 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
167f0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  n 0;.    }.    f
16800 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
16810 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
16820 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
16830 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65    if( (pSub1->se
16840 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
16850 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
16860 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c  te))!=0.       |
16870 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  | (pSub1->pPrior
16880 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54   && pSub1->op!=T
16890 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c  K_ALL) .       |
168a0 7c 20 21 70 53 75 62 31 2d 3e 70 53 72 63 20 7c  | !pSub1->pSrc |
168b0 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  | pSub1->pSrc->n
168c0 53 72 63 21 3d 31 0a 20 20 20 20 20 20 29 7b 0a  Src!=1.      ){.
168d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
168e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
168f0 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74  .    /* Restrict
16900 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69  ion 18. */.    i
16910 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
16920 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a  {.      int ii;.
16930 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
16940 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  ii<p->pOrderBy->
16950 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
16960 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
16970 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 69 43 6f  derBy->a[ii].iCo
16980 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
16990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
169a0 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20   }..  /***** If 
169b0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
169c0 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20  int, flattening 
169d0 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a  is permitted. **
169e0 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f  ***/..  /* Autho
169f0 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72  rize the subquer
16a00 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a  y */.  pParse->z
16a10 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53  AuthContext = pS
16a20 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  ubitem->zName;. 
16a30 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
16a40 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
16a50 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
16a60 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  );.  pParse->zAu
16a70 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
16a80 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  edAuthContext;..
16a90 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
16aa0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
16ab0 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
16ac0 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72  ment, then (by r
16ad0 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a  estrictions.  **
16ae0 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65   17 and 18 above
16af0 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55  ) it must be a U
16b00 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65  NION ALL and the
16b10 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75   parent query mu
16b20 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74  st .  ** be of t
16b30 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
16b40 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65  **     SELECT <e
16b50 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28  xpr-list> FROM (
16b60 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68  <sub-query>) <wh
16b70 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a  ere-clause> .  *
16b80 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  *.  ** followed 
16b90 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  by any ORDER BY,
16ba0 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46   LIMIT and/or OF
16bb0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
16bc0 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72  is block.  ** cr
16bd0 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73  eates N-1 copies
16be0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71   of the parent q
16bf0 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79  uery without any
16c00 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
16c10 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54   or .  ** OFFSET
16c20 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69   clauses and joi
16c30 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c  ns them to the l
16c40 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  eft-hand-side of
16c50 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
16c60 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41  ** using UNION A
16c70 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e  LL operators. In
16c80 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20   this case N is 
16c90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  the number of si
16ca0 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74  mple.  ** select
16cb0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
16cc0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
16cd0 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  query..  **.  **
16ce0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
16cf0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
16d00 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20  +1 FROM (.  **  
16d10 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46        SELECT x F
16d20 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
16d30 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
16d40 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
16d50 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   y FROM tab.  **
16d60 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
16d70 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
16d80 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52  LECT abs(z*2) FR
16d90 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20  OM tab2.  **    
16da0 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52   ) WHERE a!=5 OR
16db0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
16dc0 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
16dd0 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
16de0 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52     SELECT x+1 FR
16df0 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31  OM tab WHERE x+1
16e00 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
16e10 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
16e20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20  SELECT y+1 FROM 
16e30 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35  tab WHERE y+1!=5
16e40 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
16e50 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
16e60 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46  ECT abs(z*2)+1 F
16e70 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61  ROM tab2 WHERE a
16e80 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a  bs(z*2)+1!=5.  *
16e90 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31  *     ORDER BY 1
16ea0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61  .  **.  ** We ca
16eb0 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d  ll this the "com
16ec0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
16ed0 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f  lattening"..  */
16ee0 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62  .  for(pSub=pSub
16ef0 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20  ->pPrior; pSub; 
16f00 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
16f10 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
16f20 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69  pNew;.    ExprLi
16f30 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
16f40 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
16f50 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70  Expr *pLimit = p
16f60 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65  ->pLimit;.    Se
16f70 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
16f80 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
16f90 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
16fa0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
16fb0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
16fc0 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  0;.    p->pLimit
16fd0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d   = 0;.    pNew =
16fe0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
16ff0 70 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70 2d  p(db, p);.    p-
17000 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
17010 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
17020 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
17030 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
17040 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ;.    p->op = TK
17050 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70 52 69  _ALL;.    p->pRi
17060 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20  ghtmost = 0;.   
17070 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
17080 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 50 72        pNew = pPr
17090 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ior;.    }else{.
170a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69        pNew->pPri
170b0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
170c0 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d     pNew->pRightm
170d0 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ost = 0;.    }. 
170e0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
170f0 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  New;.    if( db-
17100 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
17110 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
17120 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65   /* Begin flatte
17130 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74  ning the iFrom-t
17140 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
17150 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a  ROM clause .  **
17160 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
17170 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62  ery..  */.  pSub
17180 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69   = pSub1 = pSubi
17190 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20  tem->pSelect;.. 
171a0 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74   /* Delete the t
171b0 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
171c0 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61  tructure associa
171d0 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
171e0 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a  * subquery.  */.
171f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17200 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  db, pSubitem->zD
17210 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69  atabase);.  sqli
17220 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
17230 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ubitem->zName);.
17240 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17250 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  db, pSubitem->zA
17260 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65  lias);.  pSubite
17270 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  m->zDatabase = 0
17280 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  ;.  pSubitem->zN
17290 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ame = 0;.  pSubi
172a0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b  tem->zAlias = 0;
172b0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65  .  pSubitem->pSe
172c0 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  lect = 0;..  /* 
172d0 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74  Defer deleting t
172e0 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
172f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
17300 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
17310 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e  y until code gen
17320 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  eration is.  ** 
17330 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20  complete, since 
17340 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20  there may still 
17350 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20  exist Expr.pTab 
17360 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a  entries that.  *
17370 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73  * refer to the s
17380 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74  ubquery even aft
17390 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  er flattening.  
173a0 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20  Ticket #3346..  
173b0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 69 74 65  */.  if( pSubite
173c0 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20  m->pTab!=0 ){.  
173d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44    Table *pTabToD
173e0 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  el = pSubitem->p
173f0 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Tab;.    if( pTa
17400 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20  bToDel->nRef==1 
17410 29 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  ){.      pTabToD
17420 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20  el->pNextZombie 
17430 3d 20 70 50 61 72 73 65 2d 3e 70 5a 6f 6d 62 69  = pParse->pZombi
17440 65 54 61 62 3b 0a 20 20 20 20 20 20 70 50 61 72  eTab;.      pPar
17450 73 65 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d  se->pZombieTab =
17460 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20   pTabToDel;.    
17470 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
17480 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a  bToDel->nRef--;.
17490 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74      }.    pSubit
174a0 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  em->pTab = 0;.  
174b0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
174c0 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20  owing loop runs 
174d0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65  once for each te
174e0 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  rm in a compound
174f0 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66  -subquery.  ** f
17500 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65  lattening (as de
17510 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20  scribed above). 
17520 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
17530 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e   a different kin
17540 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65  d.  ** of flatte
17550 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e  ning - a flatten
17560 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
17570 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
17580 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a  ry flattening -.
17590 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c    ** then this l
175a0 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e  oop only runs on
175b0 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
175c0 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c  is loop moves al
175d0 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
175e0 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
175f0 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
17600 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
17610 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
17620 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
17630 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
17640 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
17650 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
17660 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
17670 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
17680 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
17690 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
176a0 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
176b0 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
176c0 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
176d0 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
176e0 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
176f0 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
17700 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
17710 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
17720 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
17730 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
17740 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
17750 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
17760 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
17770 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
17780 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28   in..  */.  for(
17790 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65  pParent=p; pPare
177a0 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72  nt; pParent=pPar
177b0 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75  ent->pPrior, pSu
177c0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
177d0 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
177e0 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70  ;.    u8 jointyp
177f0 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53  e = 0;.    pSubS
17800 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
17810 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
17820 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20  use of subquery 
17830 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d  */.    nSubSrc =
17840 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20   pSubSrc->nSrc; 
17850 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
17860 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20  rms in subquery 
17870 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
17880 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
17890 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  t->pSrc;     /* 
178a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
178b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
178c0 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20  /..    if( pSrc 
178d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
178e0 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20   pParent==p );  
178f0 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68  /* First time th
17900 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
17910 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  /.      jointype
17920 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69   = pSubitem->joi
17930 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65  ntype;.    }else
17940 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
17950 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f  pParent!=p );  /
17960 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  * 2nd and subseq
17970 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75  uent times throu
17980 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
17990 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72       pSrc = pPar
179a0 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  ent->pSrc = sqli
179b0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
179c0 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  (db, 0, 0, 0);. 
179d0 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30       if( pSrc==0
179e0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
179f0 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
17a00 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
17a10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
17a20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
17a30 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
17a40 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20   single slot of 
17a50 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
17a60 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20  of the outer.   
17a70 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74   ** query.  If t
17a80 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
17a90 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c  more than one el
17aa0 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f  ement in its FRO
17ab0 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a  M clause,.    **
17ac0 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65   then expand the
17ad0 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20   outer query to 
17ae0 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69  make space for i
17af0 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c  t to hold all el
17b00 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ements.    ** of
17b10 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
17b20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
17b30 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
17b40 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   **    SELECT * 
17b50 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45  FROM tabA, (SELE
17b60 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20  CT * FROM sub1, 
17b70 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20  sub2), tabB;.   
17b80 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f   **.    ** The o
17b90 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33  uter query has 3
17ba0 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52   slots in its FR
17bb0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20  OM clause.  One 
17bc0 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20  slot of the.    
17bd0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28  ** outer query (
17be0 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29  the middle slot)
17bf0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
17c00 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e  subquery.  The n
17c10 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
17c20 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78   of code will ex
17c30 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65  pand the out que
17c40 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20  ry to 4 slots.  
17c50 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a  The middle.    *
17c60 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64  * slot is expand
17c70 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20  ed to two slots 
17c80 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
17c90 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20   space for the. 
17ca0 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e     ** two elemen
17cb0 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ts in the FROM c
17cc0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
17cd0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
17ce0 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20    if( nSubSrc>1 
17cf0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
17d00 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20  ->pSrc = pSrc = 
17d10 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
17d20 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20  large(db, pSrc, 
17d30 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b  nSubSrc-1,iFrom+
17d40 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  1);.      if( db
17d50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
17d60 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
17d70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
17d80 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20      /* Transfer 
17d90 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
17da0 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73  terms from the s
17db0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
17dc0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
17dd0 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
17de0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53  for(i=0; i<nSubS
17df0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
17e00 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
17e10 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d   = pSubSrc->a[i]
17e20 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
17e30 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30  pSubSrc->a[i], 0
17e40 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63  , sizeof(pSubSrc
17e50 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a  ->a[i]));.    }.
17e60 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f      pSrc->a[iFro
17e70 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f  m].jointype = jo
17e80 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f  intype;.  .    /
17e90 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73  * Now begin subs
17ea0 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72  tituting subquer
17eb0 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  y result set exp
17ec0 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20  ressions for .  
17ed0 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
17ee0 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69  to the iParent i
17ef0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
17f00 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  y..    ** .    *
17f10 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
17f20 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
17f30 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d  T a+5, b*10 FROM
17f40 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20   (SELECT x*3 AS 
17f50 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f  a, y+10 AS b FRO
17f60 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b  M t1) WHERE a>b;
17f70 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  .    **   \     
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f90 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
17fa0 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
17fb0 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
17fc0 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f     **    \______
17fd0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
17fe0 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
17ff0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18000 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20  __________/.    
18010 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f  **.    ** We loo
18020 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65  k at every expre
18030 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74  ssion in the out
18040 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65  er query and eve
18050 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a  ry place we see.
18060 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75      ** "a" we su
18070 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61  bstitute "x*3" a
18080 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
18090 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62  e see "b" we sub
180a0 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a  stitute "y+10"..
180b0 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74      */.    pList
180c0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69   = pParent->pELi
180d0 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  st;.    for(i=0;
180e0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
180f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
18100 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 20 20  r *pExpr;.      
18110 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
18120 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78  zName==0 && (pEx
18130 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
18140 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21  .pExpr)->span.z!
18150 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  =0 ){.        pL
18160 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
18170 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
18180 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44    sqlite3DbStrND
18190 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 45  up(db, (char*)pE
181a0 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78  xpr->span.z, pEx
181b0 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20  pr->span.n);.   
181c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
181d0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
181e0 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74   pParent->pEList
181f0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
18200 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66  >pEList);.    if
18210 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ( isAgg ){.     
18220 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
18230 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f  b, pParent->pGro
18240 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  upBy, iParent, p
18250 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
18260 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62      substExpr(db
18270 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
18280 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
18290 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
182a0 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  }.    if( pSub->
182b0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
182c0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
182d0 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
182e0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
182f0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  >pOrderBy = pSub
18300 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
18310 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
18320 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
18330 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  if( pParent->pOr
18340 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
18350 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
18360 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
18370 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
18380 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
18390 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  }.    if( pSub->
183a0 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20  pWhere ){.      
183b0 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
183c0 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
183d0 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d  ->pWhere);.    }
183e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65  else{.      pWhe
183f0 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  re = 0;.    }.  
18400 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
18410 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Agg ){.      ass
18420 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48  ert( pParent->pH
18430 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20  aving==0 );.    
18440 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
18450 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57  ng = pParent->pW
18460 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72  here;.      pPar
18470 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  ent->pWhere = pW
18480 68 65 72 65 3b 0a 20 20 20 20 20 20 73 75 62 73  here;.      subs
18490 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
184a0 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  t->pHaving, iPar
184b0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
184c0 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  t);.      pParen
184d0 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  t->pHaving = sql
184e0 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
184f0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
18500 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
18510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18520 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18530 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48  Dup(db, pSub->pH
18540 61 76 69 6e 67 29 29 3b 0a 20 20 20 20 20 20 61  aving));.      a
18550 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
18560 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
18570 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
18580 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
18590 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
185a0 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b  pSub->pGroupBy);
185b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
185c0 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
185d0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c  pParent->pWhere,
185e0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
185f0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  pEList);.      p
18600 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
18610 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
18620 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  db, pParent->pWh
18630 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  ere, pWhere);.  
18640 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68    }.  .    /* Th
18650 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72  e flattened quer
18660 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66  y is distinct if
18670 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65   either the inne
18680 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
18690 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64  outer query is d
186a0 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f  istinct. .    */
186b0 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65  .    pParent->se
186c0 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e  lFlags |= pSub->
186d0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
186e0 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f  stinct;.  .    /
186f0 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  *.    ** SELECT 
18700 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  ... FROM (SELECT
18710 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46   ... LIMIT a OFF
18720 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f  SET b) LIMIT x O
18730 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a  FFSET y;.    **.
18740 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65      ** One is te
18750 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20  mpted to try to 
18760 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63  add a and b to c
18770 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74  ombine the limit
18780 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20  s.  But this.   
18790 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   ** does not wor
187a0 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69  k if either limi
187b0 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20  t is negative.. 
187c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
187d0 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
187e0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69      pParent->pLi
187f0 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d  mit = pSub->pLim
18800 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  it;.      pSub->
18810 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
18820 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69  }.  }..  /* Fini
18830 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
18840 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
18850 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
18860 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
18870 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
18880 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
18890 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20 72 65 74  , pSub1);..  ret
188a0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
188b0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
188c0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
188d0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
188e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
188f0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  */../*.** Analyz
18900 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
18910 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
18920 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   an argument to 
18930 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  see if it.** is 
18940 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  a min() or max()
18950 20 71 75 65 72 79 2e 20 52 65 74 75 72 6e 20 57   query. Return W
18960 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
18970 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42   or WHERE_ORDERB
18980 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20 69 74 20  Y_MAX if .** it 
18990 69 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  is, or 0 otherwi
189a0 73 65 2e 20 41 74 20 70 72 65 73 65 6e 74 2c 20  se. At present, 
189b0 61 20 71 75 65 72 79 20 69 73 20 63 6f 6e 73 69  a query is consi
189c0 64 65 72 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  dered to be.** a
189d0 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 71 75 65   min()/max() que
189e0 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  ry if:.**.**   1
189f0 2e 20 54 68 65 72 65 20 69 73 20 61 20 73 69 6e  . There is a sin
18a00 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  gle object in th
18a10 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
18a20 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65 72 65 20  *.**   2. There 
18a30 69 73 20 61 20 73 69 6e 67 6c 65 20 65 78 70 72  is a single expr
18a40 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65  ession in the re
18a50 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 69 74  sult set, and it
18a60 20 69 73 0a 2a 2a 20 20 20 20 20 20 65 69 74 68   is.**      eith
18a70 65 72 20 6d 69 6e 28 78 29 20 6f 72 20 6d 61 78  er min(x) or max
18a80 28 78 29 2c 20 77 68 65 72 65 20 78 20 69 73 20  (x), where x is 
18a90 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e  a column referen
18aa0 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ce..*/.static u8
18ab0 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 53 65 6c   minMaxQuery(Sel
18ac0 65 63 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 20  ect *p){.  Expr 
18ad0 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72 4c 69  *pExpr;.  ExprLi
18ae0 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e  st *pEList = p->
18af0 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70  pEList;..  if( p
18b00 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
18b10 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f  ) return WHERE_O
18b20 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
18b30 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   pExpr = pEList-
18b40 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 70  >a[0].pExpr;.  p
18b50 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  EList = pExpr->p
18b60 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 78 70  List;.  if( pExp
18b70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
18b80 4e 43 54 49 4f 4e 20 7c 7c 20 70 45 4c 69 73 74  NCTION || pEList
18b90 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e  ==0 || pEList->n
18ba0 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
18bb0 20 30 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   0;.  if( pEList
18bc0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
18bd0 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
18be0 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f  ) return WHERE_O
18bf0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
18c00 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
18c10 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20  n.n!=3 ) return 
18c20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
18c30 52 4d 41 4c 3b 0a 20 20 69 66 28 20 73 71 6c 69  RMAL;.  if( sqli
18c40 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61  te3StrNICmp((cha
18c50 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
18c60 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b  z,"min",3)==0 ){
18c70 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48 45 52  .    return WHER
18c80 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20  E_ORDERBY_MIN;. 
18c90 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
18ca0 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
18cb0 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
18cc0 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"max",3)==0 ){.
18cd0 20 20 20 20 72 65 74 75 72 6e 20 57 48 45 52 45      return WHERE
18ce0 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20  _ORDERBY_MAX;.  
18cf0 7d 0a 20 20 72 65 74 75 72 6e 20 57 48 45 52 45  }.  return WHERE
18d00 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
18d10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
18d20 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65   source-list ite
18d30 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  m passed as an a
18d40 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d  rgument was augm
18d50 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a  ented with an.**
18d60 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
18d70 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  se, then try to 
18d80 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69  locate the speci
18d90 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74  fied index. If t
18da0 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68  here.** was such
18db0 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68   a clause and th
18dc0 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61  e named index ca
18dd0 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72  nnot be found, r
18de0 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
18df0 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65  _ERROR and leave
18e00 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
18e10 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rse. Otherwise, 
18e20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72  populate .** pFr
18e30 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72  om->pIndex and r
18e40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
18e50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
18e60 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50  ndexedByLookup(P
18e70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
18e80 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
18e90 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  m *pFrom){.  if(
18ea0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20   pFrom->pTab && 
18eb0 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b  pFrom->zIndex ){
18ec0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
18ed0 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
18ee0 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78      char *zIndex
18ef0 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78   = pFrom->zIndex
18f00 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
18f10 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
18f20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20  pTab->pIndex; . 
18f30 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73         pIdx && s
18f40 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
18f50 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65  dx->zName, zInde
18f60 78 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  x); .        pId
18f70 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20  x=pIdx->pNext.  
18f80 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49    );.    if( !pI
18f90 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  dx ){.      sqli
18fa0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
18fb0 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
18fc0 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c  ex: %s", zIndex,
18fd0 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
18fe0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
18ff0 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d      }.    pFrom-
19000 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  >pIndex = pIdx;.
19010 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
19020 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19030 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
19040 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61   a Walker callba
19050 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e  ck for "expandin
19060 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  g" a SELECT stat
19070 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e  ement..** "Expan
19080 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64  ding" means to d
19090 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  o the following:
190a0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d  .**.**    (1)  M
190b0 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75  ake sure VDBE cu
190c0 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
190d0 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
190e0 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20  to every.**     
190f0 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74      element of t
19100 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
19110 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69  **.**    (2)  Fi
19120 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
19130 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
19140 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
19150 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
19160 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d      defines FROM
19170 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76   clause.  When v
19180 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74  iews appear in t
19190 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  he FROM clause,.
191a0 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20  **         fill 
191b0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53  pTabList->a[].pS
191c0 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70  elect with a cop
191d0 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
191e0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
191f0 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d       that implem
19200 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20  ents the view.  
19210 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
19220 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c  f the view's SEL
19230 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  ECT.**         s
19240 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74  tatement so that
19250 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d   we can freely m
19260 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20  odify or delete 
19270 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a  that statement.*
19280 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75  *         withou
19290 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74  t worrying about
192a0 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20   messing up the 
192b0 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65  presistent repre
192c0 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20  sentation.**    
192d0 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77       of the view
192e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  ..**.**    (3)  
192f0 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65  Add terms to the
19300 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
19310 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20   accomodate the 
19320 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a  NATURAL keyword.
19330 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f  **         on jo
19340 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61  ins and the ON a
19350 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  nd USING clause 
19360 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  of joins..**.** 
19370 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65     (4)  Scan the
19380 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
19390 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
193a0 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b  et (pEList) look
193b0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ing.**         f
193c0 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  or instances of 
193d0 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  the "*" operator
193e0 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20   or the TABLE.* 
193f0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20  operator..**    
19400 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65       If found, e
19410 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74  xpand each "*" t
19420 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
19430 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65  n in every table
19440 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20  .**         and 
19450 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76  TABLE.* to be ev
19460 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41  ery column in TA
19470 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  BLE..**.*/.stati
19480 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61  c int selectExpa
19490 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  nder(Walker *pWa
194a0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
194b0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
194c0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
194d0 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  rse;.  int i, j,
194e0 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   k;.  SrcList *p
194f0 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
19500 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
19510 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
19520 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c  em *pFrom;.  sql
19530 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
19540 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64 62  e->db;..  if( db
19550 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20  ->mallocFailed  
19560 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
19570 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69  C_Abort;.  }.  i
19580 66 28 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c  f( p->pSrc==0 ||
19590 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
195a0 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20  SF_Expanded)!=0 
195b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
195c0 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70  C_Prune;.  }.  p
195d0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
195e0 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 70 54 61  _Expanded;.  pTa
195f0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
19600 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
19610 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  EList;..  /* Mak
19620 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
19630 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
19640 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
19650 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
19660 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
19670 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
19680 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
19690 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
196a0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
196b0 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
196c0 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
196d0 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
196e0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
196f0 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
19700 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
19710 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
19720 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
19730 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
19740 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
19750 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
19760 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
19770 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
19780 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
19790 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
197a0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
197b0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
197c0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
197d0 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
197e0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
197f0 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21  if( pFrom->pTab!
19800 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
19810 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
19820 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
19830 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20  repared.  There 
19840 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20  is no need.     
19850 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65   ** to go furthe
19860 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
19870 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( i==0 );.    
19880 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
19890 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ne;.    }.    if
198a0 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
198b0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
198c0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
198d0 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  Y.      Select *
198e0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
198f0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20  elect;.      /* 
19900 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
19910 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
19920 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
19930 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
19940 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
19950 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
19960 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
19970 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
19980 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
19990 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
199a0 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
199b0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
199c0 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
199d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
199e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
199f0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
19a00 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  ab->db = db;.   
19a10 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
19a20 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  1;.      pTab->z
19a30 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
19a40 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
19a50 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c  e_subquery_%p_",
19a60 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20   (void*)pTab);. 
19a70 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
19a80 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c  ->pPrior ){ pSel
19a90 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
19aa0 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 43   }.      selectC
19ab0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
19ac0 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
19ad0 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
19ae0 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
19af0 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  l);.      pTab->
19b00 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
19b10 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
19b20 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
19b30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
19b40 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
19b50 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
19b60 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
19b70 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
19b80 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
19b90 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
19ba0 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
19bb0 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
19bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
19bd0 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
19be0 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70  0,pFrom->zName,p
19bf0 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  From->zDatabase)
19c00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
19c10 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
19c20 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
19c30 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20  ab->nRef++;.#if 
19c40 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
19c50 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
19c60 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
19c70 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
19c80 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ).      if( pTab
19c90 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56  ->pSelect || IsV
19ca0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
19cb0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
19cc0 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
19cd0 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
19ce0 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
19cf0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
19d00 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
19d10 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
19d20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57  pTab) ) return W
19d30 52 43 5f 41 62 6f 72 74 3b 0a 0a 20 20 20 20 20  RC_Abort;..     
19d40 20 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e     /* If pFrom->
19d50 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65  pSelect!=0 it me
19d60 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
19d70 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20  ng with a.      
19d80 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e    ** view within
19d90 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45   a view.  The SE
19da0 4c 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68  LECT structure h
19db0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  as already been.
19dc0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65          ** copie
19dd0 64 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76  d by the outer v
19de0 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b  iew so we can sk
19df0 69 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70  ip the copy step
19e00 20 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a   here.        **
19e10 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69   in the inner vi
19e20 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ew..        */. 
19e30 20 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d         if( pFrom
19e40 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
19e50 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d            pFrom-
19e60 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
19e70 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
19e80 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pTab->pSelect);.
19e90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19ea0 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
19eb0 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ker, pFrom->pSel
19ec0 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ect);.        }.
19ed0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
19ee0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63     }..    /* Loc
19ef0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61  ate the index na
19f00 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58  med by the INDEX
19f10 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66  ED BY clause, if
19f20 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28   any. */.    if(
19f30 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
19f40 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  yLookup(pParse, 
19f50 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20  pFrom) ){.      
19f60 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
19f70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
19f80 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41  * Process NATURA
19f90 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20  L keywords, and 
19fa0 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
19fb0 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20  uses of joins.. 
19fc0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
19fd0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71  llocFailed || sq
19fe0 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
19ff0 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
1a000 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
1a010 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  rt;.  }..  /* Fo
1a020 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
1a030 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
1a040 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
1a050 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
1a060 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
1a070 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
1a080 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
1a090 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
1a0a0 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
1a0b0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
1a0c0 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
1a0d0 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
1a0e0 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
1a0f0 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
1a100 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f  _ALL operator fo
1a110 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
1a120 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
1a130 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a  column list..  *
1a140 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1a150 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
1a160 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
1a170 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  LL expressions a
1a180 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65  nd expand.  ** e
1a190 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
1a1a0 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
1a1b0 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
1a1c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
1a1d0 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
1a1e0 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
1a1f0 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
1a200 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
1a210 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
1a220 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
1a230 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
1a240 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
1a250 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c    Expr *pE = pEL
1a260 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
1a270 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
1a280 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
1a290 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
1a2a0 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
1a2b0 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69  Right && pE->pRi
1a2c0 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a  ght->op==TK_ALL.
1a2d0 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
1a2e0 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65  pLeft && pE->pLe
1a2f0 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20  ft->op==TK_ID ) 
1a300 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
1a310 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
1a320 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
1a330 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
1a340 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
1a350 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
1a360 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
1a370 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
1a380 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
1a390 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
1a3a0 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
1a3b0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
1a3c0 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
1a3d0 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
1a3e0 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
1a3f0 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
1a400 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1a410 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
1a420 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
1a430 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ew = 0;.    int 
1a440 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e  flags = pParse->
1a450 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69  db->flags;.    i
1a460 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28  nt longNames = (
1a470 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
1a480 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a  ullColNames)!=0.
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20        && (flags 
1a4b0 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
1a4c0 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20  lNames)==0;..   
1a4d0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
1a4e0 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
1a4f0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
1a500 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
1a510 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
1a520 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20  TK_ALL &&.      
1a530 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b       (pE->op!=TK
1a540 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
1a550 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69  ht==0 || pE->pRi
1a560 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ght->op!=TK_ALL)
1a570 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1a580 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
1a590 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
1a5a0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
1a5b0 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
1a5c0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
1a5d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1a5e0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1a5f0 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
1a600 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
1a610 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
1a620 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
1a630 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
1a640 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
1a650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a660 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
1a670 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e  .        a[k].zN
1a680 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ame = 0;.      }
1a690 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1a6a0 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
1a6b0 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
1a6c0 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
1a6d0 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
1a6e0 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
1a6f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
1a700 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
1a710 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
1a720 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
1a730 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
1a740 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  *zTName;        
1a750 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e      /* text of n
1a760 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a  ame of TABLE */.
1a770 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
1a780 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
1a790 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
1a7a0 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71       zTName = sq
1a7b0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1a7c0 65 6e 28 64 62 2c 20 26 70 45 2d 3e 70 4c 65 66  en(db, &pE->pLef
1a7d0 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  t->token);.     
1a7e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a7f0 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a      zTName = 0;.
1a800 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a810 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
1a820 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
1a830 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
1a840 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
1a850 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
1a860 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
1a870 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ab;.          ch
1a880 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
1a890 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  From->zAlias;.  
1a8a0 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
1a8b0 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e  Name==0 || zTabN
1a8c0 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20  ame[0]==0 ){ .  
1a8d0 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
1a8e0 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
1a8f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1a900 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
1a910 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
1a920 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1a930 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71  if( zTName && sq
1a940 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
1a950 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
1a960 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1a970 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1a980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a990 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
1a9a0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
1a9b0 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
1a9c0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
1a9d0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20     Expr *pExpr, 
1a9e0 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  *pRight;.       
1a9f0 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
1aa00 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
1aa10 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20  .zName;..       
1aa20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
1aa30 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
1aa40 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65   'hidden' (curre
1aa50 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62  ntly only possib
1aa60 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
1aa70 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61  * for virtual ta
1aa80 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e  bles), do not in
1aa90 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20  clude it in the 
1aaa0 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20  expanded.       
1aab0 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73       ** result-s
1aac0 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20  et list..       
1aad0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1aae0 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e      if( IsHidden
1aaf0 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
1ab00 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ol[j]) ){.      
1ab10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49          assert(I
1ab20 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b  sVirtual(pTab));
1ab30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
1ab40 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1ab50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1ab60 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
1ab70 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
1ab80 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
1ab90 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1aba0 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69 73 74  Left = &pTabList
1abb0 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20  ->a[i-1];.      
1abc0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 65          if( (pLe
1abd0 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  ft[1].jointype &
1abe0 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20   JT_NATURAL)!=0 
1abf0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
1ac00 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d             colum
1ac10 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 54  nIndex(pLeft->pT
1ac20 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ab, zName)>=0 ){
1ac30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ac40 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
1ac50 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
1ac60 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
1ac70 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
1ac80 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
1ac90 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
1aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1acc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1acd0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1ace0 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
1acf0 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e 67 2c 20  Left[1].pUsing, 
1ad00 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
1ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ad20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61  In a join with a
1ad30 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f   USING clause, o
1ad40 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  mit columns in t
1ad50 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
1ad60 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
1ad70 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
1ad80 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
1ad90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1ada0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1adb0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1adc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1add0 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
1ade0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
1adf0 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30  rse, TK_ID, 0, 0
1ae00 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1ae10 20 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20    if( pRight==0 
1ae20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
1ae30 20 20 20 20 20 73 65 74 51 75 6f 74 65 64 54 6f       setQuotedTo
1ae40 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70 52 69  ken(pParse, &pRi
1ae50 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d  ght->token, zNam
1ae60 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1ae70 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
1ae80 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
1ae90 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
1aea0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
1aeb0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
1aec0 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20  arse, TK_ID, 0, 
1aed0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
1aee0 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
1aef0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1af00 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
1af10 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
1af20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1af30 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Expr==0 ) break;
1af40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
1af50 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50  etQuotedToken(pP
1af60 61 72 73 65 2c 20 26 70 4c 65 66 74 2d 3e 74 6f  arse, &pLeft->to
1af70 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a  ken, zTabName);.
1af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
1af90 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73  tToken(&pExpr->s
1afa0 70 61 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  pan, .          
1afb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
1afc0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
1afd0 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
1afe0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
1aff0 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
1b000 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  .dyn = 1;.      
1b010 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
1b020 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  oken.z = 0;.    
1b030 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1b040 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20  >token.n = 0;.  
1b050 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1b060 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30  r->token.dyn = 0
1b070 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
1b080 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1b090 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
1b0a0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
1b0b0 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70   pExpr->span = p
1b0c0 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Expr->token;.   
1b0d0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1b0e0 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 30 3b 0a  ->span.dyn = 0;.
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1b100 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
1b110 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  ngNames ){.     
1b120 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
1b130 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1b140 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
1b150 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45 78 70  ew, pExpr, &pExp
1b160 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  r->span);.      
1b170 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b180 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
1b190 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1b1a0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1b1b0 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 52  pNew, pExpr, &pR
1b1c0 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  ight->token);.  
1b1d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b1e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b1f0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
1b200 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
1b210 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
1b220 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b230 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1b240 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1b250 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e   table: %s", zTN
1b260 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1b270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1b280 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1b290 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
1b2a0 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
1b2b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1b2c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b2d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1b2e0 62 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  b, zTName);.    
1b2f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1b300 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1b310 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b  ete(db, pEList);
1b320 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
1b330 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53   pNew;.  }.#if S
1b340 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
1b350 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
1b360 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   && p->pEList->n
1b370 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
1b380 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
1b390 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
1b3a0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1b3b0 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
1b3c0 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
1b3d0 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  set");.  }.#endi
1b3e0 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  f.  return WRC_C
1b3f0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
1b400 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20  * No-op routine 
1b410 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72  for the parse-tr
1b420 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a  ee walker..**.**
1b430 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
1b440 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72  ne is the Walker
1b450 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
1b460 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  hen expression t
1b470 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b  rees.** are walk
1b480 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61  ed without any a
1b490 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b  ctions being tak
1b4a0 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e  en at each node.
1b4b0 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a    Presumably,.**
1b4c0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
1b4d0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57  ne is used for W
1b4e0 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
1b4f0 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c  ack then .** Wal
1b500 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
1b510 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f  ack is set to do
1b520 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75   something usefu
1b530 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20  l for every .** 
1b540 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20  subquery in the 
1b550 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a  parser tree..*/.
1b560 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 57  static int exprW
1b570 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a  alkNoop(Walker *
1b580 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e  NotUsed, Expr *N
1b590 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
1b5a0 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
1b5b0 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
1b5c0 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
1b5d0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
1b5e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22  * This routine "
1b5f0 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43  expands" a SELEC
1b600 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  T statement and 
1b610 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75  all of its subqu
1b620 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64  eries..** For ad
1b630 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
1b640 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20  tion on what it 
1b650 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64  means to "expand
1b660 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  " a SELECT.** st
1b670 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65  atement, see the
1b680 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
1b690 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72  selectExpand wor
1b6a0 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f  ker callback abo
1b6b0 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64  ve..**.** Expand
1b6c0 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61  ing a SELECT sta
1b6d0 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  tement is the fi
1b6e0 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63  rst step in proc
1b6f0 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45  essing a.** SELE
1b700 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  CT statement.  T
1b710 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1b720 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61  ent must be expa
1b730 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e  nded before.** n
1b740 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69  ame resolution i
1b750 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a  s performed..**.
1b760 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
1b770 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72  oes wrong, an er
1b780 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
1b790 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72  ritten into pPar
1b7a0 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  se..** The calli
1b7b0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20  ng function can 
1b7c0 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c  detect the probl
1b7d0 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  em by looking at
1b7e0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a   pParse->nErr.**
1b7f0 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e   and/or pParse->
1b800 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1b810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b820 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
1b830 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72  pand(Parse *pPar
1b840 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
1b850 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ect){.  Walker w
1b860 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
1b870 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78  lback = selectEx
1b880 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 45 78 70  pander;.  w.xExp
1b890 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
1b8a0 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
1b8b0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
1b8c0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
1b8d0 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
1b8e0 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
1b8f0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1b900 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  Y./*.** This is 
1b910 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  a Walker.xSelect
1b920 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63  Callback callbac
1b930 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  k for the sqlite
1b940 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28  3SelectTypeInfo(
1b950 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a  ).** interface..
1b960 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46  **.** For each F
1b970 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1b980 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e  ery, add Column.
1b990 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e  zType and Column
1b9a0 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  .zColl.** inform
1b9b0 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62  ation to the Tab
1b9c0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
1b9d0 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
1b9e0 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f   result set.** o
1b9f0 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e  f that subquery.
1ba00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  .**.** The Table
1ba10 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1ba20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
1ba30 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f  esult set was co
1ba40 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20  nstructed.** by 
1ba50 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29  selectExpander()
1ba60 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e   but the type an
1ba70 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
1ba80 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74  rmation was omit
1ba90 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70  ted.** at that p
1baa0 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65  oint because ide
1bab0 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74  ntifiers had not
1bac0 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76   yet been resolv
1bad0 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ed.  This.** rou
1bae0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
1baf0 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20  fter identifier 
1bb00 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
1bb10 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
1bb20 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
1bb30 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  nfo(Walker *pWal
1bb40 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
1bb50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1bb60 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  ;.  int i;.  Src
1bb70 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
1bb80 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1bb90 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
1bba0 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
1bbb0 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
1bbc0 65 64 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ed );.  if( (p->
1bbd0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
1bbe0 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b  sTypeInfo)==0 ){
1bbf0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
1bc00 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e   |= SF_HasTypeIn
1bc10 66 6f 3b 0a 20 20 20 20 70 50 61 72 73 65 20 3d  fo;.    pParse =
1bc20 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
1bc30 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  ;.    pTabList =
1bc40 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f   p->pSrc;.    fo
1bc50 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
1bc60 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
1bc70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1bc80 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
1bc90 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1bca0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
1bcb0 20 20 69 66 28 20 70 54 61 62 20 26 26 20 28 70    if( pTab && (p
1bcc0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
1bcd0 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30  TF_Ephemeral)!=0
1bce0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
1bcf0 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
1bd00 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1bd10 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
1bd20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
1bd30 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
1bd40 63 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ct;.        asse
1bd50 72 74 28 20 70 53 65 6c 20 29 3b 0a 20 20 20 20  rt( pSel );.    
1bd60 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
1bd70 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d  >pPrior ) pSel =
1bd80 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20   pSel->pPrior;. 
1bd90 20 20 20 20 20 20 20 73 65 6c 65 63 74 41 64 64         selectAdd
1bda0 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
1bdb0 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
1bdc0 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d  Tab->nCol, pTab-
1bdd0 3e 61 43 6f 6c 2c 20 70 53 65 6c 29 3b 0a 20 20  >aCol, pSel);.  
1bde0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1bdf0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1be00 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  tinue;.}.#endif.
1be10 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1be20 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79  tine adds dataty
1be30 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  pe and collating
1be40 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d   sequence inform
1be50 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20  ation to.** the 
1be60 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73  Table structures
1be70 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   of all FROM-cla
1be80 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69  use subqueries i
1be90 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  n a.** SELECT st
1bea0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55  atement..**.** U
1beb0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
1bec0 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
1bed0 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
1bee0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
1bef0 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50  ectAddTypeInfo(P
1bf00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
1bf10 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
1bf20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bf30 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57  MIT_SUBQUERY.  W
1bf40 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65  alker w;.  w.xSe
1bf50 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
1bf60 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
1bf70 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45  TypeInfo;.  w.xE
1bf80 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
1bf90 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
1bfa0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
1bfb0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
1bfc0 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
1bfd0 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
1bfe0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1bff0 20 73 65 74 73 20 6f 66 20 61 20 53 45 4c 45 43   sets of a SELEC
1c000 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
1c010 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
1c020 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
1c030 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a   accomplished:.*
1c040 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45  *.**     *  VDBE
1c050 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   Cursor numbers 
1c060 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  are assigned to 
1c070 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
1c080 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  terms..**     * 
1c090 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   Ephemeral Table
1c0a0 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
1c0b0 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f  ated for all FRO
1c0c0 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
1c0d0 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f  ies..**     *  O
1c0e0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
1c0f0 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20  ses are shifted 
1c100 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65  into WHERE state
1c110 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20  ments.**     *  
1c120 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e  Wildcards "*" an
1c130 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72  d "TABLE.*" in r
1c140 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65  esult sets are e
1c150 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20  xpanded..**     
1c160 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69  *  Identifiers i
1c170 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65  n expression are
1c180 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c   matched to tabl
1c190 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
1c1a0 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75  outine acts recu
1c1b0 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73  rsively on all s
1c1c0 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e  ubqueries within
1c1d0 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
1c1e0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1c1f0 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20  ctPrep(.  Parse 
1c200 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1c210 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
1c220 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1c230 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1c240 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
1c250 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
1c260 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
1c270 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
1c280 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74  NC  /* Name cont
1c290 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65  ext for containe
1c2a0 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  r */.){.  sqlite
1c2b0 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d  3 *db;.  if( p==
1c2c0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  0 ) return;.  db
1c2d0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1c2e0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
1c2f0 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
1c300 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  o ) return;.  if
1c310 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1c320 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1c330 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
1c340 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
1c350 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  nd(pParse, p);. 
1c360 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1c370 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1c380 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
1c390 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
1c3a0 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72  SelectNames(pPar
1c3b0 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29  se, p, pOuterNC)
1c3c0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1c3d0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
1c3e0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1c3f0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
1c400 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50  ctAddTypeInfo(pP
1c410 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  arse, p);.}../*.
1c420 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  ** Reset the agg
1c430 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
1c440 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67  or..**.** The ag
1c450 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
1c460 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20  tor is a set of 
1c470 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61  memory cells tha
1c480 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d  t hold.** interm
1c490 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77  ediate results w
1c4a0 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67  hile calculating
1c4b0 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
1c4c0 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
1c4d0 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e 55  simply stores NU
1c4e0 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  LLs in all of th
1c4f0 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  ose memory cells
1c500 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c510 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
1c520 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1c530 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
1c540 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
1c550 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1c560 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1c570 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
1c580 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70 41 67  pFunc;.  if( pAg
1c590 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67  gInfo->nFunc+pAg
1c5a0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d  gInfo->nColumn==
1c5b0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
1c5c0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1c5d0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  i<pAggInfo->nCol
1c5e0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  umn; i++){.    s
1c5f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c600 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
1c610 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
1c620 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66  ].iMem);.  }.  f
1c630 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
1c640 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
1c650 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
1c660 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
1c670 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c680 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1c690 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65  l, 0, pFunc->iMe
1c6a0 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  m);.    if( pFun
1c6b0 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  c->iDistinct>=0 
1c6c0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1c6d0 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72  E = pFunc->pExpr
1c6e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
1c6f0 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
1c700 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
1c710 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1c720 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c730 65 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e 20  e, "DISTINCT in 
1c740 61 67 67 72 65 67 61 74 65 20 6d 75 73 74 20 62  aggregate must b
1c750 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20  e followed ".   
1c760 20 20 20 20 20 20 20 20 22 62 79 20 61 6e 20 65          "by an e
1c770 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20  xpression");.   
1c780 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
1c790 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
1c7a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c7b0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1c7c0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
1c7d0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1c7e0 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20   pE->pList);.   
1c7f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c800 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
1c810 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e  nEphemeral, pFun
1c820 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c  c->iDistinct, 0,
1c830 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1c840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1c850 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
1c860 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
1c870 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  F);.      }.    
1c880 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
1c890 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67  nvoke the OP_Agg
1c8a0 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20  Finalize opcode 
1c8b0 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67  for every aggreg
1c8c0 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
1c8d0 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  in the AggInfo s
1c8e0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
1c8f0 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a  tic void finaliz
1c900 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61  eAggFunctions(Pa
1c910 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
1c920 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
1c930 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1c940 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1c950 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
1c960 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
1c970 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
1c980 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
1c990 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
1c9a0 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
1c9b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1c9c0 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70  t = pF->pExpr->p
1c9d0 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  List;.    sqlite
1c9e0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1c9f0 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e  P_AggFinal, pF->
1ca00 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c  iMem, pList ? pL
1ca10 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
1ca20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1ca30 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
1ca40 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
1ca50 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NCDEF);.  }.}../
1ca60 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
1ca70 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f  accumulator memo
1ca80 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20  ry cells for an 
1ca90 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20  aggregate based 
1caa0 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  on.** the curren
1cab0 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
1cac0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1cad0 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61  d updateAccumula
1cae0 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
1caf0 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
1cb00 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
1cb10 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1cb20 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
1cb30 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
1cb40 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
1cb50 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
1cb60 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
1cb70 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
1cb80 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
1cb90 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
1cba0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
1cbb0 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
1cbc0 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
1cbd0 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
1cbe0 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
1cbf0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
1cc00 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
1cc10 70 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  pList;.    if( p
1cc20 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
1cc30 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
1cc40 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  r;.      regAgg 
1cc50 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1cc60 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41  Range(pParse, nA
1cc70 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rg);.      sqlit
1cc80 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
1cc90 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
1cca0 2c 20 72 65 67 41 67 67 2c 20 30 29 3b 0a 20 20  , regAgg, 0);.  
1ccb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
1ccc0 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Arg = 0;.      r
1ccd0 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d  egAgg = 0;.    }
1cce0 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69  .    if( pF->iDi
1ccf0 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
1cd00 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71     addrNext = sq
1cd10 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1cd20 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73  el(v);.      ass
1cd30 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a  ert( nArg==1 );.
1cd40 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
1cd50 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69  ct(pParse, pF->i
1cd60 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
1cd70 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a  xt, 1, regAgg);.
1cd80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
1cd90 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26  ->pFunc->flags &
1cda0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
1cdb0 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43  DCOLL ){.      C
1cdc0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
1cdd0 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  0;.      struct 
1cde0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1cdf0 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Item;.      int 
1ce00 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  j;.      assert(
1ce10 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a   pList!=0 );  /*
1ce20 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d   pList!=0 if pF-
1ce30 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43  >pFunc has NEEDC
1ce40 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  OLL */.      for
1ce50 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
1ce60 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
1ce70 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
1ce80 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
1ce90 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1cea0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1ceb0 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
1cec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1ced0 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
1cee0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
1cef0 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1cf00 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
1cf10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cf20 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
1cf30 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
1cf40 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
1cf50 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
1cf60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cf70 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op4(v, OP_AggSte
1cf80 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  p, 0, regAgg, pF
1cf90 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->iMem,.        
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1cfb0 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
1cfc0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
1cfd0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1cfe0 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
1cff0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1d000 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
1d010 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
1d020 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
1d030 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1d040 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1d050 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
1d060 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
1d070 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1d080 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1d090 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
1d0a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
1d0b0 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
1d0c0 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
1d0d0 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
1d0e0 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
1d0f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1d100 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
1d110 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a  xpr, pC->iMem);.
1d120 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e    }.  pAggInfo->
1d130 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a  directMode = 0;.
1d140 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1d150 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  e code for the S
1d160 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1d170 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61  given in the p a
1d180 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  rgument.  .**.**
1d190 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
1d1a0 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
1d1b0 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70  various ways dep
1d1c0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a  ending on the.**
1d1d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1d1e0 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
1d1f0 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
1d200 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65   by argument pDe
1d210 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73  st.** as follows
1d220 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73  :.**.**     pDes
1d230 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73 75  t->eDest    Resu
1d240 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d  lt.**     ------
1d250 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
1d260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d280 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54  -----.**     SRT
1d290 5f 4f 75 74 70 75 74 20 20 20 20 20 20 47 65 6e  _Output      Gen
1d2a0 65 72 61 74 65 20 61 20 72 6f 77 20 6f 66 20 6f  erate a row of o
1d2b0 75 74 70 75 74 20 28 75 73 69 6e 67 20 74 68 65  utput (using the
1d2c0 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a   OP_ResultRow.**
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2e0 20 20 20 20 20 6f 70 63 6f 64 65 29 20 66 6f 72       opcode) for
1d2f0 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65   each row in the
1d300 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a   result set..**.
1d310 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20  **     SRT_Mem  
1d320 20 20 20 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69         Only vali
1d330 64 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  d if the result 
1d340 69 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  is a single colu
1d350 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  mn..**          
1d360 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65             Store
1d370 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   the first colum
1d380 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  n of the first r
1d390 65 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20  esult row.**    
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3b0 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65   in register pDe
1d3c0 73 74 2d 3e 69 50 61 72 6d 20 74 68 65 6e 20 61  st->iParm then a
1d3d0 62 61 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a  bandon the rest.
1d3e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1d3f0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 71 75         of the qu
1d400 65 72 79 2e 20 20 54 68 69 73 20 64 65 73 74 69  ery.  This desti
1d410 6e 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22  nation implies "
1d420 4c 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20  LIMIT 1"..**.** 
1d430 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20      SRT_Set     
1d440 20 20 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d      The result m
1d450 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ust be a single 
1d460 63 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65  column.  Store e
1d470 61 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ach.**          
1d480 20 20 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f             row o
1d490 66 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20  f result as the 
1d4a0 6b 65 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65  key in table pDe
1d4b0 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20  st->iParm. .**  
1d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4d0 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66     Apply the aff
1d4e0 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66  inity pDest->aff
1d4f0 69 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74 6f  inity before sto
1d500 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ring.**         
1d510 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75              resu
1d520 6c 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d  lts.  Used to im
1d530 70 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c  plement "IN (SEL
1d540 45 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a  ECT ...)"..**.**
1d550 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20       SRT_Union  
1d560 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
1d570 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61  ts as a key in a
1d580 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1d590 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
1d5a0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63  *.**     SRT_Exc
1d5b0 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20  ept      Remove 
1d5c0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65  results from the
1d5d0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1d5e0 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
1d5f0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62  *.**     SRT_Tab
1d600 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  le       Store r
1d610 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72  esults in tempor
1d620 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
1d630 3e 69 50 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20  >iParm..**      
1d640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
1d650 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f  his is like SRT_
1d660 45 70 68 65 6d 54 61 62 20 65 78 63 65 70 74 20  EphemTab except 
1d670 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 0a 2a  that the table.*
1d680 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1d690 20 20 20 20 20 20 69 73 20 61 73 73 75 6d 65 64        is assumed
1d6a0 20 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20 6f   to already be o
1d6b0 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  pen..**.**     S
1d6c0 52 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43  RT_EphemTab    C
1d6d0 72 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61  reate an tempora
1d6e0 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
1d6f0 69 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a  iParm and store.
1d700 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1d710 20 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c         the resul
1d720 74 20 74 68 65 72 65 2e 20 54 68 65 20 63 75 72  t there. The cur
1d730 73 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e  sor is left open
1d740 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20   after.**       
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1d760 74 75 72 6e 69 6e 67 2e 20 20 54 68 69 73 20 69  turning.  This i
1d770 73 20 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c 65  s like SRT_Table
1d780 20 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20   except that.** 
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7a0 20 20 20 20 74 68 69 73 20 64 65 73 74 69 6e 61      this destina
1d7b0 74 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65  tion uses OP_Ope
1d7c0 6e 45 70 68 65 6d 65 72 61 6c 20 74 6f 20 63 72  nEphemeral to cr
1d7d0 65 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  eate.**         
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
1d7f0 74 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a  table first..**.
1d800 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f 75  **     SRT_Corou
1d810 74 69 6e 65 20 20 20 47 65 6e 65 72 61 74 65 20  tine   Generate 
1d820 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61  a co-routine tha
1d830 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20  t returns a new 
1d840 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  row of.**       
1d850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1d860 73 75 6c 74 73 20 65 61 63 68 20 74 69 6d 65 20  sults each time 
1d870 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20  it is invoked.  
1d880 54 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a  The entry point.
1d890 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1d8a0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
1d8b0 2d 72 6f 75 74 69 6e 65 20 69 73 20 73 74 6f 72  -routine is stor
1d8c0 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 70  ed in register p
1d8d0 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a  Dest->iParm..**.
1d8e0 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74  **     SRT_Exist
1d8f0 73 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31  s      Store a 1
1d900 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
1d910 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 69 66 20  pDest->iParm if 
1d920 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20  the result.**   
1d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d940 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d 70    set is not emp
1d950 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  ty..**.**     SR
1d960 54 5f 44 69 73 63 61 72 64 20 20 20 20 20 54 68  T_Discard     Th
1d970 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73 20  row the results 
1d980 61 77 61 79 2e 20 20 54 68 69 73 20 69 73 20 75  away.  This is u
1d990 73 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a 2a  sed by SELECT.**
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9b0 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73 20       statements 
1d9c0 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 20  within triggers 
1d9d0 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70 6f  whose only purpo
1d9e0 73 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  se is.**        
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
1da00 20 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f 66   side-effects of
1da10 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a   functions..**.*
1da20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1da30 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
1da40 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
1da50 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
1da60 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
1da70 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
1da80 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
1da90 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
1daa0 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
1dab0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1dac0 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
1dad0 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
1dae0 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
1daf0 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
1db00 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
1db10 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
1db20 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
1db30 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
1db40 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
1db50 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
1db60 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
1db70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1db80 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
1db90 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
1dba0 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  d. */.  SelectDe
1dbb0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f  st *pDest      /
1dbc0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
1dbd0 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  h the query resu
1dbe0 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
1dbf0 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
1dc00 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1dc10 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ers */.  WhereIn
1dc20 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
1dc30 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73  /* Return from s
1dc40 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1dc50 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  () */.  Vdbe *v;
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dc70 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
1dc80 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
1dc90 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1dca0 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20  t isAgg;        
1dcb0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1dcc0 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
1dcd0 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
1dce0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1dcf0 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
1dd00 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
1dd10 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
1dd20 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
1dd30 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1dd40 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
1dd50 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
1dd60 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
1dd70 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1dd80 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
1dd90 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
1dda0 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
1ddb0 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
1ddc0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
1ddd0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
1dde0 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
1ddf0 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
1de00 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
1de10 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
1de20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
1de30 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
1de40 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
1de50 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  NULL */.  int is
1de60 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
1de70 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1de80 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
1de90 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
1dea0 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20   int distinct;  
1deb0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1dec0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
1ded0 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a  distinct set */.
1dee0 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
1def0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1df00 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
1df10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
1df20 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74  /.  int addrSort
1df30 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64  Index;     /* Ad
1df40 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f  dress of an OP_O
1df50 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
1df60 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67  truction */.  Ag
1df70 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20  gInfo sAggInfo; 
1df80 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1df90 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72  ion used by aggr
1dfa0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f  egate queries */
1dfb0 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20  .  int iEnd;    
1dfc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1dfd0 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20  ress of the end 
1dfe0 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
1dff0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
1e000 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e010 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1e020 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70  ion */..  db = p
1e030 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1e040 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   p==0 || db->mal
1e050 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
1e060 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
1e070 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
1e080 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1e090 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1e0a0 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
1e0b0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
1e0c0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
1e0d0 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
1e0e0 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 70  sAggInfo));..  p
1e0f0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1e100 64 65 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e  derBy;.  if( Ign
1e110 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
1e120 65 73 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70  est) ){.    p->p
1e130 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20  OrderBy = 0;..  
1e140 20 20 2f 2a 20 49 6e 20 74 68 65 73 65 20 63 61    /* In these ca
1e150 73 65 73 20 74 68 65 20 44 49 53 54 49 4e 43 54  ses the DISTINCT
1e160 20 6f 70 65 72 61 74 6f 72 20 6d 61 6b 65 73 20   operator makes 
1e170 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 74 6f  no difference to
1e180 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75   the.    ** resu
1e190 6c 74 73 2c 20 73 6f 20 72 65 6d 6f 76 65 20 69  lts, so remove i
1e1a0 74 20 69 66 20 69 74 20 77 65 72 65 20 73 70 65  t if it were spe
1e1b0 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  cified..    */. 
1e1c0 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d     assert(pDest-
1e1d0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73  >eDest==SRT_Exis
1e1e0 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ts || pDest->eDe
1e1f0 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c  st==SRT_Union ||
1e200 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65   .           pDe
1e210 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
1e220 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e  xcept || pDest->
1e230 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
1e240 72 64 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  rd);.    p->selF
1e250 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
1e260 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  inct;.  }.  sqli
1e270 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
1e280 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70  arse, p, 0);.  p
1e290 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
1e2a0 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
1e2b0 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
1e2c0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
1e2d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1e2e0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
1e2f0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d  ct_end;.  }.  p-
1e300 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
1e310 65 72 42 79 3b 0a 20 20 69 73 41 67 67 20 3d 20  erBy;.  isAgg = 
1e320 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1e330 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
1e340 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
1e350 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
1e360 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  nd;..  /* .  ** 
1e370 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65  Do not even atte
1e380 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20  mpt to generate 
1e390 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68  any code if we h
1e3a0 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  ave already seen
1e3b0 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66  .  ** errors bef
1e3c0 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
1e3d0 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20   starts..  */.  
1e3e0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1e3f0 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  >0 ) goto select
1e400 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 4f 52 44 45  _end;..  /* ORDE
1e410 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20  R BY is ignored 
1e420 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61  for some destina
1e430 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
1e440 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72  ( IgnorableOrder
1e450 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
1e460 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
1e470 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67   }..  /* Begin g
1e480 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a  enerating code..
1e490 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
1e4a0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1e4b0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
1e4c0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1e4d0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1e4e0 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
1e4f0 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
1e500 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
1e510 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1e520 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1e530 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1e540 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1e550 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d  ).  for(i=0; !p-
1e560 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61  >pPrior && i<pTa
1e570 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1e580 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
1e590 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1e5a0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
1e5b0 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  [i];.    SelectD
1e5c0 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65  est dest;.    Se
1e5d0 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74  lect *pSub = pIt
1e5e0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
1e5f0 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a   int isAggSub;..
1e600 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
1e610 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75  || pItem->isPopu
1e620 6c 61 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65  lated ) continue
1e630 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  ;..    /* Increm
1e640 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
1e650 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
1e660 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
1e670 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
1e680 20 74 72 65 65 20 72 65 66 65 72 65 64 20 74 6f   tree refered to
1e690 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61   by this, the pa
1e6a0 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65  rent select. The
1e6b0 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20   child select.  
1e6c0 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e    ** may contain
1e6d0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1e6e0 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20  s of at most.   
1e6f0 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f   ** (SQLITE_MAX_
1e700 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65  EXPR_DEPTH-Parse
1e710 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74  .nHeight) height
1e720 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a  . This is a bit.
1e730 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73      ** more cons
1e740 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65  ervative than ne
1e750 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63  cessary, but muc
1e760 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e  h easier than en
1e770 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61  forcing.    ** a
1e780 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20  n exact limit.. 
1e790 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65     */.    pParse
1e7a0 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c  ->nHeight += sql
1e7b0 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
1e7c0 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  ight(p);..    /*
1e7d0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1e7e0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63 61   the subquery ca
1e7f0 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e  n be absorbed in
1e800 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a  to the parent. *
1e810 2f 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d  /.    isAggSub =
1e820 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
1e830 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
1e840 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  !=0;.    if( fla
1e850 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
1e860 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
1e870 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20  , isAggSub) ){. 
1e880 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75       if( isAggSu
1e890 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41  b ){.        isA
1e8a0 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  gg = 1;.        
1e8b0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
1e8c0 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20  F_Aggregate;.   
1e8d0 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d     }.      i = -
1e8e0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1e8f0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1e900 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
1e910 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
1e920 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
1e930 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1e940 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64  tem->isPopulated
1e950 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1e960 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
1e970 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
1e980 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73  .      pItem->is
1e990 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20  Populated = 1;. 
1e9a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
1e9b0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1e9c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1e9d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
1e9e0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
1e9f0 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
1ea00 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
1ea10 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
1ea20 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
1ea30 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28  p->pSrc;.    if(
1ea40 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
1ea50 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
1ea60 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d     pOrderBy = p-
1ea70 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
1ea80 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20  .  }.  pEList = 
1ea90 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69  p->pEList;.#endi
1eaa0 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  f.  pWhere = p->
1eab0 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
1eac0 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
1ead0 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
1eae0 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69  >pHaving;.  isDi
1eaf0 73 74 69 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c  stinct = (p->sel
1eb00 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1eb10 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65  nct)!=0;..#ifnde
1eb20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
1eb30 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
1eb40 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
1eb50 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  re a sequence of
1eb60 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65   queries, do the
1eb70 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69   earlier ones fi
1eb80 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rst..  */.  if( 
1eb90 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
1eba0 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f   if( p->pRightmo
1ebb0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  st==0 ){.      S
1ebc0 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70  elect *pLoop, *p
1ebd0 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20  Right = 0;.     
1ebe0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
1ebf0 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74      int mxSelect
1ec00 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f  ;.      for(pLoo
1ec10 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
1ec20 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c  p=pLoop->pPrior,
1ec30 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20   cnt++){.       
1ec40 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f   pLoop->pRightmo
1ec50 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
1ec60 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70  pLoop->pNext = p
1ec70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70  Right;.        p
1ec80 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20  Right = pLoop;. 
1ec90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53       }.      mxS
1eca0 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d  elect = db->aLim
1ecb0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
1ecc0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d  COMPOUND_SELECT]
1ecd0 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53 65  ;.      if( mxSe
1ece0 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65  lect && cnt>mxSe
1ecf0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
1ed00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1ed10 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
1ed20 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f  y terms in compo
1ed30 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20  und SELECT");.  
1ed40 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1ed50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ed60 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
1ed70 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
1ed80 70 44 65 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  pDest);.  }.#end
1ed90 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74  if..  /* If writ
1eda0 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72  ing to memory or
1edb0 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65   generating a se
1edc0 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  t.  ** only a si
1edd0 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20  ngle column may 
1ede0 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
1edf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ee00 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69  MIT_SUBQUERY.  i
1ee10 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  f( checkForMulti
1ee20 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
1ee30 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c  r(pParse, pDest,
1ee40 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20   pEList->nExpr) 
1ee50 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
1ee60 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
1ee70 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73  if..  /* If poss
1ee80 69 62 6c 65 2c 20 72 65 77 72 69 74 65 20 74 68  ible, rewrite th
1ee90 65 20 71 75 65 72 79 20 74 6f 20 75 73 65 20 47  e query to use G
1eea0 52 4f 55 50 20 42 59 20 69 6e 73 74 65 61 64 20  ROUP BY instead 
1eeb0 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a  of DISTINCT..  *
1eec0 2a 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74  * GROUP BY might
1eed0 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2c 20 44   use an index, D
1eee0 49 53 54 49 4e 43 54 20 6e 65 76 65 72 20 64 6f  ISTINCT never do
1eef0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  es..  */.  if( (
1ef00 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
1ef10 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1ef20 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
1ef30 73 74 69 6e 63 74 20 26 26 20 21 70 2d 3e 70 47  stinct && !p->pG
1ef40 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 70 2d  roupBy ){.    p-
1ef50 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
1ef60 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
1ef70 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  b, p->pEList);. 
1ef80 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
1ef90 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
1efa0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
1efb0 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  F_Distinct;.    
1efc0 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  isDistinct = 0;.
1efd0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1efe0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
1eff0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
1f000 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a  his sorting.  **
1f010 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
1f020 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64   up being unused
1f030 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
1f040 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63   be .  ** extrac
1f050 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
1f060 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61  d order.  If tha
1f070 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
1f080 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f  hen the.  ** OP_
1f090 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
1f0a0 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
1f0b0 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  e changed to an 
1f0c0 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a  OP_Noop once.  *
1f0d0 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  * we figure out 
1f0e0 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
1f0f0 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65   index is not ne
1f100 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53  eded.  The addrS
1f110 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61  ortIndex.  ** va
1f120 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
1f130 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61  o facilitate tha
1f140 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
1f150 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
1f160 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
1f170 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79  eyInfo;.    pKey
1f180 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
1f190 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
1f1a0 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  e, pOrderBy);.  
1f1b0 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
1f1c0 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
1f1d0 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64  Tab++;.    p->ad
1f1e0 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
1f1f0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
1f200 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f210 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
1f220 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f240 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
1f250 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64  ->iECursor, pOrd
1f260 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30  erBy->nExpr+2, 0
1f270 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1f290 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
1f2a0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
1f2b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f2c0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20  addrSortIndex = 
1f2d0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  -1;.  }..  /* If
1f2e0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
1f2f0 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
1f300 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
1f310 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
1f320 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
1f330 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
1f340 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  emTab ){.    sql
1f350 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f360 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
1f370 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  al, pDest->iParm
1f380 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
1f390 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
1f3a0 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
1f3b0 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  /.  iEnd = sqlit
1f3c0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1f3d0 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  v);.  computeLim
1f3e0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
1f3f0 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20  se, p, iEnd);.. 
1f400 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75   /* Open a virtu
1f410 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
1f420 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
1f430 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
1f440 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20   isDistinct ){. 
1f450 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
1f460 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  Info;.    assert
1f470 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75  ( isAgg || pGrou
1f480 70 42 79 20 29 3b 0a 20 20 20 20 64 69 73 74 69  pBy );.    disti
1f490 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
1f4a0 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ab++;.    pKeyIn
1f4b0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
1f4c0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1f4d0 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
1f4e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f4f0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
1f500 65 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e 63 74  emeral, distinct
1f510 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
1f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f530 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
1f540 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
1f550 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OFF);.  }else{. 
1f560 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31     distinct = -1
1f570 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72  ;.  }..  /* Aggr
1f580 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67  egate and non-ag
1f590 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
1f5a0 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66  are handled diff
1f5b0 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28  erently */.  if(
1f5c0 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75   !isAgg && pGrou
1f5d0 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBy==0 ){.    /*
1f5e0 20 54 68 69 73 20 63 61 73 65 20 69 73 20 66 6f   This case is fo
1f5f0 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  r non-aggregate 
1f600 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2a 20 42  queries.    ** B
1f610 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
1f620 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20  e scan.    */.  
1f630 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
1f640 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
1f650 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
1f660 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79  Where, &pOrderBy
1f670 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
1f680 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
1f690 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
1f6a0 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67     /* If sorting
1f6b0 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20   index that was 
1f6c0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69  created by a pri
1f6d0 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
1f6e0 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74  ral .    ** inst
1f6f0 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70  ruction ended up
1f700 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65   not being neede
1f710 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74  d, then change t
1f720 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
1f730 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ral.    ** into 
1f740 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20  an OP_Noop..    
1f750 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53  */.    if( addrS
1f760 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70  ortIndex>=0 && p
1f770 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
1f780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1f790 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
1f7a0 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 31 29  ddrSortIndex, 1)
1f7b0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
1f7c0 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
1f7d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
1f7e0 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
1f7f0 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a  inner loop.    *
1f800 2f 0a 20 20 20 20 61 73 73 65 72 74 28 21 69 73  /.    assert(!is
1f810 44 69 73 74 69 6e 63 74 29 3b 0a 20 20 20 20 73  Distinct);.    s
1f820 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
1f830 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
1f840 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
1f850 2c 20 2d 31 2c 20 70 44 65 73 74 2c 0a 20 20 20  , -1, pDest,.   
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f870 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
1f880 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ue, pWInfo->iBre
1f890 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64  ak);..    /* End
1f8a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1f8b0 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
1f8c0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1f8d0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
1f8e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
1f8f0 73 20 69 73 20 74 68 65 20 70 72 6f 63 65 73 73  s is the process
1f900 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
1f910 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20  e queries */.   
1f920 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
1f930 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
1f940 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73  text for process
1f950 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e  ing aggregate in
1f960 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
1f970 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20   int iAMem;     
1f980 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
1f990 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74  m address for st
1f9a0 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52  oring current GR
1f9b0 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
1f9c0 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iBMem;        
1f9d0 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
1f9e0 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69  ddress for previ
1f9f0 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ous GROUP BY */.
1fa00 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67      int iUseFlag
1fa10 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ;       /* Mem a
1fa20 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66  ddress holding f
1fa30 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lag indicating t
1fa40 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20  hat at least.   
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa60 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20       ** one row 
1fa70 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  of the input to 
1fa80 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68  the aggregator h
1fa90 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  as been.        
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fab0 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ** processed */.
1fac0 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c      int iAbortFl
1fad0 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ag;     /* Mem a
1fae0 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75  ddress which cau
1faf0 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20  ses query abort 
1fb00 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
1fb10 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f     int groupBySo
1fb20 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63  rt;    /* Rows c
1fb30 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20  ome from source 
1fb40 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
1fb50 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
1fb60 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  rEnd;        /* 
1fb70 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e  End of processin
1fb80 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  g for this SELEC
1fb90 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  T */..    /* Rem
1fba0 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
1fbb0 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
1fbc0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
1fbd0 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
1fbe0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
1fbf0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
1fc00 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
1fc10 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fc30 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1fc40 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
1fc50 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1fc60 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
1fc70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
1fc80 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
1fc90 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
1fca0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
1fcb0 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
1fcc0 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
1fcd0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
1fce0 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20  pItem->iAlias = 
1fcf0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1fd00 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
1fd10 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
1fd20 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
1fd30 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
1fd40 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41         pItem->iA
1fd50 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
1fd60 7d 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20 20 2f  }.    }.. .    /
1fd70 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c  * Create a label
1fd80 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e   to jump to when
1fd90 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72   we want to abor
1fda0 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  t the query */. 
1fdb0 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c     addrEnd = sql
1fdc0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1fdd0 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  l(v);..    /* Co
1fde0 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20  nvert TK_COLUMN 
1fdf0 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47  nodes into TK_AG
1fe00 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b  G_COLUMN and mak
1fe10 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20  e entries in.   
1fe20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72   ** sAggInfo for
1fe30 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43   all TK_AGG_FUNC
1fe40 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78  TION nodes in ex
1fe50 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
1fe60 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  .    ** SELECT s
1fe70 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
1fe80 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
1fe90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
1fea0 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
1feb0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
1fec0 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
1fed0 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43  TabList;.    sNC
1fee0 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67  .pAggInfo = &sAg
1fef0 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49  gInfo;.    sAggI
1ff00 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
1ff10 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
1ff20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b  pGroupBy->nExpr+
1ff30 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49  1 : 0;.    sAggI
1ff40 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  nfo.pGroupBy = p
1ff50 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c  GroupBy;.    sql
1ff60 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1ff70 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
1ff80 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
1ff90 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
1ffa0 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72  ist(&sNC, pOrder
1ffb0 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61  By);.    if( pHa
1ffc0 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  ving ){.      sq
1ffd0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
1ffe0 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
1fff0 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
20000 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
20010 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
20020 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
20030 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
20040 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
20050 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
20060 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
20070 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
20080 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
20090 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  r->pList);.    }
200a0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
200b0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
200c0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
200d0 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20    /* Processing 
200e0 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77  for aggregates w
200f0 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20  ith GROUP BY is 
20100 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61  very different a
20110 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d  nd.    ** much m
20120 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e  ore complex than
20130 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
20140 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
20150 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
20160 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
20170 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
20180 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
20190 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
201a0 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
201b0 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
201c0 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  j1;             
201d0 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72  /* A-vs-B compar
201e0 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20  ision jump */.  
201f0 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70      int addrOutp
20200 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74  utRow;  /* Start
20210 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74   of subroutine t
20220 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65  hat outputs a re
20230 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
20240 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52    int regOutputR
20250 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ow;   /* Return 
20260 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
20270 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72   for output subr
20280 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20  outine */.      
20290 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74  int addrSetAbort
202a0 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61  ;   /* Set the a
202b0 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65  bort flag and re
202c0 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  turn */.      in
202d0 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b  t addrTopOfLoop;
202e0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
202f0 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
20300 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74      int addrSort
20310 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f  ingIdx; /* The O
20320 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
20330 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  for the sorting 
20340 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
20350 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20  nt addrReset;   
20360 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
20370 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74   for resetting t
20380 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a  he accumulator *
20390 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
203a0 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  eset;       /* R
203b0 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
203c0 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74  gister for reset
203d0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a   subroutine */..
203e0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
203f0 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20  e is a GROUP BY 
20400 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20  clause we might 
20410 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69  need a sorting i
20420 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ndex to.      **
20430 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20   implement it.  
20440 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f  Allocate that so
20450 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e  rting index now.
20460 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75    If it turns ou
20470 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
20480 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69  we do not need i
20490 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65  t after all, the
204a0 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
204b0 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20  nstruction.     
204c0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76   ** will be conv
204d0 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f  erted into a Noo
204e0 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  p.  .      */.  
204f0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
20500 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65  tingIdx = pParse
20510 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
20520 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
20530 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
20540 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29  Parse, pGroupBy)
20550 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
20560 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ingIdx = sqlite3
20570 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
20580 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
20590 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
205a0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
205b0 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
205c0 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20  gColumn, .      
205d0 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b      0, (char*)pK
205e0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
205f0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20  FO_HANDOFF);..  
20600 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
20610 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
20620 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
20630 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
20640 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
20650 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
20660 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
20670 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  m;.      iAbortF
20680 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
20690 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f  nMem;.      regO
206a0 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61  utputRow = ++pPa
206b0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
206c0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
206d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
206e0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
206f0 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61  regReset = ++pPa
20700 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
20710 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
20720 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
20730 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65  l(v);.      iAMe
20740 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
20750 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
20760 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
20770 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
20780 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
20790 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
207a0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
207b0 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
207c0 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
207d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
207e0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41  P_Integer, 0, iA
207f0 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
20800 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
20810 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c   "clear abort fl
20820 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
20830 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20840 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
20850 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
20860 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
20870 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75  , "indicate accu
20880 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29  mulator empty"))
20890 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
208a0 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
208b0 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
208c0 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
208d0 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
208e0 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
208f0 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
20900 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
20910 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
20920 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
20930 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
20940 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
20950 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
20960 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
20970 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  ormation.      *
20980 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f  * in the right o
20990 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69  rder to begin wi
209a0 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  th..      */.   
209b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
209c0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
209d0 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
209e0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57  Reset);.      pW
209f0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
20a00 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
20a10 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
20a20 65 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30 2c  e, &pGroupBy, 0,
20a30 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
20a40 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
20a50 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
20a60 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d    if( pGroupBy==
20a70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
20a80 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
20a90 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
20aa0 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
20ab0 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
20ac0 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
20ad0 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
20ae0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
20af0 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ral table will b
20b00 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
20b10 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63  celled later bec
20b20 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65  ause we still ne
20b30 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b  ed to use the pK
20b40 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a  eyInfo.        *
20b50 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f 75 70  /.        pGroup
20b60 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
20b70 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  ;.        groupB
20b80 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  ySort = 0;.     
20b90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20ba0 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69  /* Rows are comi
20bb0 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65  ng out in undete
20bc0 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57  rmined order.  W
20bd0 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20  e have to push. 
20be0 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72         ** each r
20bf0 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ow into a sortin
20c00 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61  g index, termina
20c10 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f  te the first loo
20c20 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  p,.        ** th
20c30 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65  en loop over the
20c40 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
20c50 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
20c60 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20  he output.      
20c70 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f    ** in sorted o
20c80 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a  rder.        */.
20c90 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42          int regB
20ca0 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ase;.        int
20cb0 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20   regRecord;.    
20cc0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
20cd0 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70        int nGroup
20ce0 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f  By;..        gro
20cf0 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20  upBySort = 1;.  
20d00 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d        nGroupBy =
20d10 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
20d20 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d  ;.        nCol =
20d30 20 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20   nGroupBy + 1;. 
20d40 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
20d50 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66  pBy+1;.        f
20d60 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
20d70 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
20d80 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
20d90 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
20da0 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  .iSorterColumn>=
20db0 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
20dc0 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   nCol++;.       
20dd0 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
20de0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
20df0 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
20e00 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
20e10 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
20e20 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
20e30 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
20e40 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
20e50 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20  oupBy, regBase, 
20e60 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
20e70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20e80 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41   OP_Sequence, sA
20e90 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
20ea0 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f 75 70  x,regBase+nGroup
20eb0 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  By);.        j =
20ec0 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20   nGroupBy+1;.   
20ed0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
20ee0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
20ef0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
20f00 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
20f10 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41  _col *pCol = &sA
20f20 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a  ggInfo.aCol[i];.
20f30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
20f40 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
20f50 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
20f60 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b      int r1 = j +
20f70 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
20f80 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20        int r2;.. 
20f90 20 20 20 20 20 20 20 20 20 20 20 72 32 20 3d 20             r2 = 
20fa0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
20fb0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
20fc0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fe0 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f   pCol->pTab, pCo
20ff0 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c  l->iColumn, pCol
21000 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20 30 29  ->iTable, r1, 0)
21010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21020 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20  ( r1!=r2 ){.    
21030 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21040 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21050 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29  P_SCopy, r2, r1)
21060 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
21070 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
21080 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21090 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
210a0 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
210b0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
210c0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
210d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
210e0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
210f0 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c  , regBase, nCol,
21100 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
21110 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21120 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
21130 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f  Insert, sAggInfo
21140 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67  .sortingIdx, reg
21150 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
21160 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
21170 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
21180 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
21190 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
211a0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
211b0 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  e, regBase, nCol
211c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
211d0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
211e0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
211f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21200 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e   OP_Sort, sAggIn
21210 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
21220 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  ddrEnd);.       
21230 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
21240 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22   "GROUP BY sort"
21250 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  ));.        sAgg
21260 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
21270 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  dx = 1;.      }.
21280 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61  .      /* Evalua
21290 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  te the current G
212a0 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e  ROUP BY terms an
212b0 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62  d store in b0, b
212c0 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, b2....      *
212d0 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20  * (b0 is memory 
212e0 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30  location iBMem+0
212f0 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c  , b1 is iBMem+1,
21300 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20   and so forth). 
21310 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d       ** Then com
21320 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  pare the current
21330 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
21340 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55  against the GROU
21350 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20  P BY terms.     
21360 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65   ** from the pre
21370 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e  vious row curren
21380 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30  tly stored in a0
21390 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20  , a1, a2....    
213a0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54    */.      addrT
213b0 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  opOfLoop = sqlit
213c0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
213d0 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  r(v);.      for(
213e0 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d  j=0; j<pGroupBy-
213f0 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
21400 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
21410 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
21420 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21430 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
21440 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  n, sAggInfo.sort
21450 69 6e 67 49 64 78 2c 20 6a 2c 20 69 42 4d 65 6d  ingIdx, j, iBMem
21460 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +j);.        }el
21470 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41  se{.          sA
21480 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64  ggInfo.directMod
21490 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
214a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
214b0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
214c0 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69  y->a[j].pExpr, i
214d0 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
214e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
214f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21500 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
21510 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20  , iAMem, iBMem, 
21520 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
21530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21540 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
21550 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
21560 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a  EYINFO);.      j
21570 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
21580 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
21590 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
215a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
215b0 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31  p, j1+1, 0, j1+1
215c0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
215d0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
215e0 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68  runs whenever th
215f0 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67  e GROUP BY chang
21600 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61  es..      ** Cha
21610 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55  nges in the GROU
21620 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65  P BY are detecte
21630 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
21640 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20  s code.      ** 
21650 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65  block.  If there
21660 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73   were no changes
21670 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  , this block is 
21680 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  skipped..      *
21690 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
216a0 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72  code copies curr
216b0 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72  ent group by ter
216c0 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e  ms in b0,b1,b2,.
216d0 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  ...      ** over
216e0 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49   to a0,a1,a2.  I
216f0 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65  t then calls the
21700 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
21710 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ne.      ** and 
21720 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65  resets the aggre
21730 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
21740 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72   registers in pr
21750 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20  eparation.      
21760 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ** for the next 
21770 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a  GROUP BY batch..
21780 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
21790 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
217a0 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d  ve(pParse, iBMem
217b0 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iAMem, pGroupB
217c0 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  y->nExpr);.     
217d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
217e0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
217f0 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
21800 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
21810 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
21820 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20  (v, "output one 
21830 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71  row"));.      sq
21840 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21850 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62  v, OP_IfPos, iAb
21860 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64  ortFlag, addrEnd
21870 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
21880 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20  ment((v, "check 
21890 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
218a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
218b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
218c0 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
218d0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
218e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
218f0 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74  "reset accumulat
21900 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
21910 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
21920 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
21930 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
21940 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
21950 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
21960 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
21970 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
21980 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
21990 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
219a0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
219b0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
219c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
219d0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
219e0 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 1, iUseFlag);.
219f0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
21a00 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
21a10 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
21a20 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
21a30 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
21a40 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
21a50 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
21a60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
21a70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21a80 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e   OP_Next, sAggIn
21a90 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
21aa0 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20  ddrTopOfLoop);. 
21ab0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21ac0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
21ad0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
21ae0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21af0 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
21b00 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20  addrSortingIdx, 
21b10 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
21b20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65     /* Output the
21b30 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65   final row of re
21b40 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sult.      */.  
21b50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21b60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
21b70 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
21b80 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
21b90 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
21ba0 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66  nt((v, "output f
21bb0 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20  inal row"));..  
21bc0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72      /* Jump over
21bd0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73   the subroutines
21be0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21bf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21c00 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
21c10 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20   addrEnd);..    
21c20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
21c30 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
21c40 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65  outputs a single
21c50 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
21c60 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e  lt.      ** set.
21c70 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e    This subroutin
21c80 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74  e first looks at
21c90 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20   the iUseFlag.  
21ca0 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20  If iUseFlag.    
21cb0 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61    ** is less tha
21cc0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
21cd0 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ro, the subrouti
21ce0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
21cf0 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  If.      ** the 
21d00 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73  processing calls
21d10 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74   for the query t
21d20 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75  o abort, this su
21d30 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
21d40 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  * increments the
21d50 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f   iAbortFlag memo
21d60 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ry location befo
21d70 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a  re returning in.
21d80 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
21d90 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c  o signal the cal
21da0 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20  ler to abort..  
21db0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
21dc0 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69  rSetAbort = sqli
21dd0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
21de0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
21df0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21e00 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
21e10 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
21e20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
21e30 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66  (v, "set abort f
21e40 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
21e50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
21e60 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
21e70 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
21e80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
21e90 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
21ea0 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
21eb0 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
21ec0 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
21ed0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
21ee0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21ef0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
21f00 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64  os, iUseFlag, ad
21f10 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a  drOutputRow+2);.
21f20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
21f30 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72  t((v, "Groupby r
21f40 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20  esult generator 
21f50 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a  entry point"));.
21f60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21f70 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
21f80 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
21f90 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  ow);.      final
21fa0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
21fb0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
21fc0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  o);.      if( pH
21fd0 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  aving ){.       
21fe0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
21ff0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
22000 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  ing, addrOutputR
22010 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  ow+1, SQLITE_JUM
22020 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
22030 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  }.      selectIn
22040 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
22050 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
22060 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20   0, pOrderBy,.  
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22080 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20 70 44      distinct, pD
22090 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
220a0 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f             addrO
220b0 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72  utputRow+1, addr
220c0 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20  SetAbort);.     
220d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
220e0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
220f0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
22100 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
22110 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70  t((v, "end group
22120 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
22130 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
22140 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
22150 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
22160 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75  l reset the grou
22170 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72  p-by accumulator
22180 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22190 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
221a0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52  veLabel(v, addrR
221b0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73  eset);.      res
221c0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
221d0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
221e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
221f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
22200 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74  Return, regReset
22210 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f  );.     .    } /
22220 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79  * endif pGroupBy
22230 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20   */.    else {. 
22240 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
22250 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20  MinMax = 0;.    
22260 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c    ExprList *pDel
22270 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 38 20 66   = 0;.      u8 f
22280 6c 61 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  lag;..      /* C
22290 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72  heck if the quer
222a0 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  y is of one of t
222b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
222c0 6d 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ms:.      **.   
222d0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
222e0 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  in(x) FROM .... 
222f0 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
22300 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   max(x) FROM ...
22310 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
22320 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
22330 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69  n ask the code i
22340 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74  n where.c to att
22350 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73  empt to sort res
22360 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 61 73  ults.      ** as
22370 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   if there was an
22380 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72   "ORDER ON x" or
22390 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53   "ORDER ON x DES
223a0 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20  C" clause. .    
223b0 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20    ** If where.c 
223c0 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75  is able to produ
223d0 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65  ce results sorte
223e0 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c  d in this order,
223f0 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   then.      ** a
22400 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20  dd vdbe code to 
22410 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
22420 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70   processing loop
22430 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20   after the .    
22440 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61    ** first itera
22450 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20  tion (since the 
22460 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
22470 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a  of the loop is .
22480 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74        ** guarant
22490 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  eed to operate o
224a0 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74  n the row with t
224b0 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61  he minimum or ma
224c0 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 2a 2a 20  ximum .      ** 
224d0 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20  value of x, the 
224e0 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65  only row require
224f0 64 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  d)..      **.   
22500 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20     ** A special 
22510 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73  flag must be pas
22520 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
22530 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c  ereBegin() to sl
22540 69 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20  ightly.      ** 
22550 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 75 72  modify behaviour
22560 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
22570 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
22580 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20   + If the query 
22590 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e  is a "SELECT min
225a0 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c  (x)", then the l
225b0 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20  oop coded by.   
225c0 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e     **     where.
225d0 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65  c should not ite
225e0 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61  rate over any va
225f0 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c  lues with a NULL
22600 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20   value.      ** 
22610 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20      for x..     
22620 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b   **.      **   +
22630 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63   The optimizer c
22640 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28  ode in where.c (
22650 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64  the thing that d
22660 65 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20  ecides which.   
22670 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20     **     index 
22680 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73  or indices to us
22690 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20  e) should place 
226a0 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f  a different prio
226b0 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 2a  rity on .      *
226c0 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67  *     satisfying
226d0 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20   the 'ORDER BY' 
226e0 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64  clause than it d
226f0 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73  oes in other cas
22700 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  es..      **    
22710 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61   Refer to code a
22720 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77  nd comments in w
22730 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69  here.c for detai
22740 6c 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ls..      */.   
22750 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78     flag = minMax
22760 51 75 65 72 79 28 70 29 3b 0a 20 20 20 20 20 20  Query(p);.      
22770 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20  if( flag ){.    
22780 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d      pDel = pMinM
22790 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ax = sqlite3Expr
227a0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
227b0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
227c0 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  r->pList);.     
227d0 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26     if( pMinMax &
227e0 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
227f0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
22800 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73   pMinMax->a[0].s
22810 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21  ortOrder = flag!
22820 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
22830 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20  IN ?1:0;.       
22840 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
22850 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f  .pExpr->op = TK_
22860 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
22870 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
22880 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75   /* This case ru
22890 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67  ns if the aggreg
228a0 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50  ate has no GROUP
228b0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65   BY clause.  The
228c0 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  .      ** proces
228d0 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d  sing is much sim
228e0 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65  pler since there
228f0 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   is only a singl
22900 65 20 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f  e row.      ** o
22910 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  f output..      
22920 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  */.      resetAc
22930 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
22940 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
22950 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
22960 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
22970 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
22980 20 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61   pWhere, &pMinMa
22990 78 2c 20 66 6c 61 67 2c 20 30 29 3b 0a 20 20 20  x, flag, 0);.   
229a0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
229b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
229c0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
229d0 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
229e0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
229f0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
22a00 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
22a10 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
22a20 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
22a30 69 66 28 20 21 70 4d 69 6e 4d 61 78 20 26 26 20  if( !pMinMax && 
22a40 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  flag ){.        
22a50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22a60 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
22a70 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
22a80 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
22a90 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20  mment((v, "%s() 
22aa0 62 79 20 69 6e 64 65 78 22 2c 28 66 6c 61 67 3d  by index",(flag=
22ab0 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
22ac0 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29  IN?"min":"max"))
22ad0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22ae0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
22af0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
22b00 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
22b10 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
22b20 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70  ggInfo);.      p
22b30 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
22b40 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
22b50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22b60 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
22b70 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
22b80 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55  drEnd, SQLITE_JU
22b90 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
22ba0 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49   }.      selectI
22bb0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
22bc0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30   p, p->pEList, 0
22bd0 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20  , 0, 0, -1, .   
22be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bf0 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e     pDest, addrEn
22c00 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20  d, addrEnd);..  
22c10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
22c20 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
22c30 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  el);.    }.    s
22c40 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
22c50 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
22c60 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
22c70 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
22c80 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49  query */..  /* I
22c90 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
22ca0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
22cb0 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
22cc0 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
22cd0 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
22ce0 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
22cf0 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
22d00 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
22d10 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  By ){.    genera
22d20 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
22d30 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d  e, p, v, pEList-
22d40 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
22d50 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68    }..  /* Jump h
22d60 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73  ere to skip this
22d70 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71   query.  */.  sq
22d80 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
22d90 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a  Label(v, iEnd);.
22da0 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
22db0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
22dc0 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
22dd0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
22de0 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
22df0 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
22e00 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
22e10 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
22e20 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
22e30 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
22e40 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
22e50 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
22e60 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
22e70 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
22e80 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f  select_end:..  /
22e90 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
22ea0 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c  n names if resul
22eb0 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
22ec0 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75   are to be outpu
22ed0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  t..  */.  if( rc
22ee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
22ef0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
22f00 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67  _Output ){.    g
22f10 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
22f20 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
22f30 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
22f40 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  }..  sqlite3DbFr
22f50 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
22f60 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
22f70 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49  DbFree(db, sAggI
22f80 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65  nfo.aFunc);.  re
22f90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
22fa0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
22fb0 45 42 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a  EBUG)./*.*******
22fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23000 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
23010 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69  following code i
23020 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
23030 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
23040 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 64 65   only.  The code
23050 0a 2a 2a 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  .** that follows
23060 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
23070 20 69 6e 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64   in normal build
23080 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  s..**.** These r
23090 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
230a0 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 74 68   to print out th
230b0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c  e content of all
230c0 20 6f 72 20 70 61 72 74 20 6f 66 20 61 20 0a 2a   or part of a .*
230d0 2a 20 70 61 72 73 65 20 73 74 72 75 63 74 75 72  * parse structur
230e0 65 73 20 73 75 63 68 20 61 73 20 53 65 6c 65 63  es such as Selec
230f0 74 20 6f 72 20 45 78 70 72 2e 20 20 53 75 63 68  t or Expr.  Such
23100 20 70 72 69 6e 74 6f 75 74 73 20 61 72 65 20 75   printouts are u
23110 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c  seful.** for hel
23120 70 69 6e 67 20 74 6f 20 75 6e 64 65 72 73 74 61  ping to understa
23130 6e 64 20 77 68 61 74 20 69 73 20 68 61 70 70 65  nd what is happe
23140 6e 69 6e 67 20 69 6e 73 69 64 65 20 74 68 65 20  ning inside the 
23150 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a  code generator.*
23160 2a 20 64 75 72 69 6e 67 20 74 68 65 20 65 78 65  * during the exe
23170 63 75 74 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65  cution of comple
23180 78 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  x SELECT stateme
23190 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  nts..**.** These
231a0 20 72 6f 75 74 69 6e 65 20 61 72 65 20 6e 6f 74   routine are not
231b0 20 63 61 6c 6c 65 64 20 61 6e 79 77 68 65 72 65   called anywhere
231c0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
231d0 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20   normal.** code 
231e0 62 61 73 65 2e 20 20 54 68 65 6e 20 61 72 65 20  base.  Then are 
231f0 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 63  intended to be c
23200 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
23210 6e 20 74 68 65 20 64 65 62 75 67 67 65 72 0a 2a  n the debugger.*
23220 2a 20 6f 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72  * or from tempor
23230 61 72 79 20 22 70 72 69 6e 74 66 22 20 73 74 61  ary "printf" sta
23240 74 65 6d 65 6e 74 73 20 69 6e 73 65 72 74 65 64  tements inserted
23250 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a   for debugging..
23260 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
23270 72 69 6e 74 45 78 70 72 28 45 78 70 72 20 2a 70  rintExpr(Expr *p
23280 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  ){.  if( p->toke
23290 6e 2e 7a 20 26 26 20 70 2d 3e 74 6f 6b 65 6e 2e  n.z && p->token.
232a0 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  n>0 ){.    sqlit
232b0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
232c0 25 2e 2a 73 22 2c 20 70 2d 3e 74 6f 6b 65 6e 2e  %.*s", p->token.
232d0 6e 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a  n, p->token.z);.
232e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
232f0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23300 22 28 25 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20  "(%d", p->op);. 
23310 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66   }.  if( p->pLef
23320 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
23330 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29  DebugPrintf(" ")
23340 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
23350 6e 74 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 29  ntExpr(p->pLeft)
23360 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
23370 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  Right ){.    sql
23380 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23390 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  " ");.    sqlite
233a0 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 52  3PrintExpr(p->pR
233b0 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ight);.  }.  sql
233c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
233d0 22 29 22 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ")");.}.void sql
233e0 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
233f0 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t(ExprList *pLis
23400 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  t){.  int i;.  f
23410 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
23420 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
23430 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
23440 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pr(pList->a[i].p
23450 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 69  Expr);.    if( i
23460 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20  <pList->nExpr-1 
23470 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
23480 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20 22  DebugPrintf(", "
23490 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76  );.    }.  }.}.v
234a0 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
234b0 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70  Select(Select *p
234c0 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20  , int indent){. 
234d0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
234e0 6e 74 66 28 22 25 2a 73 53 45 4c 45 43 54 28 25  ntf("%*sSELECT(%
234f0 70 29 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  p) ", indent, ""
23500 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  , p);.  sqlite3P
23510 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  rintExprList(p->
23520 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
23530 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
23540 6e 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  n");.  if( p->pS
23550 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  rc ){.    char *
23560 7a 50 72 65 66 69 78 3b 0a 20 20 20 20 69 6e 74  zPrefix;.    int
23570 20 69 3b 0a 20 20 20 20 7a 50 72 65 66 69 78 20   i;.    zPrefix 
23580 3d 20 22 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f  = "FROM";.    fo
23590 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63  r(i=0; i<p->pSrc
235a0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
235b0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
235c0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
235d0 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b   &p->pSrc->a[i];
235e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
235f0 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 22  bugPrintf("%*s "
23600 2c 20 69 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65  , indent+6, zPre
23610 66 69 78 29 3b 0a 20 20 20 20 20 20 7a 50 72 65  fix);.      zPre
23620 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  fix = "";.      
23630 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
23640 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
23650 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23660 28 22 28 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ("(\n");.       
23670 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c   sqlite3PrintSel
23680 65 63 74 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65  ect(pItem->pSele
23690 63 74 2c 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a  ct, indent+10);.
236a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
236b0 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 29  ebugPrintf("%*s)
236c0 22 2c 20 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29  ", indent+8, "")
236d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
236e0 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29  ( pItem->zName )
236f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23700 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73  3DebugPrintf("%s
23710 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ", pItem->zName)
23720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23730 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20  if( pItem->pTab 
23740 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23750 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
23760 74 61 62 6c 65 3a 20 25 73 29 22 2c 20 70 49 74  table: %s)", pIt
23770 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
23780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23790 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
237a0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
237b0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
237c0 22 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d  " AS %s", pItem-
237d0 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  >zAlias);.      
237e0 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70 2d  }.      if( i<p-
237f0 3e 70 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b  >pSrc->nSrc-1 ){
23800 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23810 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 22 29  DebugPrintf(",")
23820 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23830 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23840 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  tf("\n");.    }.
23850 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68    }.  if( p->pWh
23860 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ere ){.    sqlit
23870 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
23880 2a 73 20 57 48 45 52 45 20 22 2c 20 69 6e 64 65  *s WHERE ", inde
23890 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
238a0 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
238b0 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
238c0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
238d0 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ("\n");.  }.  if
238e0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  ( p->pGroupBy ){
238f0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
23900 67 50 72 69 6e 74 66 28 22 25 2a 73 20 47 52 4f  gPrintf("%*s GRO
23910 55 50 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c  UP BY ", indent,
23920 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
23930 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70  3PrintExprList(p
23940 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
23950 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23960 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
23970 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20   if( p->pHaving 
23980 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
23990 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 48  bugPrintf("%*s H
239a0 41 56 49 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c  AVING ", indent,
239b0 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
239c0 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 48  3PrintExpr(p->pH
239d0 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
239e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
239f0 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
23a00 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
23a10 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23a20 72 69 6e 74 66 28 22 25 2a 73 20 4f 52 44 45 52  rintf("%*s ORDER
23a30 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22   BY ", indent, "
23a40 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
23a50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  rintExprList(p->
23a60 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73  pOrderBy);.    s
23a70 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23a80 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f  f("\n");.  }.}./
23a90 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72  * End of the str
23aa0 75 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69  ucture debug pri
23ab0 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a  nting code.*****
23ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23b00 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
23b10 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
23b20 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
23b30 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
23b40 29 20 2a 2f 0a                                   ) */.